EXISTS
- 조건에 해당하는 ROW의 존재 유무를 확인
- 'SELECT 절'까지 수행하지 않기 때문에 In에 비해 속도나 성능면에서 더 좋음
- EXISTS는 WHERE 절에서 주로 사용하며, WHERE 절에서 IN을 사용하는 것과 같은 결과를 주며, JOIN Query로도 동일한 결과를 낼 수 있음
- 해당하는 데이터가 없는 경우를 찾을 때는 NOT EXISTS 를 사용할 수 있음
- IN의 경우 실제 존재하는 데이터의 값을 비교하기 때문에 EXISTS 보다 속도가 느린 경우가 있음
예시
TABLE: team_epl
- EPL 팀
no | name |
1 | Arsenal |
2 | Liverpool |
3 | Manchester United |
4 | Manchester City |
5 | Chelsea |
6 | Tottenham |
7 | Newcastle |
... | ... |
TABLE: team_ucl_winner
- 챔피언스리그 우승팀
no | name | year |
1 | Real Madrid | ... |
2 | AC Milan | ... |
3 | Liverpool | ... |
4 | FC Barcelona | ... |
5 | Bayern Munich | ... |
6 | Manchester United | ... |
7 | Chelsea | ... |
8 | Manchester City | ... |
... | ... | ... |
쿼리 예시
- EPL 팀 중 챔피언스리그 우승팀을 구해보자
WHERE ~ IN 을 쓸 경우
SELECT E.name FROM team_epl AS E
WHERE E.name IN (SELECT DISTINCT UW.name FROM team_ucl_winner AS UW);
JOIN 을 쓸 경우
SELECT E.name FROM team_epl AS E
JOIN team_ucl_winner AS UW ON E.name = UW.name;
WHERE ~ EXISTS 를 쓸 경우
SELECT E.name FROM team_epl AS E
WHERE EXISTS (SELECT * FROM team_ucl_winner AS UW WHERE E.name = UW.name);
세 쿼리 모두 동일한 결과가 출력된다.
Query Result
name |
Liverpool |
Manchester United |
Chelsea |
Manchester City |
'MySQL' 카테고리의 다른 글
14. JOIN(두 개 이상의 테이블을 참조) (0) | 2022.05.03 |
---|---|
13. 피벗(Pivot) (0) | 2022.05.03 |
12. 숫자 함수 & 날짜 시간 함수 (0) | 2022.05.03 |
11. 문자열 함수(CONCAT, CONCAT_WS, FORMAT, LEFT, RIGHT, SUBSTRING_INDEX) (0) | 2022.05.03 |
10. 제어 흐름(IF, IFNULL, NULLIF, CASE~ WHEN~) (0) | 2022.05.03 |