본문 바로가기
Programming/SQL

[MySQL] EXISTS와 IN 사용법 비교하기 (예제)

by 코딩하는 금융인 2021. 8. 5.

안녕하세요.

오늘은 WHERE절에서 데이터를 걸러낼 때 자주 사용되는 EXISTS와 IN에 대한 사용법에 대해 알아보겠습니다.

출처 : 클라우드 인사이트

SQL에서 EXISTSINWHERE절에서 사용되며 조건에 따라 데이터를 걸러내어 결과를 조회할 때 사용되는 공통점을 가지고 있습니다.

EXISTS & IN 개념

EXISTS

  • 한 테이블이 다른 테이블과 외래키(FK)와 같은 관계가 있을 때 유용
  • 조건에 해당하는 ROW의 존재 유무와 이후 더 수행하지 않음
  • 일반적으로 SELECT절까지 가지 않기에 IN에 비해 속도나 성능면에서 더 좋음
  • 메인 쿼리 -> EXISTS 쿼리

IN

  • 조건에 해당하는 ROW의 컬럼 비교하여 체크
  • SELECT절에서 조회한 컬럼 값으로 비교하여 EXISTS에 비해 성능 떨어짐
  • IN 쿼리 -> 메인 쿼리

실습 예제

Customers Table (PK : cs_no)

cs_no cs_name cs_grade
001 kevin A
002 terry S
003 john SS
004 jane B
005 adam B

 

Orders Table (PK : order_id)

order_id order_date cs_no p_id order_volume
O0031 2018-04-01 003 P005 235
O0033 2018-04-22 004 P006 285
O0034 2018-05-01 002 P007 2
O0035 2018-07-01 003 P003 187
O0036 2018-07-04 004 P008 64
O0037 2018-09-05 007 P007 822

문제. 주문한 적이 있는 사용자 찾기

- EXISTS Query

SELECT * FROM customers WHERE EXISTS (
    SELECT * FROM orders WHERE orders.cs_no = customers.cs_no);

- IN Query

SELECT * FROM customers WHERE cs_no IN ( SELECT DISTINCT cs_no FROM orders);

- Join Query

SELECT DISTINCT c.*
FROM customers c JOIN orders o
on o.cs_no = c.cs_no;

 

3개의 쿼리 모두 아래의 동일한 결과를 보여준다.

cs_no cs_name cs_grade
002 terry S
003 john SS
004 jane B

 

반대로, 주문한 적이 없는 사용자를 조회할 때는 NOT을 붙여주면 된다.

 

References
반응형

댓글