반응형
1. 서브 쿼리란?
- SQL 문 내에서 Main 쿼리가 아닌 하위에 존재하는 쿼리
- 서브 쿼리를 활용해 다양한 결과 도출 가능
2. 서브 쿼리 종류
인라인 뷰(Inline View)
- From 절에 위치하여 하나의 Table 용도로 사용되는 서브 쿼리
스칼라 서브쿼리(Scalar Sub Query)
- 칼럼절에 위치하여 하나의 컬럼 용도로 사용되는 서브 쿼리
중첩 서브쿼리(일반 서브쿼리)
- where 절에 위치하여 하나의 변수 용도로 사용되는 서브쿼리
-- ㄱ) 인라인 뷰
SELECT *
FROM PRODUCT A,
( SELECT AVG(PRICE) AS AVG_PRICE FROM PRODUCT ) B
WHERE A.PRICE > B.AVG_PRICE;
-- ㄴ) 스칼라 서브 쿼리
SELECT *, ( SELECT AVG(PRICE) FROM PRODUCT) AS AVG_PRICE
FROM PRODUCT A
WHERE A.PRICE > A.AVG_PRICE
-- ㄷ) 중첩 서브 쿼리
SELECT *
FROM PRODUCT
WHERE PRICE > (SELECT AVG(RENTAL_RATE) FROM PRODUCT)
3. 서브 쿼리 연산자
- 서브 쿼리 결과가 1건 이상일 때 사용하는 연산자
- 종류
이름 | 내용 |
---|---|
ANY | 서브 쿼리 결과 중 하나라도 만족하면 조건 성립 |
ALL | 서브 쿼리 결과의 모든 값이 만족해야 조건 성립 |
IN | 서브 쿼리 결과에 포함되는지 확인 |
EXISTS | 서브 쿼리 결과에 특정 집합이 존재하는지 확인 |
3.1 ANY 연산자
- 서브 쿼리 결과 중 하나라도 만족하면 조건 성립
- 예제 1)
- 영화 분류별 최대 상영시간 집합 추출
- 상영시간이 상기 집합 중 하나라도 크거나 같은 영화 출력
SELECT TITLE, LENGTH FROM FILM
WHERE LENGTH >= ANY
( SELECT DISTINCT MAX(LENGTH)
FROM FILM A INNER JOIN FILM_CATEGORY B
ON A.FILM_ID = B.FILM_ID
GROUP BY B.CATEGORY_ID
)
-- 서브 쿼리 결과 집합은
-- 178, 181, 183, 184, 185 이다.
-- LENGTH가 상기 집합 중 하나의 값 만이라도 크거나 같으면 참
-- 180의 경우 178보다 크므로 참
-- 170의 경우 아무 데이터도 크지 않으므로 거짓
- 예제 2)
- 영화 분류별 최대 상영시간 집합 추출
- 상영시간이 상기 집합 중 하나라도 같은 영화 출력
- = ANY의 경우 IN과 같다.
SELECT TITLE, LENGTH FROM FILM
WHERE LENGTH = ANY
( SELECT DISTINCT MAX(LENGTH)
FROM FILM A INNER JOIN FILM_CATEGORY B
ON A.FILM_ID = B.FILM_ID
GROUP BY B.CATEGORY_ID
)
-- 서브 쿼리 결과 집합은
-- 178, 181, 183, 184, 185 이다.
-- LENGTH가 상기 집합 중 하나의 값 만이라도 같으면 참
-- 178의 경우 178과 동일하므로 참
-- 179의 경우 같은 데이터가 없으므로 거짓
3.2 ALL 연산자
- 서브 쿼리 결과의 모든 값이 만족해야 조건 성립
- 예제 1)
- 영화 분류별 최대 상영시간 집합 추출
- 상영시간이 상기 집합의 모든 데이터 보다 크거나 같은 영화 출력
SELECT TITLE, LENGTH FROM FILM
WHERE LENGTH >= ALL
( SELECT DISTINCT MAX(LENGTH)
FROM FILM A INNER JOIN FILM_CATEGORY B
ON A.FILM_ID = B.FILM_ID
GROUP BY B.CATEGORY_ID
)
-- 서브 쿼리 결과 집합은
-- 178, 181, 183, 184, 185 이다.
-- LENGTH가 상기 집합의 모든 데이터보다 크거나 같으면 참
-- 185의 경우 모든 데이터 보다 크거나 같으므로 참
-- 180의 경우 178보다 크지만 181보다 작으므로 거짓
3.3 EXISTS 연산자
- 서브 쿼리 결과에 특정 집합이 존재하는지 확인
- 동작 중 조건에 만족하는 데이터 발견 시 동작을 멈추므로 속도 빠름
- 예제 1)
- 고객중에서 11불을 초과한 지불내역이 있는 고객 추출
SELECT FIRST_NAME, LAST_NAME
FROM CUSTOMER C
WHERE EXISTS (
SELECT 1
FROM PAYMENT P
WHERE P.CUSTOMER_ID = C.CUSTOMER_ID
AND P.AMOUNT > 11
)
ORDER BY FIRST_NAME, LAST_NAME;
# 참고
반응형
'데이터 분석 > SQL' 카테고리의 다른 글
[SQL] 8. 데이터 EXPORT/IMPORT (0) | 2021.05.23 |
---|---|
[SQL] 7. 데이터 조작(INSERT, UPDATE, DELETE) (0) | 2021.05.23 |
[SQL] 5. 집합 연산자 (0) | 2021.04.19 |
[SQL] 4. 분석 함수 (0) | 2021.04.05 |
[SQL] 3. 데이터 집계(Group by) (0) | 2021.04.01 |