
💡 3문제 더 풀면서 새로 발견한 약점들.
"없는 것 찾기" 패턴 집중 연습했다.
주문을 한 번도 하지 않은 유저를 조회해줘.
SELECT u.user_id, u.name
FROM users u
JOIN orders o ON u.user_id = o.user_id
WHERE o.order_id IS NULL
SELECT u.user_id, u.name
FROM users u
LEFT JOIN orders o ON u.user_id = o.user_id
WHERE o.order_id IS NULL
| JOIN | 동작 |
|---|---|
| INNER JOIN | 매칭되는 것만 (교집합) |
| LEFT JOIN | 왼쪽 전부 + 매칭 (없으면 NULL) |
"없는 것 찾기"는 무조건 LEFT JOIN!
INNER JOIN 쓰면 없는 애들이 아예 안 나옴 ㅠ
HAVING o.order_id IS NULL
WHERE o.order_id IS NULL
| 용도 | 사용 |
|---|---|
| 행 필터링, NULL 체크 | WHERE |
| 집계함수 조건 | HAVING |
IS NULL은 WHERE에서!
#1에서도 WHERE vs HAVING 틀렸는데 또 틀림 ㅋㅋ
반복 연습 필요...
FROM products p
LEFT JOIN order_items
ON p.product_id = o.product_id
↑ o가 뭔데?
FROM products p
LEFT JOIN order_items o ON p.product_id = o.product_id
↑ 여기서 o 선언!
별칭 쓸 거면 JOIN할 때 바로 선언!
LEFT JOIN 테이블명 별칭 ON 조건
SELECT user_id, name
FROM users u
WHERE NOT EXISTS (
SELECT 1 FROM orders o WHERE o.user_id = u.user_id
);
SELECT 1은 가볍고 명확해서 관례적으로 사용-- 전부 동일!
WHERE EXISTS (SELECT 1 FROM ...)
WHERE EXISTS (SELECT * FROM ...)
WHERE EXISTS (SELECT 999 FROM ...)
마지막 문제에서 100점!
-- "없는 것 찾기" 공식
SELECT ...
FROM A
LEFT JOIN B ON A.id = B.id
WHERE B.id IS NULL;
SELECT e.emp_id, e.name
FROM employees e
LEFT JOIN projects p ON e.emp_id = p.emp_id
WHERE p.project_id IS NULL;
이 패턴 이제 손에 익었다! 👊
| 항목 | 상태 | 메모 |
|---|---|---|
| JOIN 문법 | 🟢 | FROM JOIN ON 순서 |
| 날짜 범위 | 🔴 | AND로 연결 (아직 연습 필요) |
| LEFT JOIN vs INNER | 🟢 | 습득! |
| LEFT JOIN + IS NULL | ✅ | 완전 습득! |
| WHERE vs HAVING | 🟡 | 아직 헷갈림 |
| ROW_NUMBER | 🟡 | OVER() 구조 |
| LAG | 🟢 | 이해 완료 |
| NOT EXISTS | 🟡 | 개념만 이해 |
📝 3문제 더 풀고 나니 "없는 것 찾기" 패턴은 확실히 잡혔다.
반복이 답이다!
