여러개의 SQL문을 합쳐서 하나의 SQL문으로 만들어주는 방법(단, 칼럼의 갯수가 같아야함)
Select column1, column2, ...From tableA
UNION | UNION ALL
Select column1, column2, ... From tableB;
mysql> select * from test1
-> union all
-> select * from test2;
+------+
| no |
+------+
| 1 |
| 2 |
| 3 |
| 5 |
| 6 |
| 3 |
+------+
6 rows in set (0.00 sec)
ㄴ test1의 모든 데이터와 test2의 모든 데이터를 중복된 값을 포함하여 검색
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 ALL로 실행
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엔터테인먼트 |
+-----------+------+--------------------------+
ㄴ 성별이 여자인 데이터를 검색하는 쿼리와 소속사가 YG엔터테인먼트인 데이터를 검색하는 쿼리를 UNION으로 실행
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
ㄴ 가져오는 칼럼의 갯수가 다르면 ERROR 리턴
두 개이상의 테이블을 결합하는 것
mysql> select * from snl_show;
+----+--------+---------+----------------+-----------+
| 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 | 옥주현 |
+----+--------+---------+----------------+-----------+
공통된 부분만 가져오는 것
SELECT column1, column2,...
FROM tableA
INNER JOIN gableB
ON tableA.column = tableB.column
WHERE condition;
mysql> 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 | 이수현 |
+----+-----------+----+-----------+
ㄴ snl_show에 호스트로 출연한 celeb을 기준으로 celeb 테이블과 snl_show 테이블을 inner join
공통된 부분과 공통되지않은 왼쪽 테이블을 가져오는 것
SELECT column1, column2,...
FROM tableA
LEFT JOINtableB
ON tableA.column= tableB.column
WHERE condition;
mysql> 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 | 이수현 |
+----+-----------+------+-----------+
공통된 부분과 공통되지않은 오른쪽 테이블을 가져오는 것
SELECT column1, column2,...
FROM tableA
RIGHT JOIN tableB
ON tableA.column = tableB.column
WHERE condition;
mysql> 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 | 옥주현 |
+------+-----------+----+-----------+
ㄴ snl_show에 호스트로 출연한 celeb을 기준으로 celeb 체이블과 snl_show테이블을 Right join
공통된 부분과 공통되지 않은 부분 전부 가져오는 것
SELECT column1, column2,...
FROM tableA
FULL OUTER JOIN tableB
ON tableA.column = tableB.column
WHERE condition;
mysql> select celeb.id, celeb.name, snl_show.id, snl_show.host
-> from celeb
-> full outer join snl_show
-> on celeb.name = snl_show.host;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'outer join snl_show
on celeb.name = snl_show.host' at line 3
ㄴ snl_show에 호스트로 출연한 celeb을 기준으로 celeb 테이블과 snl_show 테이블을 Full outer join
*mysql 에서는 FULL OUTER JOIN을 지원하지않음
SELECT column1, column2,...
FROM tableA
LEFT JOIN tableB ON tableA.column = tableB.column
UNION
SELECT column1, column2,...
FROM tableA
RIGHT JOIN tableB ON tableA.column = tableB.column
WHERE condition;
INNER JOIN과 같은 결과(공통된 부분을 가져옴)
SELECT column1, column2,...
FROM tableA, tableB,...
WHERE condition;
mysql> 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 | 이수현 |
+----+-----------+----+-----------+
ㄴ snl_show에 호스트로 출연한 celeb을 기준으로 celeb 테이블과 snl_show 테이블을 SELF JOIN
mysql> 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에 host로 출연했고 소속사가 안테나인 사람의 이름과 직업을 검색
mysql> select celeb.name, celeb.age, celeb.job_title, celeb.agency, snl_show.season, snl_show.episode
-> from celeb, snl_show
-> where celeb.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 | 7 |
| 유재석 | 50 | MC,개그맨 | 안테나 | 8 | 8 |
| 유재석 | 50 | MC,개그맨 | 안테나 | 8 | 9 |
| 이수현 | 23 | 가수 | YG엔터테인먼트 | 8 | 10 |
| 유재석 | 50 | MC,개그맨 | 안테나 | 8 | 10 |
| 유재석 | 50 | MC,개그맨 | 안테나 | 9 | 1 |
| 유재석 | 50 | MC,개그맨 | 안테나 | 9 | 2 |
| 유재석 | 50 | MC,개그맨 | 안테나 | 9 | 3 |
| 유재석 | 50 | MC,개그맨 | 안테나 | 9 | 4 |
| 유재석 | 50 | MC,개그맨 | 안테나 | 9 | 5 |
| 유재석 | 50 | MC,개그맨 | 안테나 | 9 | 6 |
+-----------+------+--------------+----------------------+--------+---------+
ㄴ celeb의 테이블 연예인 중 , snl_show에 host로 출연했고, 영화배우는 아니면서 YG엔터테인먼트 소속이거나 40세 이상이면서 YG엔터테인먼트 소속이 아닌 연예인의 이름과 나이, 직업, 소속사 정보, 시즌, 에피소드 검색 (에러)
mysql> select celeb.name, celeb.age, celeb.job_title, celeb.agency, snl_show.season, snl_show.episode
-> from celeb, snl_show
-> where celeb.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 |
+-----------+------+--------------+----------------------+--------+---------+
ㄴ celeb의 테이블 연예인 중 , snl_show에 host로 출연했고, 영화배우는 아니면서 YG엔터테인먼트 소속이거나 40세 이상이면서 YG엔터테인먼트 소속이 아닌 연예인의 이름과 나이, 직업, 소속사 정보, 시즌, 에피소드 검색