부속 질의문을 이용하여 검색할 때, SQL에선 여러 연산자를 지원한다.
이 중 IN과 EXISTS에 대해 혼란이 생겨 글을 정리한다.
정의
IN | 부속 질의문의 결과 값 중 일치하는 것이 있으면 검색 조건이 참 |
EXISTS | 부속 질의문의 결과 값이 하나라도 존재하면 검색 조건이 참 |
정의보단 실행순서에서 차이가 존재한다.
실행순서
IN | 서브 쿼리 결과값을 메인 쿼리에 대입하여 비교 후 결과 출력 |
EXISTS | 메인 쿼리 결과값을 서브 쿼리에 대입하여 비교 후 결과 출력 |
IN : 서브 쿼리 -> 메인 쿼리
EXISTS : 메인 쿼리 -> 서브 쿼리
이제 예를 들어보자
SELECT 고객이름
FROM 고객
WHERE EXISTS ( SELECT *
FROM 주문
WHERE 주문일자 = '2022-03-15'
AND 주문.주문고객 = 고객.고객아이디 );
위 쿼리를 한 줄로 표현하면
2022년 3월 15일에 제품을 주문한 고객의 고객이름을 검색하라.
이다.
EXISTS는 메인쿼리 -> 서브쿼리 순으로 실행되기 때문에 순서는 다음과 같다.
1. 고객 테이블에서 고객이름을 가져온다.
2. 이 중 주문일자가 '2022-03-15' 이고 주문고객과 고객아이디가 같은 것을 골라라.
따라서, EXISTS의 정의가 부속 질의문의 결과 값이 하나라도 존재하면 검색 조건이 참이다.
먼저 메인쿼리에서 데이터를 가져오고, 서브쿼리를 통해 필터링을 하기 때문이다.
반대로 IN의 경우를 보자.
SELECT 제품명, 제조업체
FROM 제품
WHERE 제품번호 IN ( SELECT 주문제품
FROM 주문
WHERE 주문고객 = 'banana');
IN의 경우, 서브쿼리가 먼저 실행되고, 메인쿼리가 진행된다.
따라서, 진행순서는 다음과 같다.
1. 주문고객이 'banana'인 주문의 주문제품을 다 받아온다.
2. 해당 제품의 제품명과 제조업체를 가져온다.
IN은 서브쿼리에서 가져온 값들을 통해 메인쿼리에서 필터링을 하기때문에
IN의 정의인, 부속 질의문의 결과 값 중 일치하는 것이 있으면 검색 조건이 참인것이다.
3줄 요약
1. IN은 서브쿼리에서 나온 결과 값으로 메인쿼리에서 값 출력
2. EXISTS는 메인쿼리의 값들 중 서브쿼리에 맞는 값들만 출력
3. 실행순서 차이때문에 정의 또한 달라짐
도움받은 글 ( _ _ )
sql exists vs in 차이 : 네이버 블로그 (naver.com)
sql exists vs in 차이
EXISTS : 조건에 해당하는 ROW의 존재 유무와 체크 후 더이상 수행하지 않음. -> SE...
blog.naver.com
(MySQL) IN, NOT IN, EXISTS, NOT EXISTS 동작 방식 정리 (tistory.com)
(MySQL) IN, NOT IN, EXISTS, NOT EXISTS 동작 방식 정리
해당 내용은 IN / NOT IN / EXISTS / NOT EXISTS 동작 방식을 정리한 내용으로 MySQL을 기준으로 실행하고 작성된 내용이지만 MSSQL, Oracle 등에서도 적용되는 내용입니다. (예시에 사용될 orders table, customers ta
wildeveloperetrain.tistory.com
'🏫학부 공부' 카테고리의 다른 글
[DB] 데이터 모델링 (0) | 2024.04.01 |
---|---|
[DB] RDB 용어 및 키 & 무결성 제약조건 (0) | 2024.03.31 |
[DB] 관계 데이터 연산 (0) | 2024.03.30 |