SSELECT 1은 실제로 1이라는 값을 반환한다는 의미
하지만 EXISTS나 NOT EXISTS와 함께 쓸 땐, 반환값 자체는 중요하지 않고, 해당 서브쿼리가 "행을 반환하냐 안 하냐" 만 따짐
SELECT 1 FROM users WHERE age > 20;
이건 그냥 age가 20보다 큰 유저가 있으면, 그 수만큼 1을 반환
SELECT *
FROM orders o
WHERE EXISTS (
SELECT 1
FROM users u
WHERE u.user_id = o.user_id AND u.age > 20
);

- EXISTS는 “있어? 있어? 어! 하나라도 있네~” → TRUE
- NOT EXISTS는 “없지? 진짜 없지? 음~ 아무것도 없구나” → TRUE
-- 특정 유저가 주문을 한 적이 있는지 확인
SELECT user_id
FROM users u
WHERE EXISTS (
SELECT 1 FROM orders o WHERE o.user_id = u.user_id
);
→ 주문 이력이 있는 유저만 골라내는 쿼리
- 고객 테이블(customers)과 주문 테이블(orders)이 있다.
한 번이라도 주문한 적이 있는 고객의 user_id를 조회하시오.
SELECT user_id
FROM customers c
WHERE EXISTS (
SELECT 1
FROM orders o
WHERE o.customer_id = c.customer_id
)
- blocked_users 테이블에는 차단한 사람(blocker_id)과 차단당한 사람(blocked_id) 정보가 있다.
user_id = 100인 유저가 차단한 사람의 이름(username) 을 조회하시오.
SELECT u.username
FROM users u
WHERE u.user_id IN (
SELECT b.blocked_id
FROM blocked_users b
WHERE b.blocker_id = 100
)
SELECT u.username
FROM users u
WHERE EXISTS (
SELECT 1
FROM blocked_users b
WHERE b.blocker_id = 100 AND b.blocked_id = u.user_id
)
- departments 테이블과 employees 테이블이 있다.
소속된 직원이 한 명도 없는 부서의 이름(dept_name)을 조회하시오.
SELECT dept_name
FROM departments d
WHERE NOT EXISTS (
SELECT 1
FROM employees e
WHERE e.dept_id = d.dept_id
)
- posts와 comments 테이블이 있다.
댓글이 전혀 달리지 않은 게시글의 제목(title)을 조회하시오.
SELECT title
FROM posts p
WHERE NOT EXISTS (
SELECT 1
FROM comments c
WHERE c.post_id = p.post_id
)