MySQL에서 EXISTS를 사용 하는 방법을 알아보겠습니다.
EXISTS는 WHERE 조건문에 사용을 합니다.
WHERE 조건문에는 EXISTS 또는 NOT EXISTS를 사용할 수 있습니다.
EXISTS
EXISTS는 데이터가 존재하는지 확인하고 싶은 경우에 사용합니다.
EXISTS를 사용한 서브 쿼리에 결과값이 존재하는지 안하는지를 판단합니다.
즉, 서브 쿼리의 SELECT에서 검색한 결과가 있는지 없는지를 판단하게 됩니다.
EXISTS의 기본 작성방법은 다음과 같습니다.
SELECT *
FROM 테이블명
WHERE EXISTS
(서브 쿼리);
샘플을 보면서 EXISTS 사용 방법을 알아보겠습니다.
샘플 테이블로 Member가 있다고 가정하겠습니다.
Member 테이블에는 아래와 같은 데이터가 있습니다.
mysql> SELECT * FROM Member;
+----+----------+-------+------+---------+
| id | Memberid | name | age | company |
+----+----------+-------+------+---------+
| 1 | 1 | tom | 24 | A |
| 2 | 2 | cat | 36 | A |
| 3 | 3 | work | 29 | C |
| 4 | 4 | bench | 45 | A |
| 5 | 5 | post | 59 | B |
| 6 | 6 | gre | 21 | C |
+----+----------+-------+------+---------+
6 rows in set (0.00 sec)
mysql>
위 샘플 테이블 Member의 키는 id입니다.
또 다른 테이블인 Complate를 준비했습니다.
mysql> SELECT * FROM Complate;
+----+----------+-------+---------+
| id | Memberid | price | payment |
+----+----------+-------+---------+
| 1 | 1 | 1000 | card |
| 2 | 2 | 2000 | card |
| 3 | 4 | 1500 | cash |
| 4 | 6 | 300 | card |
+----+----------+-------+---------+
4 rows in set (0.00 sec)
Complate에 Memberid가 존재 하는 데이터만 Member 테이블의 데이터를 표시하도록 EXISTS를 사용해 취득 해보겠습니다.
SELECT *
FROM Member AS m
WHERE EXISTS
(SELECT *
FROM Complate AS c
WHERE c.Memberid = m.Memberid);
결과
+----+----------+-------+------+---------+
| id | Memberid | name | age | company |
+----+----------+-------+------+---------+
| 1 | 1 | tom | 24 | A |
| 2 | 2 | cat | 36 | A |
| 4 | 4 | bench | 45 | A |
| 6 | 6 | gre | 21 | C |
+----+----------+-------+------+---------+
4 rows in set (0.02 sec)
취득한 결과는 Complate 테이블의 Memberid가 존재하는 데이터만 Member에서 취득해 표시하고 있습니다.
EXISTS의 반환값은 서브쿼리의 실행 결과에서 데이터가 있으면 1(True), 데이터가 없으면 0(False)를 반환합니다.
NOT EXISTS
서브쿼리로 NOT EXISTS를 사용하는 방법을 알아보겠습니다.
NOT EXISTS는 EXISTS와 반대로 데이터가 없는지 확인하고 싶은 경우에 사용합니다.
NOT EXISTS의 반환값은 서브쿼리의 실행결과에 데이터가 있으면 0(False), 데이터가 없으면 1(True)를 반환합니다.
NOT EXISTS 작성 방법을 보겠습니다.
SELECT *
FROM 테이블명
WHERE NOT EXISTS
(서브 쿼리);
샘플 테이블을 사용해 NOT EXISTS 사용 방법을 보겠습니다.
SELECT *
FROM Member AS m
WHERE NOT EXISTS
(SELECT *
FROM Complate AS c
WHERE c.Memberid = m.Memberid);
결과
+----+----------+------+------+---------+
| id | Memberid | name | age | company |
+----+----------+------+------+---------+
| 3 | 3 | work | 29 | C |
| 5 | 5 | post | 59 | B |
+----+----------+------+------+---------+
2 rows in set (0.00 sec)
서브 쿼리 조건에서 바뀐 부분은 없습니다.
바뀐곳은 EXISTS를 NOT EXISTS로 변경했습니다.
결과를 보면 Complate에 존재하지 않는 Member 테이블 데이터만 취득했습니다.
정리
테이블에서 데이터의 존재 여부만 확인하는 경우에는 WHERE 조건에 IN 또는 NOT IN을 사용 하는것보다 성능이 좋은 경우가 많습니다.
단순 데이터 확인만 하는 로직에서 튜닝을 해야하는 경우에 EXISTS 또는 NOT EXISTS를 사용하는 경우가 많으니 사용 방법을 알아두는것이 좋습니다.
댓글