저장을 습관화
SQL - ANY, ALL 본문
ANY와 ALL 연산자는 하나의 컬럼의 값과 다른 값의 범위를 비교할 수 있다.
1. ANY
결과를 부울 값으로 반환한다.
하위 쿼리 값 중 하나라도 조건을 충족한다면 참을 반환한다.
연산자는 비교 연산자여야 한다. (=, <>, !=, >, >=, <, <=)
ANY는 범위 내의 값 중 하나의 연산이라도 참이면 참을 반환한다.
2. ALL
결과를 부울 값으로 반환한다.
모든 하위 쿼리 값이 조건을 충족한다면 참을 반환한다.
select, where, having 문과 함께 쓰인다.
ALL은 범위 내의 값의 모든 연산이 참이어야 참을 반환한다.
예시 테이블 Products
ProductID | ProductName | SupplierID | CategoryID | Unit | Price |
1 | Chais | 1 | 1 | 10 boxes x 20 bags | 18 |
2 | Chang | 1 | 1 | 24 - 12 oz bottles | 19 |
3 | Aniseed Syrup | 1 | 2 | 12 - 550 ml bottles | 10 |
4 | Chef Anton's Cajun Seasoning | 2 | 2 | 48 - 6 oz jars | 22 |
5 | Chef Anton's Gumbo Mix | 2 | 2 | 36 boxes | 21.35 |
6 | Grandma's Boysenberry Spread | 3 | 2 | 12 - 8 oz jars | 25 |
7 | Uncle Bob's Organic Dried Pears | 3 | 7 | 12 - 1 lb pkgs. | 30 |
8 | Northwoods Cranberry Sauce | 3 | 2 | 12 - 12 oz jars | 40 |
9 | Mishi Kobe Niku | 4 | 6 | 18 - 500 g pkgs. | 97 |
예시 테이블 OrderDetails
OrderDetailID | OrderID | ProductID | Quantity |
1 | 10248 | 11 | 12 |
2 | 10248 | 42 | 10 |
3 | 10248 | 72 | 5 |
4 | 10249 | 14 | 9 |
5 | 10249 | 51 | 40 |
6 | 10250 | 41 | 10 |
7 | 10250 | 51 | 35 |
8 | 10250 | 65 | 15 |
9 | 10251 | 22 | 6 |
10 | 10251 | 57 | 15 |
ANY 예시 1) OrderDetails 테이블에서 Quantity 컬럼이 10인 레코드를 찾아 ProductName을 나열한다.
하위 쿼리 - OrderDetails 테이블의 Quantity 컬럼의 값이 10인 레코드들의 ProductID 목록을 반환한다.
상위 쿼리 - 하위 쿼리의 결과 목록을 가져와 Products 테이블의 ProductID와 일치하는 레코드의 ProductName을 출력한다.
select ProductName
from Products
where ProductID = ANY
(select ProductID
from OrderDetails
where Quantity = 10)
이하 생략..
ANY 예시 2) OrderDetails 테이블에서 Quantity 컬럼이 99보다 큰 레코드를 찾아 ProductName을 나열한다.
하위 쿼리 - OrderDetails 테이블의 Quantity 컬럼의 값이 99보다 큰 레코드들의 ProductID 목록을 반환한다.
상위 쿼리 - 하위 쿼리의 결과 목록을 가져와 Products 테이블의 ProductID와 일치하는 레코드의 ProductName을 출력한다.
select ProductName
from Products
where ProductID = ANY
(select ProductID
from OrderDetails
where Quantity > 99)
ANY 예시 3) OrderDetails 테이블에서 Quantity 컬럼이 1000보다 큰 레코드를 찾아 ProductName을 나열한다.
하위 쿼리 - OrderDetails 테이블의 Quantity 컬럼의 값이 1000보다 큰 레코드들의 ProductID 목록을 반환한다.
상위 쿼리 - 하위 쿼리의 결과 목록을 가져와 Products 테이블의 ProductID와 일치하는 레코드의 ProductName을 출력한다.
select ProductName
from Products
where ProductID = ANY
(select ProductID
from OrderDetails
where Quantity > 1000)
ALL 예시 1) Products 테이블의 모든 레코드의 ProductName을 출력한다.
조건을 담당하는 where가 참이니 아무런 조건을 넣지 않은 것과 같다.
select ALL ProductName
from Products
where true
이하 생략..
ALL 예시 2)
하위 컬럼 - OrderDetails 테이블의 Quantity 컬럼의 값이 10인 레코드의 ProductID를 반환한다.
하지만 이 쿼리는 ALL 문에 묶여 있는 상태이고, OrderDetails 테이블에서는 Quantity의 값이 10이 아닌 레코드도 존재한다.
그렇기에 하위 컬럼은 False를 반환한다.
상위 컬럼 - 하위 컬럼에서 False를 반환받았으므로, 상위 컬럼의 조건 Where도 False가 되었다.
아무런 레코드도 반환하지 못한다.
select ALL ProductName
from Products
where ProductID = ALL
(select ProductID
from OrderDetails
Where Quantity = 10)
'공부 > 데이터베이스' 카테고리의 다른 글
SQL - INNER JOIN (0) | 2023.12.08 |
---|---|
SQL - JOINS (0) | 2023.12.08 |
SQL - GROUP BY, HAVING, EXISTS (0) | 2023.12.04 |
SQL - UNION (0) | 2023.12.03 |
SQL - ORDER BY, IN, BETWEEN, Aliases (0) | 2023.12.03 |