[SQL] 다양한 쿼리(Query) : UNION, JOIN, CONCAT, DISTINCT, LIMIT

·2023년 4월 19일
0

[SQL]

목록 보기
3/3

UNION : 데이터 병합

 select * from test1;
+------+
| no   |
+------+
|    1 |
|    2 |
|    3 |
+------+
 select * from test2;
+------+
| no   |
+------+
|    5 |
|    6 |
|    3 |
+------+

UNION

  • 중복된 값을 제거하여 알려준다
 select * from test1
 union all
 select * from test2;
+------+
| no   |
+------+
|    1 |
|    2 |
|    3 |
|    5 |
|    6 |
+------+

UNION ALL

  • 중복된 값도 모두 보여준다
 select * from test1
 union
 select * from test2;
+------+
| no   |
+------+
|    1 |
|    2 |
|    3 |
|    5 |
|    6 |
|    3 |
+------+

실습 예제


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 |   58 | M    | MC, 개그맨              | 안테나
      |
|  6 | 차승원    | 1970-06-07 |   48 | M    | 영화배우, 모델          | YG엔터테이먼트           |
|  7 | 이수현    | 1999-05-04 |   23 | F    | 가수                    | YG엔터테이먼트           |
+----+-----------+------------+------+------+-------------------------+--------------------------+

 📑성별이 여자인 데이터를 검색하는 쿼리와 소속사가 YG엔터테이먼트인 데이터를 검색하는 쿼리를 UNION ALL로 실행 
 
select name, sex, agency from celeb where sex = 'F'
UNION ALL
select name, sex, agency from celeb where agency like 'YG%';
+-----------+------+--------------------------+
| name      | sex  | agency                   |
+-----------+------+--------------------------+
| 아이유    | F    | EDAM엔터테이먼트         |
| 이미주    | F    | 울림엔터테이먼트         |
| 이수현    | F    | YG엔터테이먼트           |
| 강동원    | M    | YG엔터테이먼트           |
| 차승원    | M    | YG엔터테이먼트           |
| 이수현    | F    | YG엔터테이먼트           |
+-----------+------+--------------------------+

📑가수가 직업인 연예인의 이름, 직업을 검색하는 쿼리와, 1980년대에 태어난 연예인이 이름, 생년월일, 나이를 검색하는 쿼리를 UNION으로 실행 
select name, job_title from celeb where job_title like '%가수%'
UNION
select name, birthday, age from celeb where birthday between '19800101' and '19801231';
ERROR 1222 (21000): The used SELECT statements have a different number of columns

❗컬럼의 길이가 다르면 error 발생




JOIN : 데이터 결합

  • 새로운 테이블 생성
 <create table snl_show (
    -> ID int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> SEASON int NOT NULL,
    -> EPISODE int NOT NULL,
    -> BROADCAST_DATE date,
    -> HOST varchar(32) NOT NULL
    -> );
+----------------+-------------+------+-----+---------+----------------+
| Field          | Type        | Null | Key | Default | Extra          |
+----------------+-------------+------+-----+---------+----------------+
| ID             | int         | NO   | PRI | NULL    | auto_increment |
| SEASON         | int         | NO   |     | NULL    |                |
| EPISODE        | int         | NO   |     | NULL    |                |
| BROADCAST_DATE | date        | YES  |     | NULL    |                |
| HOST           | varchar(32) | NO   |     | NULL    |                |
+----------------+-------------+------+-----+---------+----------------+
  • 데이터 확인
+----+--------+---------+----------------+-----------+
| ID | SEASON | EPISODE | BROADCAST_DATE | HOST      |
+----+--------+---------+----------------+-----------+
|  1 |      8 |       7 | 2020-09-05     | 강동원    |
|  2 |      8 |       8 | 2020-09-12     | 유재석    |
|  3 |      8 |       9 | 2020-09-19     | 차승원    |
|  4 |      8 |      10 | 2020-09-26     | 이수현    |
|  5 |      9 |       1 | 2021-09-04     | 이병헌    |
|  6 |      9 |       2 | 2021-09-11     | 하지원    |
|  7 |      9 |       3 | 2021-09-18     | 제시      |
|  8 |      9 |       4 | 2021-09-25     | 조정석    |
|  9 |      9 |       5 | 2021-10-02     | 조여정    |
| 10 |      9 |       6 | 2021-10-09     | 옥주현    |
+----+--------+---------+----------------+-----------+

JOIN


INNER JOIN : 두 테이블의 공통된 요소들을 통해 결합

select celeb.id, celeb.name, snl_show.id, snl_show.host
from celeb
inner join snl_show
on celeb.name=snl_show.host;
+----+-----------+----+-----------+
| id | name      | id | host      |
+----+-----------+----+-----------+
|  4 | 강동원    |  1 | 강동원    |
|  5 | 유재석    |  2 | 유재석    |
|  6 | 차승원    |  3 | 차승원    |
|  7 | 이수현    |  4 | 이수현    |
+----+-----------+----+-----------+

LEFT JOIN : 두개의 테이블에서 공통영역을 포함해 왼쪽 테이블의 다른 데이터를 포함하는 조인방식

select celeb.id, celeb.name, snl_show.id, snl_show.host
    -> from celeb
    -> left join snl_show
    -> on celeb.name = snl_show.host;
+----+-----------+------+-----------+
| id | name      | id   | host      |
+----+-----------+------+-----------+
|  1 | 아이유    | NULL | NULL      |
|  2 | 이미주    | NULL | NULL      |
|  3 | 송강      | NULL | NULL      |
|  4 | 강동원    |    1 | 강동원    |
|  5 | 유재석    |    2 | 유재석    |
|  6 | 차승원    |    3 | 차승원    |
|  7 | 이수현    |    4 | 이수현    |
+----+-----------+------+-----------+

RIGHT JOIN : 두개의 테이블에서 공통영역을 포함해 오른쪽 테이블의 다른 데이터를 포함하는 조인방식

select celeb.id, celeb.name, snl_show.id, snl_show.host
    -> from celeb
    -> right join snl_show
    -> on celeb.name=snl_show.host;
+------+-----------+----+-----------+
| id   | name      | id | host      |
+------+-----------+----+-----------+
|    4 | 강동원    |  1 | 강동원    |
|    5 | 유재석    |  2 | 유재석    |
|    6 | 차승원    |  3 | 차승원    |
|    7 | 이수현    |  4 | 이수현    |
| NULL | NULL      |  5 | 이병헌    |
| NULL | NULL      |  6 | 하지원    |
| NULL | NULL      |  7 | 제시      |
| NULL | NULL      |  8 | 조정석    |
| NULL | NULL      |  9 | 조여정    |
| NULL | NULL      | 10 | 옥주현    |
+------+-----------+----+-----------+

FULL OUTER JOIN : 두개의 테이블에서 공통영역을 포함하여 양쪽 테이블의 다른 영역을 모두 포함하는 조인 방식

❗ MYSQL은 지원하지 않음

LEFT JOIN UNION RIGHT JOIN 이용

 select celeb.id, celeb.name, snl_show.id, snl_show.host
    -> from celeb
    -> left join snl_show
    -> on celeb.name=snl_show.host
    -> UNION
    -> select celeb.id, celeb.name, snl_show.id, snl_show.host
    -> from celeb
    -> right join snl_show
    -> on celeb.name=snl_show.host
    -> ;
+------+-----------+------+-----------+
| id   | name      | id   | host      |
+------+-----------+------+-----------+
|    1 | 아이유    | NULL | NULL      |
|    2 | 이미주    | NULL | NULL      |
|    3 | 송강      | NULL | NULL      |
|    4 | 강동원    |    1 | 강동원    |
|    5 | 유재석    |    2 | 유재석    |
|    6 | 차승원    |    3 | 차승원    |
|    7 | 이수현    |    4 | 이수현    |
| NULL | NULL      |    5 | 이병헌    |
| NULL | NULL      |    6 | 하지원    |
| NULL | NULL      |    7 | 제시      |
| NULL | NULL      |    8 | 조정석    |
| NULL | NULL      |    9 | 조여정    |
| NULL | NULL      |   10 | 옥주현    |
+------+-----------+------+-----------+

SELF JOIN


📑snl_show 에 호스트로 출연한 celeb을 기준으로 celeb 테이블과 snl_show 테이블을 SELF JOIN 
select celeb.id, celeb.name, snl_show.id, snl_show.host
    -> from celeb, snl_show
    -> where celeb.name=snl_show.host;
+----+-----------+----+-----------+
| id | name      | id | host      |
+----+-----------+----+-----------+
|  4 | 강동원    |  1 | 강동원    |
|  5 | 유재석    |  2 | 유재석    |
|  6 | 차승원    |  3 | 차승원    |
|  7 | 이수현    |  4 | 이수현    |
+----+-----------+----+-----------+

📑celeb 테이블의 연예인 중, snl_show에 호스트로 출연했고 소속사가 안테나인 사람의 이름과 직업을 겁색 
 <select celeb.name, celeb.job_title from celeb, snl_show
    -> where celeb.name=snl_show.host and celeb.agency='안테나';
+-----------+---------------+
| name      | job_title     |
+-----------+---------------+
| 유재석    | MC, 개그맨    |
+-----------+---------------+

📑celeb 테이블의 연예인 중, snl_show에 호스트로 출연했고, 영화배우는 아니면서 YG소속이거나 40세 이상이면서 YG 소속이 아닌 옌예인의 이름, 나이, 직업, 소속사, 시즌, 에피소드 정보 검색 
 <select celeb.name, celeb.age, celeb.job_title, snl_show.season, snl_show.episode
    -> from celeb, snl_show
    -> where (celeb.name = snl_show.host) and
    -> ((celeb.agency like 'YG%' and not celeb.job_title like '%영화배우%') or (celeb.age >=40 and not celeb.agency like 'YG%'));
+-----------+------+---------------+--------+---------+
| name      | age  | job_title     | season | episode |
+-----------+------+---------------+--------+---------+
| 유재석    |   58 | MC, 개그맨    |      8 |       8 |
| 이수현    |   23 | 가수          |      8 |      10 |
+-----------+------+---------------+--------+---------+

두 테이블에서 동일한 컬럼명이 아닌경우 테이블 명은 생략 가능

 <select name, age, job_title, season, episode
    -> from celeb, snl_show
    -> where (name = host) and
    -> ((agency like 'YG%' and not job_title like '%영화배우%') or (age >=40 and not agency like 'YG%'));
+-----------+------+---------------+--------+---------+
| name      | age  | job_title     | season | episode |
+-----------+------+---------------+--------+---------+
| 유재석    |   58 | MC, 개그맨    |      8 |       8 |
| 이수현    |   23 | 가수          |      8 |      10 |
+-----------+------+---------------+--------+---------+

📑snl_shoe에 출연한 celeb 중, 에피소드 7, 9, 10 중에 출연했거나 소속사가 YG로 시작하고 뒤레 6글자로 끝나는 사람 중 작년 9월 15일 이후에 출영했던 사람 검색 
select name, season, agency,broadcast_date, agency
   -> from celeb, snl_show
   -> where name=host and ((episode in (7,9,10)) or (agency like 'YG______' and broadcast_date >=20200915));
+-----------+--------+----------------------+----------------+----------------------+
| name      | season | agency               | broadcast_date | agency               |
+-----------+--------+----------------------+----------------+----------------------+
| 강동원    |      8 | YG엔터테이먼트       | 2020-09-05     | YG엔터테이먼트       |
| 차승원    |      8 | YG엔터테이먼트       | 2020-09-19     | YG엔터테이먼트       |
| 이수현    |      8 | YG엔터테이먼트       | 2020-09-26     | YG엔터테이먼트       |
+-----------+--------+----------------------+----------------+----------------------+

CONCAT

여러 문자열을 합치거나 연결

 <select concat ('concat', ' ' , 'test');
+---------------------------------+
| concat ('concat', ' ' , 'test') |
+---------------------------------+
| concat test                     |
+---------------------------------+
 select concat ('이름 : ',name) from celeb;
+---------------------------+
| concat ('이름 : ',name)   |
+---------------------------+
| 이름 : 아이유             |
| 이름 : 이미주             |
| 이름 : 송강               |
| 이름 : 강동원             |
| 이름 : 유재석             |
| 이름 : 차승원             |
| 이름 : 이수현             |
+---------------------------+

별칭 생성

칼럼이나 테이블 이름에 별칭을 생성할 수 있다 .

select name as '이름' , agency as '소속사' from celeb;
+-----------+--------------------------+
| 이름      | 소속사                   |
+-----------+--------------------------+
| 아이유    | EDAM엔터테이먼트         |
| 이미주    | 울림엔터테이먼트         |
| 송강      | 나무엑터스               |
| 강동원    | YG엔터테이먼트           |
| 유재석    | 안테나                   |
| 차승원    | YG엔터테이먼트           |
| 이수현    | YG엔터테이먼트           |
+-----------+--------------------------+
name과 job_title을 합쳐서 profile 이라는 별칭 생성 
 select concat (name, ' : ',job_title) as profile from celeb;
+-------------------------------------+
| profile                             |
+-------------------------------------+
| 아이유 : 가수, 텔런트               |
| 이미주 : 가수                       |
| 송강 : 텔런트                       |
| 강동원 : 영화배우, 텔런트           |
| 유재석 : MC, 개그맨                 |
| 차승원 : 영화배우, 모델             |
| 이수현 : 가수                       |
+-------------------------------------+
테이블 별칭을 사용한 검색 
select s.season, s.episode, c.name, c.job_title
    -> from celeb as c, snl_show as s
    -> where c.name = s.host;
+--------+---------+-----------+-------------------------+
| season | episode | name      | job_title               |
+--------+---------+-----------+-------------------------+
|      8 |       7 | 강동원    | 영화배우, 텔런트        |
|      8 |       8 | 유재석    | MC, 개그맨              |
|      8 |       9 | 차승원    | 영화배우, 모델          |
|      8 |      10 | 이수현    | 가수                    |
+--------+---------+-----------+-------------------------+

📑시즌+에피소드 : 방송정보, 이름+ 직업 : 출연자 정보 
select concat(s.season, '-', s.episode, '(',s.broadcast_date,')'  ) as '방송정보',
   -> concat(c.name,'(',c.job_title,')') as '출연자 정보'
   -> from celeb as c, snl_show as s
   -> where s.host=c.name;
+------------------+------------------------------------+
| 방송정보         | 출연자 정보                        |
+------------------+------------------------------------+
| 8-7(2020-09-05)  | 강동원(영화배우, 텔런트)           |
| 8-8(2020-09-12)  | 유재석(MC, 개그맨)                 |
| 8-9(2020-09-19)  | 차승원(영화배우, 모델)             |
| 8-10(2020-09-26) | 이수현(가수)                       |
+------------------+------------------------------------+

DISTINCT : 검색결과 중복 제거

select agency from celeb;
+--------------------------+
| agency                   |
+--------------------------+
| EDAM엔터테이먼트         |
| 울림엔터테이먼트         |
| 나무엑터스               |
| YG엔터테이먼트           |
| 안테나                   |
| YG엔터테이먼트           |
| YG엔터테이먼트           |
+--------------------------+
select DISTINCT agency from celeb;
+--------------------------+
| agency                   |
+--------------------------+
| EDAM엔터테이먼트         |
| 울림엔터테이먼트         |
| 나무엑터스               |
| YG엔터테이먼트           |
| 안테나                   |
+--------------------------+

LIMIT : 검색결과를 정렬된 순으로 주어진 숫자 만큼 조회

 <select * from celeb limit 3;
+----+-----------+------------+------+------+-------------------+--------------------------+
| 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명 검색 
elect * from celeb order by age limit 4;
+----+-----------+------------+------+------+-------------------+--------------------------+
| ID | NAME      | BIRTHDAY   | AGE  | SEX  | JOB_TITLE         | AGENCY                   |
+----+-----------+------------+------+------+-------------------+--------------------------+
|  7 | 이수현    | 1999-05-04 |   23 | F    | 가수              | YG엔터테이먼트           |
|  2 | 이미주    | 1994-09-23 |   28 | F    | 가수              | 울림엔터테이먼트         |
|  3 | 송강      | 1994-04-23 |   28 | M    | 텔런트            | 나무엑터스               |
|  1 | 아이유    | 1993-05-16 |   29 | F    | 가수, 텔런트      | EDAM엔터테이먼트         |
+----+-----------+------------+------+------+-------------------+--------------------------+
profile
개발하고싶은사람

0개의 댓글