SELECT 안의 SELECT
Subquery는 다른 statement 안에 들어앉은 SELECT야. 자주 보는 모양이 넷 있어.
- Scalar subquery — 값 하나를 돌려주니까 컬럼 자리나 비교식에 넣어 쓸 수 있어.
SELECT name, (SELECT count(*) FROM messages WHERE conversation_id = c.id) AS n FROM conversations c; - IN subquery — 값의 묶음을 돌려주고
IN의 오른쪽에 앉아. - EXISTS subquery — 있냐 없냐만 돌려줘.
WHERE EXISTS (SELECT 1 FROM messages m WHERE m.conversation_id = c.id). - Derived 테이블 — FROM 자리에 통째로 들어가.
FROM (SELECT brain, count(*) AS n FROM messages GROUP BY brain) AS sub WHERE sub.n > 100;
Tip: subquery는 대부분 join이나 CTE로 다시 쓸 수 있고, 그쪽이 더 빠를 때도 있어.
EXPLAIN QUERY PLAN으로 비교해봐. track 5에서 다뤄. 로직이 여러 겹으로 파고들면 track 7의 CTE가 보통 겹겹이 쌓인 subquery보다 훨씬 잘 읽혀.