- Subquery
- Scalar Subquery
- Inline View
- Nested Subquery
- Multiple Row
- exercises
서브쿼리(Subquery)란, 하나의 sql문 안에 포함되어 있는 또다른 sql문을 말한다.
메인쿼리가 서브쿼리를 포함하는 종속적인 관계이다.
주의사항
서브쿼리 종류
SELECT절에서 사용하는 서브쿼리. 결과는 하나의 column이어야 한다.
SELECT column1, (SELECT column2 FROM table2 WHERE condition)
FROM table1
WHERE condition;
FROM절에 사용하는 서브쿼리. 메인쿼리는 인라인 뷰에서 조회한 column만 사용 가능하다.
SELECT a.column, b.column
FROM table1 a, (SELECT column1, column2 FROM table2) b
WHERE condition;
select문으로 조회한 결과를 하나의 테이블처럼 사용해서, from절에서 가져온다.
두 테이블을 만들고 조인하는 형식이다.
WHERE절에서 사용하는 서브쿼리.
하나씩 살펴보자.
SELECT column_names
FROM table_name
WHERE column_name = (SELECT column_name
FROM table_name
WHERE condition)
ORDER BY column_name;
2-1. Multiple row - IN
서브쿼리 결과 중에 컬럼값이 있는 경우 (IN) 반환한다.
SELECT column_names
FROM table_name
WHERE column_name IN (SELECT column_name
FROM table_name
WHERE condition)
ORDER BY column_name;
IN 대신 join을 써도 되는 예시이다.
2-2. Multiple row - EXISTS
서브쿼리 결과에 값이 있으면 반환
SELECT column_names
FROM table_name
WHERE EXISTS (SELECT column_name
FROM table_name
WHERE condition)
ORDER BY column_name;
2-3. Multiple row - ANY
서브쿼리 결과 중에 최소한 하나라도 만족하면 반환 (비교연산자 사용)
SELECT column_names
FROM table_name
WHERE column_name = ANY (SELECT column_name
FROM table_name
WHERE condition)
ORDER BY column_name;
-> celeb name이 snl_show host에 있으면 true로 return
2-4. Multiple row - ALL
서브쿼리 결과를 모두 만족하면 반환 (비교연산자 사용)
SELECT column_names
FROM table_name
WHERE column_name = ALL (SELECT column_name
FROM table_name
WHERE condition)
ORDER BY column_name;
-> 전체 조건을 만족하기 위해 서브쿼리 where절에 제한을 둠.
SELECT column_names
FROM tablename a
WHERE (a.column1, a.column2, ...) IN (SELECT b.column1, b.column2, ...
FROM tablename b
WHERE a.column_name = b.column_name)
ORDER BY column_names;
-> 서브쿼리의 where절을 보면, 메인쿼리의 컬럼(a.column_name)을 사용하고 있다.
문제 1. oil_price 테이블에서 셀프주유의 평균가격과 SK에너지의 가장 비싼 가격을 Scalar subquery를 사용하여 조회
문제 2. oil_price 테이블에서 상표별로 가장 비싼 가격과 상호를 Inline View를 사용하여 조회하세요.
문제 3. 평균가격보다 높은 주유소 상호와 가격을 Nested Subquery를 사용하여 조회하세요.