저장을 습관화

SQL - ANY, ALL 본문

공부/데이터베이스

SQL - ANY, ALL

ctrs 2023. 12. 7. 23:14

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