데이터 분석/SQL

[쉽게 쓴 SQL] ANY 그리고 IN, ALL

참치바나나 2020. 11. 21. 20:29

(연산자) 서브 쿼리의 값의 집합과 비교할 수 있다.

WHERE <값> <비교 연산자> ANY <서브쿼리>

영화 분류별, 가장 긴 상영시간은?

SELECT DISTINCT 
	max(f2.length)
FROM
	film f2 ,
	film_category fc
WHERE
	f2.film_id = fc.film_id
GROUP BY
	fc.category_id
ORDER BY
	max ;

결과로 [178,181,183,184,185]의 집합이 나온다. (중복 제거 시)

 

영화 분류별로 상영시간이 가장 긴 영화보다 상영시간이 같거나 긴 영화는? - ANY 

ANY는 집합 중, 하나라도 만족하면 OK

SELECT
	f.title ,
	f.length
FROM
	film f
WHERE
	f.length >= ANY (
	SELECT
		max(length)
	FROM
		film f2 , film_category fc
	WHERE
		f2.film_id = fc.film_id
	GROUP BY
		fc.category_id )
ORDER BY
	f.length
;

위의 쿼리를 그대로 서브 쿼리로 작성 시, 상영시간이 178보다 긴 모든 영화를 찾게 된다. 결과 집합이[178,181,183,184,185]이었기 때문에 ANY를 사용할 경우 가작 작은 178보다 크거나 같은 모든 영화를 반환

 

영화 분류별로 상영시간이 가장 긴 영화와 상영시간이 같은 영화는? - IN

SELECT
	f.title ,
	f.length
FROM
	film f
WHERE
	f.length = ANY (
	SELECT
		max(length)
	FROM
		film f2 , film_category fc
	WHERE
		f2.film_id = fc.film_id
	GROUP BY
		fc.category_id )
ORDER BY
	f.length ;

집합 중, 하나라도 만족하면 OK, 즉, 영화 시간이 178,181,183,184,185인 영화를 찾게 된다.

 ** '= ANY'가 IN과 기능이 같고, 의미가 IN이 더 직관적이므로 웬만해선 IN을 써준다.

 

영화 분류별로 상영시간이 가장 긴 영화보다 상영시간이 같거나 긴 영화는? - ALL

ALL은 집합의 모든 조건에 맞아야 함.

SELECT
	f.title ,
	f.length
FROM
	film f
WHERE
	f.length >= ALL (
	SELECT
		max(length)
	FROM
		film f2 , film_category fc
	WHERE
		f2.film_id = fc.film_id
	GROUP BY
		fc.category_id )
ORDER BY
	f.length
;

여기서는 영화 시간이 185와 같거나 긴 영화를 찾게 된다. 왜냐하면 영화 시간이 178,181,183,184,185보다 긴 모든 조건을 만족.

'데이터 분석 > SQL' 카테고리의 다른 글

[쉽게 쓴 SQL] INSERT 구문  (0) 2020.11.23
[쉽게 쓴 SQL] EXISTS  (0) 2020.11.21
[쉽게 쓴 SQL] 서브쿼리란?  (0) 2020.11.09
[쉽게 쓴 SQL] EXCEPT  (0) 2020.11.08
[쉽게 쓴 SQL] INTERSECT  (0) 2020.11.08