[MySQL] UNION

Bpius·2023년 11월 11일
0

MySQL

목록 보기
7/15
post-thumbnail

UNION

여러 개의 SQL문을 합쳐서 하나의 SQL 문으로 만들어주는 방법 (주의- 컬럼의 개수가 같아야함)

실습 데이터 작성
test1과 test2 table를 생성하고 데이터를 입력하여 진행해보자.

test1, test2 table 생성

mysql> create table test1
    -> (
    ->  no int
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> create table test2
    -> (
    ->  no int
    -> );
Query OK, 0 rows affected (0.02 sec)

test1, test2 table에 데이터 입력

# test 1
mysql> insert into test1 values (1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into test1 values (2);
Query OK, 1 row affected (0.01 sec)

mysql> insert into test1 values (3);
Query OK, 1 row affected (0.00 sec)

# test2
mysql> insert into test2 values (5);
Query OK, 1 row affected (0.00 sec)

mysql> insert into test2 values (6);
Query OK, 1 row affected (0.00 sec)

mysql> insert into test2 values (3);
Query OK, 1 row affected (0.01 sec)

table 확인

mysql> desc test1;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| no    | int  | YES  |     | NULL    |       |
+-------+------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> desc test2;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| no    | int  | YES  |     | NULL    |       |
+-------+------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> select * from test1;
+------+
| no   |
+------+
|    1 |
|    2 |
|    3 |
+------+
3 rows in set (0.00 sec)

mysql> select * from test2;
+------+
| no   |
+------+
|    5 |
|    6 |
|    3 |
+------+
3 rows in set (0.00 sec)

UNION

중복된 값을 제외하고 조회

ex) test1, 2 table로 확인
중복이 되는 데이터 '3'이 중복되어 하나만 조회가 되었다.

mysql> select * from test1
    -> union
    -> select * from test2;
+------+
| no   |
+------+
|    1 |
|    2 |
|    3 |
|    5 |
|    6 |
+------+
5 rows in set (0.00 sec)

ex) 성별이 여자인 데이터를 검색하는 쿼리와 소속사가 YG엔터테이먼트인 데이터를 검색하는 쿼리를 union으로 실행 조회.

mysql> select * from celeb where sex='F'
    -> union
    -> select * from celeb where agency='YG엔터테이먼트';
+----+-----------+------------+------+------+-------------------------+--------------------------+
| ID | NAME      | BIRTHDAY   | AGE  | SEX  | JOB_TITLE               | AGENCY                   |
+----+-----------+------------+------+------+-------------------------+--------------------------+
|  1 | 아이유    | 1993-05-16 |   29 | F    | 가수, 텔런트            | EDAM엔터테이먼트         |
|  2 | 이미주    | 1994-09-23 |   28 | F    | 가수                    | 울림엔터테이먼트         |
|  7 | 이수현    | 1999-05-04 |   23 | F    | 가수                    | YG엔터테이먼트           |
|  4 | 강동원    | 1981-01-18 |   41 | M    | 영화배우, 텔런트        | YG엔터테이먼트           |
|  6 | 차승원    | 1970-06-07 |   48 | M    | 영화배우, 모델          | YG엔터테이먼트           |
+----+-----------+------------+------+------+-------------------------+--------------------------+
5 rows in set (0.00 sec)

UNION ALL

중복된 값도 모두 조회

ex) test1, 2 table로 확인
중복이 되는 데이터 '3'이 중복되어도 모두 조회가 되었다.

mysql> select * from test1
    -> union all
    -> select * from test2;
+------+
| no   |
+------+
|    1 |
|    2 |
|    3 |
|    5 |
|    6 |
|    3 |
+------+
6 rows in set (0.00 sec)

ex) 성별이 여자인 데이터를 검색하는 쿼리와 소속사가 YG엔터테이먼트인 데이터를 검색하는 쿼리를 union all로 실행 조회

mysql> select * from celeb where sex='F'
    -> union all
    -> select * from celeb where agency='YG엔터테이먼트';
+----+-----------+------------+------+------+-------------------------+--------------------------+
| ID | NAME      | BIRTHDAY   | AGE  | SEX  | JOB_TITLE               | AGENCY                   |
+----+-----------+------------+------+------+-------------------------+--------------------------+
|  1 | 아이유    | 1993-05-16 |   29 | F    | 가수, 텔런트            | EDAM엔터테이먼트         |
|  2 | 이미주    | 1994-09-23 |   28 | F    | 가수                    | 울림엔터테이먼트         |
|  7 | 이수현    | 1999-05-04 |   23 | F    | 가수                    | YG엔터테이먼트           | # 중복
|  4 | 강동원    | 1981-01-18 |   41 | M    | 영화배우, 텔런트        | YG엔터테이먼트           |
|  6 | 차승원    | 1970-06-07 |   48 | M    | 영화배우, 모델          | YG엔터테이먼트           |
|  7 | 이수현    | 1999-05-04 |   23 | F    | 가수                    | YG엔터테이먼트           | # 중복
+----+-----------+------------+------+------+-------------------------+--------------------------+
6 rows in set (0.00 sec)

컬럼이 개수가 다른 경우

컬럼이 개수가 다른 경우 에러가 발생하며 조회가 되지 않는다.

ex) 가수가 직업인 셀럽의 이름, 직업을 검색하는 쿼리와, 1980년대에 태어난 셀럽의 이름, 생년월일, 나이를 검색하는 쿼리를 union으로 실행 조회
이름, 직업(2개의 컬럼)과 이름, 생년월일, 나이(3개의 컬럼)으로 컬럼 개수가 맞지 않아 에러 발생

mysql> select name, job_title from celeb where job_title like '%가수%'
    -> union
    -> select name, birthday, age from celeb
    -> where age between '1980-01-01' and '1989-12-31';
ERROR 1222 (21000): The used SELECT statements have a different number of columns # 컬럼 개수가 다르다는 에러 발생
profile
데이터 굽는 타자기

0개의 댓글