C.W.K.
Stream
Lesson 07 of 10 · published

Subquery — Inline SELECT

~12 min · sql, subqueries, scalar-subquery

Level 0Scout
0 XP0/80 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

SELECT 안의 SELECT

Subquery 는 다른 statement 안에 nested 된 SELECT. 흔한 모양 4 개:

  • Scalar subquery — 한 값 반환, 컬럼이나 비교에 사용: SELECT name, (SELECT count(*) FROM messages WHERE conversation_id = c.id) AS n FROM conversations c;
  • IN subquery — set 반환, IN 의 right-hand side.
  • EXISTS subquery — true/false 반환: 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) 으로 비교. 깊게 nested 된 로직이면 CTE (track 8) 가 보통 nested subquery 보다 잘 읽혀.

Code

Subquery 4 모양·sql
-- 컬럼으로 scalar subquery
SELECT c.id, c.title,
       (SELECT count(*) FROM messages m WHERE m.conversation_id = c.id) AS n_messages
FROM   conversations c
ORDER  BY n_messages DESC LIMIT 10;

-- IN subquery
SELECT * FROM messages
WHERE  conversation_id IN (
  SELECT id FROM conversations WHERE archived = 0
);

-- EXISTS subquery (큰 set 에선 IN 보다 빠를 때 많음)
SELECT * FROM conversations c
WHERE  EXISTS (SELECT 1 FROM messages m WHERE m.conversation_id = c.id);

-- FROM 의 derived 테이블
SELECT day, total FROM (
  SELECT date(created_at) AS day, count(*) AS total
  FROM messages GROUP BY day
) WHERE total > 100;

External links

Exercise

실제스러운 두 테이블 시나리오 (conversations + messages 또는 본인 거) 골라. 같은 논리 query 4 가지 작성: scalar subquery, IN subquery, EXISTS subquery, JOIN + GROUP BY. EXPLAIN QUERY PLAN 으로 비교. SQLite 가 어떤 거에 가장 단순한 plan 골랐는지 + 왜.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.