SQL 기초 - Union

Yang HyunIl·2023년 2월 7일
0

SQL

목록 보기
6/14
post-thumbnail

실습 환경 만들기

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
profile
ヾ(•ω•`)o

0개의 댓글