실습 환경 만들기
mysql> use zerobase;
Database changed
mysql> select * from celeb;
+----+--------+------------+------+------+------------------+------------------+
| ID | NAME | BIRTHDAY | AGE | SEX | JOB_TITLE | AGENCY |
+----+--------+------------+------+------+------------------+------------------+
| 1 | 아이유 | 1993-05-16 | 29 | F | 가수, 탤런트 | EDAM엔터테인먼트 |
| 2 | 이미주 | 1994-09-23 | 28 | F | 가수 | 울림엔터테인먼트 |
| 3 | 송강 | 1994-04-23 | 28 | M | 탤런트 | 나무엑터스 |
| 4 | 강동원 | 1981-01-18 | 41 | M | 영화배우, 탤런트 | YG엔터테인먼트 |
| 5 | 유재석 | 1972-08-14 | 50 | M | MC, 개그맨 | 안테나 |
| 6 | 차승원 | 1970-06-07 | 48 | M | 영화배우, 모델 | YG엔터테인먼트 |
| 7 | 이수현 | 1999-05-04 | 23 | F | 가수 | YG엔터테인먼트 |
+----+--------+------------+------+------+------------------+------------------+
테스트용 테이블 및 데이터 추가
mysql> create table test1
-> (
-> no int
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> create table test2
-> (
-> no int
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+--------------------+
| Tables_in_zerobase |
+--------------------+
| celeb |
| test1 |
| test2 |
+--------------------+
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.00 sec)
mysql> INSERT INTO test1 VALUES (3);
Query OK, 1 row affected (0.00 sec)
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.00 sec)
mysql> select * from test1;
+------+
| no |
+------+
| 1 |
| 2 |
| 3 |
+------+
mysql> select * from test2;
+------+
| no |
+------+
| 5 |
| 6 |
| 3 |
+------+
UNION
- 여러개의 SQL문을 합쳐서 하나의 SQL문으로 만들어주는 방법
❗ 칼럼 개수 같아야함
UNION 문법
- UNION : 중복된 값을 제거하여 알려준다.
- UNION ALL : 중복된 값도 모두 보여준다.
SELECT column1, column2, ... FROM tableA
UNION | UNION ALL
SELECT column1, column2, ... FROM tableB;
예제 1
- test1의 모든 데이터와 test2의 모든 데이터를 중복된 값을 포함하여 검색
mysql> select * from test1
-> union
-> select * from test2;
+------+
| no |
+------+
| 1 |
| 2 |
| 3 |
| 5 |
| 6 |
+------+
- test1의 모든 데이터와 test2의 모든 데이터를 중복된 값을 포함하여 검색
mysql> select * from test1
-> union all
-> select * from test2;
+------+
| no |
+------+
| 1 |
| 2 |
| 3 |
| 5 |
| 6 |
| 3 |
+------+
예제 2
- 성별이 여자인 데이터를 검색하는 쿼리와 소속사가 YG엔터테인먼트인 데이터를 검색하는 쿼리를 UNION ALL로 실행
mysql> select name, sex, agency from celeb where sex='F'
-> UNION ALL
-> select name, sex, agency from celeb where agency='yg엔터테인먼트';
+--------+------+------------------+
| name | sex | agency |
+--------+------+------------------+
| 아이유 | F | EDAM엔터테인먼트 |
| 이미주 | F | 울림엔터테인먼트 |
| 이수현 | F | YG엔터테인먼트 |
| 강동원 | M | YG엔터테인먼트 |
| 차승원 | M | YG엔터테인먼트 |
| 이수현 | F | YG엔터테인먼트 |
+--------+------+------------------+
- 성별이 여자인 데이터를 검색하는 쿼리와 소속사가 YG엔터테인먼트인 데이터를 검색하는 쿼리를 UNION으로 실행
mysql> select name, sex, agency from celeb where sex='F'
-> union
-> select name, sex, agency from celeb where agency='yg엔터테인먼트';
+--------+------+------------------+
| name | sex | agency |
+--------+------+------------------+
| 아이유 | F | EDAM엔터테인먼트 |
| 이미주 | F | 울림엔터테인먼트 |
| 이수현 | F | YG엔터테인먼트 |
| 강동원 | M | YG엔터테인먼트 |
| 차승원 | M | YG엔터테인먼트 |
+--------+------+------------------+
예제 3
- 가수가 직업인 연예인의 이름, 직업을 검색하는 쿼리와, 1980년대에 태어난 연예인의 이름, 생년월일, 나이를 검색하는 쿼리를 UNION으로 실행
mysql> select name, birthday, age from celeb where birthday between '1980-01-01' and '1989-12-31';
+--------+------------+------+
| name | birthday | age |
+--------+------------+------+
| 강동원 | 1981-01-18 | 41 |
+--------+------------+------+
1 row in set (0.00 sec)
mysql> select name, job_title from celeb where job_title like '%가수%';
+--------+--------------+
| name | job_title |
+--------+--------------+
| 아이유 | 가수, 탤런트 |
| 이미주 | 가수 |
| 이수현 | 가수 |
+--------+--------------+
3 rows in set (0.00 sec)
mysql> select name, job_title from celeb where job_title like '%가수%'
-> union
-> select name, birthday, age from celeb where birthday between '1980-01-01' and '1989-12-31';
ERROR 1222 (21000): The used SELECT statements have a different number of columns