본문 바로가기
Database/MySQL

[MySQL] 데이터를 검색하는 SELECT 명령어의 응용 및 예제 정리(3) - IN, NOT IN, EXISTS, NOT EXISTS

by Blue Developer 2021. 9. 30.

들어가기에 앞서

본 게시물은 'MySQL 8.0' 버전을 이용한 '명령 프롬프트(cmd)' 환경에서 작성한 코드를 토대로 만들어졌습니다.

이번 게시물에서는 서브쿼리에 값이 존재하는지(존재하지 않는지) 판별하는데 사용되는 'IN', 'NOT IN', 'EXISTS', 'NOT EXISTS'에 대해서 알아보겠습니다.

예제에 사용되는 테이블 소개

mysql> SELECT * FROM student;
+--------+---------+-------------+--------+------------+---------------+
| stdnum | stdname | major       | sex    | birthdate  | phonenum      |
+--------+---------+-------------+--------+------------+---------------+
| 101    | Hong    | biology     | Female | 1990-02-24 | 010-1234-5323 |
| 102    | Song    | physics     | Male   | 1996-02-24 | 010-3322-8813 |
| 103    | Dong    | economics   | Male   | 1995-02-24 | 010-5667-9315 |
| 104    | Mong    | engineering | Female | 1993-02-24 | 010-9462-8814 |
+--------+---------+-------------+--------+------------+---------------+
4 rows in set (0.00 sec)
mysql> SELECT * FROM dept;
+-------------+--------------+
| deptname    | tel          |
+-------------+--------------+
| Economics   | 031-322-5599 |
| German      | 031-323-5576 |
| Korean      | 031-323-5578 |
| Geography   | 031-323-5588 |
| Engineering | 031-332-5667 |
| Physics     | 031-332-5669 |
| Biology     | 031-333-5578 |
| Mathematics | 031-333-5588 |
| English     | 031-334-5588 |
+-------------+--------------+
9 rows in set (0.00 sec)

EXISTS & NOT EXISTS

# stduent 테이블의 major 속성에 대해서 서브쿼리의 결과에 존재하는 데이터들을 검색
# 서브쿼리 : dept 테이블의 deptname 속성에 대해서 모든 데이터를 검색
mysql> SELECT major FROM student WHERE EXISTS(SELECT deptname FROM dept);
+-------------+
| major       |
+-------------+
| biology     |
| economics   |
| engineering |
| physics     |
+-------------+
4 rows in set (0.00 sec)

'EXISTS', 'NOT EXISTS'를 사용하기 위해서는 반드시 '(  )' 안에 서브쿼리가 삽입되어 있어야 하며, 서브쿼리의 결과에 포함되는(포함되지 않는) 값이 새로운 조건이 됩니다.

# stduent 테이블의 major 속성에 대해서 서브쿼리의 결과에 존재하지 않는 데이터들을 검색
# 서브쿼리 : dept 테이블의 deptname 속성에 대해서 모든 데이터를 검색
mysql> SELECT major FROM student WHERE NOT EXISTS(SELECT deptname FROM dept);
Empty set (0.00 sec)

student 테이블의 major 속성값 중에 dept 테이블의 deptname 속성에 존재하지 않는 데이터가 없으므로 'Empty set'이 출력되었습니다.

IN & NOT IN

# dept 테이블로부터 deptname 속성에 대해서 student 테이블의 major 값에 포함되지 않는 데이터를 출력
mysql> SELECT deptname FROM dept WHERE deptname NOT IN (SELECT major FROM student);
+-------------+
| deptname    |
+-------------+
| German      |
| Korean      |
| Geography   |
| Mathematics |
| English     |
+-------------+
5 rows in set (0.00 sec)

'IN', 'NOT IN'은 'EXISTS', 'NOT EXISTS'와 같이 '(  )' 안에 서브쿼리를 삽입하여 서브쿼리의 결과에 포함되는(포함되지 않는) 값만 검색할 수 있습니다.

# student 테이블의 전체 속성에 대해서 major 값이 'physics'이거나 'engineering'인 데이터를 모두 검색
mysql> SELECT * FROM student WHERE major IN ('physics', 'engineering');
+--------+---------+-------------+--------+------------+---------------+
| stdnum | stdname | major       | sex    | birthdate  | phonenum      |
+--------+---------+-------------+--------+------------+---------------+
| 104    | Mong    | engineering | Female | 1993-02-24 | 010-9462-8814 |
| 102    | Song    | physics     | Male   | 1996-02-24 | 010-3322-8813 |
+--------+---------+-------------+--------+------------+---------------+
2 rows in set (0.00 sec)

또한, 위와 같이 '(  )' 안에 서브쿼리 대신에 값들을 삽입하여 '(  )' 내부에 값이 존재하는지(존재하지 않는지) 판별하는 용도로 사용할 수도 있습니다. 

댓글