UNION
여러 개의 SQL 문을 합쳐서 하나의 SQL 문으로 만들어주는 방법
(주의. 칼럼의 개수가 같아야한다.)
UNION 문법
union: 중복된 값을 제거하여 알려준다.
union all: 중복된 값도 포함하여 모두 보여준다.
예)
성별이 여자인 데이터를 검색하는 쿼리와
소속사가 yg엔터테이먼트인 데이터를 검색하는 쿼리를 union all 로 실행해주세요.
mysql> select name,sex,agency from celab where sex='F'
-> UNION
-> select name,sex,agency from celab where agency='YG엔터테이먼트';
+-----------+------+--------------------------+
| name | sex | agency |
+-----------+------+--------------------------+
| 아이유 | F | EDAM엔터데이먼트 |
| 이미주 | F | 울림엔터데이먼트 |
| 이수현 | F | YG엔터테이먼트 |
| 강동원 | M | YG엔터테이먼트 |
| 차승원 | M | YG엔터테이먼트 |
+-----------+------+--------------------------+
예)
가수가 직업인 연예인의 이름,직업을 검색하는 쿼리와
1980 년대에 태어난 연예인의 이름,생년월일,나이를 검색하는 쿼리를
union으로 실행해주세요.
mysql> select name,job_title from celab where job_title LIKE '%가수%'
-> UNION
-> select name,birthday from celab where birthday BETWEEN '1980-01-01' AND '1989-12-3';
+-----------+------------------+
| name | job_title |
+-----------+------------------+
| 아이유 | 가수,텔런트 |
| 이미주 | 가수 |
| 이수현 | 가수 |
| 강동원 | 1981-01-18 |
+-----------+------------------+
JOIN
INNER JOIN
두 개의 테이블에서 공통된 요소들을 통해 결합하는 조인방식 (교집합)
예)
SNL_SHOW에 호스트로 출연한 CELEB을 기준으로
CELEB 테이블과 SNL_SHOW 테이블을 INNER JOIN 해주세요
mysql> select celab.id, celab.name, snl_show.id, snl_show.host
-> from celab
-> INNER JOIN snl_show
-> ON celab.name=snl_show.host;
+----+-----------+----+-----------+
| id | name | id | host |
+----+-----------+----+-----------+
| 5 | 강동원 | 1 | 강동원 |
| 4 | 유재석 | 2 | 유재석 |
| 6 | 차승원 | 3 | 차승원 |
| 7 | 이수현 | 4 | 이수현 |
+----+-----------+----+-----------+
LEFT JOIN
두 개의 테이블에서 공통영역을 포함해
왼쪽 테이블의 다른 데이터를 포함하는 조인 방식
예)
SNL_SHOW 호스트로 출연한 CELEB을 기준으로 CELEB 테이블과 SNL_SHOW 테이블을 LEFT JOIN 해주세요.
mysql> select celab.id,celab.name, snl_show.id, snl_show.host
-> from celab
-> left join snl_show
-> on celab.name=snl_show.host;
+----+-----------+------+-----------+
| id | name | id | host |
+----+-----------+------+-----------+
| 1 | 아이유 | NULL | NULL |
| 2 | 이미주 | NULL | NULL |
| 3 | 송강 | NULL | NULL |
| 4 | 유재석 | 2 | 유재석 |
| 5 | 강동원 | 1 | 강동원 |
| 6 | 차승원 | 3 | 차승원 |
| 7 | 이수현 | 4 | 이수현 |
+----+-----------+------+-----------+
RIGHT JOIN
두 개의 테이블에서 공통영역을 포함해
오른쪽 테이블의 다른 데이터를 포함하는 조인 방식
예)
SNL_SHOW 호스트로 출연한 CELEB을 기준으로 CELEB 테이블과 SNL_SHOW 테이블을 RIGHT JOIN 해주세요.
mysql> select celab.id,celab.name, snl_show.id, snl_show.host
-> from celab
-> right join snl_show
-> on celab.name=snl_show.host;
+------+-----------+----+-----------+
| id | name | id | host |
+------+-----------+----+-----------+
| 5 | 강동원 | 1 | 강동원 |
| 4 | 유재석 | 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
두 개의 테이블에서 공통영역을 포함하여
양쪽 테이블의 다른 영역을 모두 포함하는 조인방식(합집합)
예)
SNL_SHOW 호스트로 출연한 CELEB을 기준으로 CELEB 테이블과 SNL_SHOW 테이블을 FULL OUTER JOIN 해주세요.
mysql> select celab.id,celab.name,snl_show.id,snl_show.host
-> from celab
-> left join snl_show
-> on celab.name=snl_show.host
-> UNION
-> select celab.id, celab.name, snl_show.id, snl_show.host
-> from celab
-> right join snl_show
-> on celab.name=snl_show.host;
+------+-----------+------+-----------+
| id | name | id | host |
+------+-----------+------+-----------+
| 1 | 아이유 | NULL | NULL |
| 2 | 이미주 | NULL | NULL |
| 3 | 송강 | NULL | NULL |
| 4 | 유재석 | 2 | 유재석 |
| 5 | 강동원 | 1 | 강동원 |
| 6 | 차승원 | 3 | 차승원 |
| 7 | 이수현 | 4 | 이수현 |
| NULL | NULL | 5 | 이병헌 |
| NULL | NULL | 6 | 하지원 |
| NULL | NULL | 7 | 제시 |
| NULL | NULL | 8 | 조정석 |
| NULL | NULL | 9 | 조여정 |
| NULL | NULL | 10 | 옥주현 |
+------+-----------+------+-----------+
SELF JOIN
예)
celeb 테이블의 연예인 중, snl_show에 host로 출연했고,
소속사가 안테나인 사람의 이름과 직업을 검색해주세요.
mysql> select celab.name,celab.job_title
-> from celab,snl_show
-> where celab.name=snl_show.host AND celab.agency='안테나';
+-----------+--------------+
| name | job_title |
+-----------+--------------+
| 유재석 | MC,개그맨 |
+-----------+--------------+
예)
celab 테이블의 연예인 중 snl_show에 host로 출연했고
영화배우 아니면서 YG엔터테이먼트 소속이거나,
40세 이상이면서 yg엔터테이먼트 소속이 아닌 연예인의 이름과 나이,
직업,소속사,시즌,에피소드 정보를 검색해주세요.
mysql> select celab.name, celab.age, celab.job_title, celab.agency, snl_show.season, snl_show.episode
-> from celab,snl_show
-> where celab.name=snl_show.host
-> AND((NOT job_title LIKE '%영화배우%' AND agency='YG엔터테이먼트')OR (age>=40 AND agency!='YG엔터테이먼트'));
+-----------+------+--------------+----------------------+--------+---------+
| name | age | job_title | agency | season | episode |
+-----------+------+--------------+----------------------+--------+---------+
| 유재석 | 50 | MC,개그맨 | 안테나 | 8 | 8 |
| 이수현 | 23 | 가수 | YG엔터테이먼트 | 8 | 10 |
+-----------+------+--------------+----------------------+--------+---------+
예)
snl_show 시즌 8에 출연한 celab 중,
에피소드 7,9,10 중에 출연했거나, 소속사가 yg로 시작하고 뒤에 6글자로 끝나는 사람 중 작년 9월 15일 이후에 출연했던 사람을 검색해주세요.
mysql> select name,season,episode,broadcast_date,agency
-> from celab,snl_show
-> where name=host
-> AND ( episode IN(7,9,10) OR agency LIKE 'YG_____')
-> AND broadcast_date>'2020-09-15';
+-----------+--------+---------+----------------+----------------------+
| name | season | episode | broadcast_date | agency |
+-----------+--------+---------+----------------+----------------------+
| 차승원 | 8 | 9 | 2020-09-19 | YG엔터테이먼트 |
| 이수현 | 8 | 10 | 2020-09-26 | YG엔터테이먼트 |
+-----------+--------+---------+----------------+----------------------+