[MySQL] 서브쿼리
SQL 쿼리를 작성하다 보면, 원래 있던 테이블에서 원하는 것을 바로 꺼내오기 어려운 경우가 있다.
이러한 경우에 서브 쿼리를 사용하면, 원하는 것을 쉽게 얻을 수 있다.
필자는 보통 서브쿼리를 FROM절과 WHERE절에서 사용한다.
1. FROM절의 서브쿼리
FROM절 뒤에는 어떤 테이블에서 작업을 진행할지를 적어준다.
따라서 FROM절 뒤에 서브 쿼리를 사용하면, 서브 쿼리의 결과물로 테이블을 받고 그 테이블을 기준으로 작업을 실행한다.
SELECT order_count_table.order_count,
count(*)
FROM (SELECT name,
count(*) AS order_count
FROM orders
GROUP BY name) AS order_count_table
GROUP BY order_count_table.order_count
orders의 테이블에는 주문자명(name)과 하나의 주문에 대한 정보가 담겨있다고 하자.
FROM절의 서브 쿼리에서는 주문자명을 기준으로 한 사람이 얼마나 많은 주문을 했는지를 보여준다.
이러한 서브 쿼리의 테이블을 받아, 서브 쿼리를 감싸고 있는 쿼리는 주문 횟수를 기준으로 데이터 개수를 세준다.
그 결과 주문 횟수마다 몇 명의 주문자가 있는지를 알려준다.
FROM절의 서브 쿼리는 이렇게 한번에 하기 어려운 작업을 할 때 사용한다.
2. WHERE절의 서브쿼리
WHERE 절은 조건문이 필요하고 여기서 서브 쿼리는 조건의 대상이 되는 경우가 많다.
SELECT *
FROM orders
WHERE orderdate = (SELECT orderdate
FROM Orders
GROUP BY orderdate
ORDER BY count(*) DESC,
orderdate DESC
LIMIT 1)
서브쿼리는 가장 최근에 가장 주문이 많았던 날의 일자를 알려준다.
그리고 감싸고 있는 쿼리는 그 일자의 주문들을 보여준다.
SQL문제를 풀다 보면 서브 쿼리는 유용하게 사용될 때가 많다.
꼭 기억하고 적극 애용하자.
(참고 자료 - https://www.inflearn.com/users/@datarian 의 [백문이불여일타] 데이터 분석을 위한 고급, 중급, 기초 SQL)