본문 바로가기
Database/MySQL

[MySQL] 데이터를 검색하는 SELECT 명령어의 응용 및 예제 정리(4) - 합집합, 교집합, 차집합

by Blue Developer 2021. 10. 2.

들어가기에 앞서

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

이번 게시물에서는 2개 이상의 테이블 데이터를 하나로 통합하는 집합 연산(합집합, 교집합, 차집합)에 대해서 알아보겠습니다.

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

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 |
| 105    | Wang    | Physics     | Male   | 1997-01-05 | 010-5588-9215 |
| 106    | Bang    | Engineering | Male   | 1997-01-04 | 010-5588-9233 |
+--------+---------+-------------+--------+------------+---------------+
6 rows in set (0.00 sec)
mysql> SELECT * FROM professor;
+-------+-----------+-------------+---------------------+
| pfnum | pfname    | dept        | email               |
+-------+-----------+-------------+---------------------+
| 1001  | Irene     | english     | irene@naver.com     |
| 1002  | Alice     | mathematics | alice@naver.com     |
| 1003  | Dophamine | biology     | dophamine@naver.com |
| 1004  | Mong      | engineering | minsu@naver.com     |
| 1005  | Einestein | physics     | einestein@naver.com |
| 1006  | Chogal    | economics   | chogal@naver.com.   |
| 1007  | Viper     | German      | viper@naver.com     |
| 1008  | Lucas     | Geography   | lucas@naver.com     |
| 1009  | Subin     | Korean      | subin@naver.com     |
| 1010  | Newgate   | Biology     | newgate@naver.com   |
+-------+-----------+-------------+---------------------+
10 rows in set (0.00 sec)

합집합(UNION) - 두 SELECT문의 조회 결과를 통합하여 중복되는 행은 제외하고 출력

mysql> SELECT major FROM student UNION SELECT dept FROM professor;
+-------------+
| major       |
+-------------+
| biology     |
| economics   |
| engineering |
| physics     |
| english     |
| Geography   |
| German      |
| Korean      |
| mathematics |
+-------------+
9 rows in set (0.00 sec)

student 테이블의 major 속성와 professor 테이블의 dept 속성의 중복 요소가 제거된 합집합의 연산 결과를 볼 수 있습니다.

합집합(UNION ALL) - 두 SELECT문의 조회 결과를 통합하여 중복되는 행까지 모두 출력

mysql> SELECT major FROM student UNION ALL SELECT dept FROM professor;
+-------------+
| major       |
+-------------+
| biology     |
| economics   |
| engineering |
| Engineering |
| physics     |
| Physics     |
| biology     |
| Biology     |
| economics   |
| engineering |
| english     |
| Geography   |
| German      |
| Korean      |
| mathematics |
| physics     |
+-------------+
16 rows in set (0.00 sec)

student 테이블의 major 속성와 professor 테이블의 dept 속성의 중복 요소가 제거되지 않은 합집합의 연산 결과를 볼 수 있습니다.

교집합 - 두 SELECT문의 조회 결과 중에서 공통되는 행만 출력

# student 테이블의 major 속성과 professor 테이블의 dept 속성이 같은 데이터를 전부 출력
mysql> SELECT * FROM student s, professor p WHERE s.major=p.dept;
mysql> SELECT * FROM student s INNER JOIN professor p ON s.major=p.dept;
+--------+---------+-------------+--------+------------+---------------+-------+-----------+-------------+---------------------+
| stdnum | stdname | major       | sex    | birthdate  | phonenum      | pfnum | pfname    | dept        | email               |
+--------+---------+-------------+--------+------------+---------------+-------+-----------+-------------+---------------------+
| 101    | Hong    | biology     | Female | 1990-02-24 | 010-1234-5323 | 1003  | Dophamine | biology     | dophamine@naver.com |
| 101    | Hong    | biology     | Female | 1990-02-24 | 010-1234-5323 | 1010  | Newgate   | Biology     | newgate@naver.com   |
| 102    | Song    | physics     | Male   | 1996-02-24 | 010-3322-8813 | 1005  | Einestein | physics     | einestein@naver.com |
| 103    | Dong    | economics   | Male   | 1995-02-24 | 010-5667-9315 | 1006  | Chogal    | economics   | chogal@naver.com.   |
| 104    | Mong    | engineering | Female | 1993-02-24 | 010-9462-8814 | 1004  | Mong      | engineering | minsu@naver.com     |
| 105    | Wang    | Physics     | Male   | 1997-01-05 | 010-5588-9215 | 1005  | Einestein | physics     | einestein@naver.com |
| 106    | Bang    | Engineering | Male   | 1997-01-04 | 010-5588-9233 | 1004  | Mong      | engineering | minsu@naver.com     |
+--------+---------+-------------+--------+------------+---------------+-------+-----------+-------------+---------------------+
7 rows in set (0.00 sec)

MySQL은 Oracle과 달리 교집합 연산자가 존재하지 않기 때문에 조인 연산을 통해서 직접 코드로 구현해줘야만 합니다.

차집합 - 첫 번째  SELECT문의 조회 결과로부터 두 번째 SELECT문의 조회 결과를 제외한 행을 출력

# student 테이블의 stdname 속성 중에서 professor 테이블의 pfname 속성에 포함되지 않는 데이터를 전부 검색
mysql> SELECT * FROM student WHERE stdname NOT IN (SELECT pfname FROM professor);
+--------+---------+-------------+--------+------------+---------------+
| 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 |
| 105    | Wang    | Physics     | Male   | 1997-01-05 | 010-5588-9215 |
| 106    | Bang    | Engineering | Male   | 1997-01-04 | 010-5588-9233 |
+--------+---------+-------------+--------+------------+---------------+
5 rows in set (0.00 sec)

MySQL은 Oracle과 달리 차집합 연산자가 존재하지 않기 때문에 서브쿼리를 이용하여 직접 코드로 구현해줘야만 합니다.

위의 교집합 연산 결과를 통해서 데이터 중에 stdname 속성값과 pfname 속성값이 일치하는 데이터를 이용하여 차집합 연산을 코드로 구현할 수 있습니다.

댓글