(연산자) 서브 쿼리의 값의 집합과 비교할 수 있다.
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 |