2 분 소요

UNION 키워드를 이용하면 앞뒤에 존재하는 두 SELECT문의 검색 결과를 하나의 표로 합쳐 보여준다.

SELECT class_number, mileage, username FROM site_users
GROUP BY class_number
HAVING mileage > AVG(mileage)

UNION

SELECT class_number, mileage, username FROM site_users
WHERE class_number = 1 AND member_id = 1;

예제 1-1

+--------------+---------+-----------+
| class_number | mileage | username  |
+--------------+---------+-----------+
|            2 |    4238 | egudgion3 |
|            3 |    4632 | gfittes4  |
|            1 |    1549 | pcopozio0 |
+--------------+---------+-----------+

예제 1-1 실행결과

이 외에도 집합 연산자들이 다음과 같이 존재한다.

  • UNION ALL : UNION은 기본적으로 DISTINCT처럼 중복된 데이터들은 걸러서 결과에 보여준다. 반면 그 뒤에 ALL을 쓰면 중복되는 데이터들도 같이 보여준다.
  • INTERSECT : 교집합. 즉, 두 SELECT 문 내에서 공통된 데이터들만을 보여준다.
  • EXCEPT : 차집합. 두 SELECT문 중 첫 번째 SELECT문의 검색결과에만 있는 데이터를 보여준다.

다음은 site_users 테이블과 classes 테이블에 공통으로 존재하는 class_number 필드값을 출력한 모습이다.

MariaDB [mytestmaria]> select class_number from site_users;
+--------------+
| class_number |
+--------------+
|            1 |
|            4 |
|            5 |
|            2 |
|            3 |
|            4 |
|            5 |
|            3 |
|            2 |
|            5 |
|            2 |
|            1 |
|            2 |
|            4 |
|            1 |
|            5 |
|            4 |
|            1 |
|            5 |
|            1 |
+--------------+
20 rows in set (0.001 sec)

MariaDB [mytestmaria]> select class_number from classes;
+--------------+
| class_number |
+--------------+
|            1 |
|            2 |
|            3 |
|            4 |
|            5 |
+--------------+
5 rows in set (0.001 sec)

예제 1-2

이제 앞서 살펴본 집합연산자들을 각각 적용하여 그 결과를 살펴보겠다.

SELECT class_number FROM site_users
UNION
SELECT class_number FROM classes;

예제 1-3

+--------------+
| class_number |
+--------------+
|            1 |
|            4 |
|            5 |
|            2 |
|            3 |
+--------------+
5 rows in set (0.001 sec)

예제 1-3 실행결과

SELECT class_number FROM site_users
UNION ALL
SELECT class_number FROM classes;

예제 1-4

+--------------+
| class_number |
+--------------+
|            1 |
|            4 |
|            5 |
|            2 |
|            3 |
|            4 |
|            5 |
|            3 |
|            2 |
|            5 |
|            2 |
|            1 |
|            2 |
|            4 |
|            1 |
|            5 |
|            4 |
|            1 |
|            5 |
|            1 |
|            1 |
|            2 |
|            3 |
|            4 |
|            5 |
+--------------+
25 rows in set (0.001 sec)

예제 1-4 실행결과

SELECT class_number FROM site_users
INTERSECT
SELECT class_number FROM classes;

예제 1-5

+--------------+
| class_number |
+--------------+
|            1 |
|            4 |
|            5 |
|            2 |
|            3 |
+--------------+
5 rows in set (0.000 sec)

예제 1-5 실행결과

SELECT class_number FROM site_users
EXCEPT
SELECT class_number FROM classes;

예제 1-6

Empty set (0.000 sec)

예제 1-6 실행결과


References

[1] 에이콘아카데미(강남) 강의

[2] W3Schools.com

This content is licensed under CC BY-NC 4.0

댓글남기기