안녕하세요.
오늘은 WHERE절에서 데이터를 걸러낼 때 자주 사용되는 EXISTS와 IN에 대한 사용법에 대해 알아보겠습니다.
SQL에서 EXISTS와 IN은 WHERE절에서 사용되며 조건에 따라 데이터를 걸러내어 결과를 조회할 때 사용되는 공통점을 가지고 있습니다.
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
반응형
'Programming > SQL' 카테고리의 다른 글
MySQL Workbench 설치 (Windows) (2) | 2021.08.29 |
---|---|
[MySQL] 문자열 자르기 (SUBSTR, SUBSTRING) (0) | 2021.08.22 |
[SQL] 상위 n개 데이터 조회하기 (0) | 2021.08.02 |
[SQL] null 처리하기 (조회, 대체) (0) | 2021.07.29 |
[MySQL] 서브쿼리 설명 및 예제 (0) | 2021.07.28 |
댓글