SQL
[SQL] subquery 종류 및 사용법 정리
ollive
2024. 7. 16. 19:39
서브쿼리란?
- 쿼리안에 들어가는 쿼리를 이다.
- SELECT, FROM, WHERE, HAVING, ORDER BY 등에 사용가능하다.
- 외부쿼리와 내부쿼리로 구분되어 내부쿼리(서브쿼리)가 실행된 후, 외부쿼리가 실행된다.
사용하는 이유?
- 쿼리를 구조화 시켜 각 부분이 명확하게 구분된다.
- 복잡한 구조를 가독성 좋게 만들어 준다.
1. SELECT : SCALAR SUBQUERY
- SELECT 에 오는 서브쿼리
- 한번에 한 가지레코드만 처리한다. 두개 이상의 레코드는 처리하지 못한다.
- 일치하는 값이 없으면 NULL을 반환한다.
- ORDER BY를 사용할 수 없다.
예시)
WITH RENT AS(SELECT car_id
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE '2022-10-16' BETWEEN start_date AND end_date)
SELECT DISTINCT car_id
,IF (car_id in (table rent), '대여중','대여 가능') AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
ORDER BY 1 DESC
* 가져오는 행이 여러개일 경우 = 이 아니라 IN을 사용한다.
2. FROM : IN LINE SUBQUERY= IN LINE VIEW
- FROM 에 오는 서브쿼리
- 인라인 뷰에서 SELECT로 가져온 COLUMN만 사용가능하다
- 서브쿼리의 결과를 임시적으로 테이블(derived table)처럼 사용할 수 있다.
- 하나의 값을 반환할 수도 있고 하나의 COLUMN에 여러 행을 반환할 수도 있고, 하나의 테이블을 반환한 수도 있다.
- 전체 테이블과 비교하는 것보다 데이터량이 적어서 속도가 빠르다.
- 사용한 후에 Alias를 필수로 사용하여 구분한다.
예시) 'milk'와 ' yogurt' 가 모두 담긴 cart_id 구하기
SELECT CART_ID
-- 우유와 요거트만 있는 행을 추출하여 테이블처럼 사용함
FROM
(SELECT CART_ID, NAME
FROM CART_PRODUCTS
WHERE NAME LIKE '%YOGURT%'
UNION
SELECT CART_ID, NAME
FROM CART_PRODUCTS
WHERE NAME LIKE '%MILK%'
) A
GROUP BY CART_ID
HAVING COUNT(CART_ID) > 1
ORDER BY CART_ID
3.WHERE : 중첩 서브쿼리
- WHERE 에서 사용하는 서브쿼리
- 단일행 서브쿼리 : 서브쿼리의 결과가 단일행
- 비교연산자를 사용하여 값을 가져온다.
- 복수행 서브쿼리 : 서브쿼리의 결과가 복수행(2개 이상)
- 다중행 연산자를 사용하여 값을 가져온다.
- IN : 서브쿼리에 있는 값과 같은 값을 검색
- 예시) 한명의 host가 여러 id를 가지고 있을때 2개 이상의 id를 가진 host정보 가져오기
- 다중행 연산자를 사용하여 값을 가져온다.
SELECT ID, NAME, HOST_ID
FROM places
-- 추출된 host_id들과 본식의 host_id의 값이 일치하면 SELECT 한다.
WHERE HOST_ID IN (SELECT host_id
FROM places
GROUP BY host_id
HAVING COUNT(id) >= 2)
ORDER BY id
- ANY, SOME : 서브쿼리에 있는 값 중에 어느 하나라도 만족하면 TRUE
- EXISTS : 서브쿼리에 있는 값 중에 조건에 만족하는 값이 있는지 확인하여 있을 경우 SELECT에 반환, 아닐 경우 반환하지 않음, NOT EXISTS로도 사용 가능
- ALL : 서브쿼리에 있는 값과 모든 값을 만족하는 행을 반환