SELECT 1 패턴 / (NOT) EXISTS 패턴

dragonloly·2025년 4월 22일
0

SQL

목록 보기
17/19

SELECT 1

SSELECT 1은 실제로 1이라는 값을 반환한다는 의미
하지만 EXISTS나 NOT EXISTS와 함께 쓸 땐, 반환값 자체는 중요하지 않고, 해당 서브쿼리가 "행을 반환하냐 안 하냐" 만 따짐

SELECT 1 FROM users WHERE age > 20;

이건 그냥 age가 20보다 큰 유저가 있으면, 그 수만큼 1을 반환

EXISTS 와 NOT EXISTS 패턴

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
);
→ 주문 이력이 있는 유저만 골라내는 쿼리
  1. 고객 테이블(customers)과 주문 테이블(orders)이 있다.
    한 번이라도 주문한 적이 있는 고객의 user_id를 조회하시오.
SELECT user_id
FROM customers c
WHERE EXISTS (
  SELECT 1
  FROM orders o
  WHERE o.customer_id = c.customer_id
)
  1. blocked_users 테이블에는 차단한 사람(blocker_id)과 차단당한 사람(blocked_id) 정보가 있다.
    user_id = 100인 유저가 차단한 사람의 이름(username) 을 조회하시오.
  • IN 방식
SELECT u.username
FROM users u
WHERE u.user_id IN (
  SELECT b.blocked_id
  FROM blocked_users b
  WHERE b.blocker_id = 100
)
  • EXISTS 방식
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
)
  1. 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
)
  1. posts와 comments 테이블이 있다.
    댓글이 전혀 달리지 않은 게시글의 제목(title)을 조회하시오.
SELECT title
FROM posts p 
WHERE NOT EXISTS (
  SELECT 1
  FROM comments c
  WHERE c.post_id = p.post_id
)
profile
IT기업에서 운영 기획 담당하고 있습니다 : )

0개의 댓글