SQL 기초 - UNION

Jungmin·2022년 11월 3일
1

SQL

목록 보기
5/17
post-custom-banner

UNION

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

◾ UNION : 중복된 값을 제거하여 알려줌.

◾ UNION ALL : 중복된 값도 모두 보여줌.

SELECT COL1,COL2,..FROM 테이블명1 UNION|UNION ALL SELECT FROM COL1,COL2,...FROM 테이블명2;

  • 실습환경 설정
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 과 UNION ALL 결과 비교
mysql> SELECT * FROM TEST1 UNION ALL SELECT * FROM TEST2;
+------+
| NO   |
+------+
|    1 |
|    2 |
|    3 |
|    5 |
|    6 |
|    3 |
+------+
6 rows in set (0.00 sec)

mysql> SELECT * FROM TEST1 UNION SELECT * FROM TEST2;
+------+
| NO   |
+------+
|    1 |
|    2 |
|    3 |
|    5 |
|    6 |
+------+
5 rows in set (0.00 sec)
  • 성별이 여자인 데이터를 검색하는 쿼리와 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엔터테이먼트   |
+--------+------+------------------+
6 rows in set (0.00 sec)
  • 성별이 여자인 데이터를 검색하는 쿼리와 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엔터테이먼트   |
+--------+------+------------------+
5 rows in set (0.00 sec)

❌오류 발생의 경우❌

- 가수가 직업인 연예인의 이름, 직업을 검색하는 쿼리와, 1980년대 태어난 연예인의 이름, 생년월일, 나이를 검색하는 쿼리를 UNION으로 실행
✔️가져오는 컬럼과 상관없이 각 테이블에서 가져오는 컬럼의 수가 달라서 에러 발생
  • 💡컬럼의 수는 같으나 다른 컬럼을 가져오는 경우
    - 이름, 성별을 검색하는 쿼리 + 이름, 나이를 검색하는 쿼리의 경우?
    상단의 컬럼 명과 상관없이 일단 합쳐서 출력은 되지만 처음 조건의 컬럼 명만 출력됨.
mysql> SELECT NAME, SEX FROM CELEB WHERE SEX ='F'
    -> UNION
    -> SELECT NAME, AGE FROM CELEB WHERE AGE>30;
+--------+------+
| NAME   | SEX  |
+--------+------+
| 아이유 | F    |
| 이미주 | F    |
| 이수현 | F    |
| 강동원 | 41   |
| 유재석 | 50   |
| 차승원 | 48   |
+--------+------+
6 rows in set (0.00 sec)  
- 각 테이블에서 다 다른 컬럼을 가져오는 경우 (이름,성별 + 나이,소속사)
역시 처음 테이블 컬럼 명만 출력된다.
mysql> SELECT NAME, SEX FROM CELEB WHERE SEX ='F'
    -> UNION
    -> SELECT AGE, AGENCY FROM CELEB WHERE AGE >30;
+--------+----------------+
| NAME   | SEX            |
+--------+----------------+
| 아이유 | F              |
| 이미주 | F              |
| 이수현 | F              |
| 41     | YG엔터테이먼트 |
| 50     | 안테나         |
| 48     | YG엔터테이먼트 |
+--------+----------------+
6 rows in set (0.00 sec)
  • 직업이 가수인 데이터 검색 쿼리와 직업이 탤런트인 데이터 검색 쿼리를 중복 제거하여 실행
mysql> select name, job_title from celeb where job_title like '%가수%'
    -> union
    -> select name, job_title from celeb where job_title like '%탤런트%';
+--------+-----------------+
| name   | job_title       |
+--------+-----------------+
| 아이유 | 가수,탤런트     |
| 이미주 | 가수            |
| 이수현 | 가수            |
| 송강   | 탤런트          |
| 강동원 | 영화배우,탤런트 |
+--------+-----------------+
profile
데이터분석 스터디노트🧐✍️
post-custom-banner

0개의 댓글