<7주차_4일>SQL(4) UNION, JOIN

Nary Kim·2023년 6월 20일
0

UNION 

  • UNION : 중복된 값을 제거하여 알려준다.
  • UNION ALL : 중복된 값도 포함하여 모두 보여준다.
select * from test1
union
select * from test2

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
두 개의 테이블에서 공통영역을 포함해 왼쪽 테이블의 다른 데이터를 포함하는 조인 방식

  • 문제 : snl_show 에 호스트로 출연한 celeb을 기준으로 celeb테이블과 snl_show테이블을 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      |
+----+-----------+------+-----------+
|  4 | 강동원    |    1 | 강동원    |
|  5 | 유재석    |    2 | 유재석    |
|  6 | 차승원    |    3 | 차승원    |
|  7 | 이수현    |    4 | 이수현    |
|  1 | 아이유    | NULL | NULL      |
|  2 | 이미주    | NULL | NULL      |
|  3 | 송강      | NULL | NULL      |
+----+-----------+------+-----------+

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

  • 문제 : snl_show 에 호스트로 출연한 celeb을 기준으로 celeb테이블과 snl_show테이블을 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 에서는 FULL JOIN을 지원하고 있지 않기 때문에 LEFT JOIN과 RIGHT JOIN을 UNION하는 식으로 구현해야한다.

  • 문제 : snl_show 에 호스트로 출연한 celeb을 기준으로 celeb테이블과 snl_show테이블을 full outer 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      |
+------+-----------+------+-----------+
|    4 | 강동원    |    1 | 강동원    |
|    5 | 유재석    |    2 | 유재석    |
|    6 | 차승원    |    3 | 차승원    |
|    7 | 이수현    |    4 | 이수현    |
|    1 | 아이유    | NULL | NULL      |
|    2 | 이미주    | NULL | NULL      |
|    3 | 송강      | NULL | NULL      |
| NULL | NULL      |    5 | 이병헌    |
| NULL | NULL      |    6 | 하지원    |
| NULL | NULL      |    7 | 제시      |
| NULL | NULL      |    8 | 조정석    |
| NULL | NULL      |    9 | 조여정    |
| NULL | NULL      |   10 | 옥주현    |
+------+-----------+------+-----------+

SELF JOIN

  • 컬럼명 앞에 테이블명을 명시
  • 컬럼명만 명시해도 되나, 동일한 이름의 컬럼이 존재하면 그것에는 테리블명을 명시해야한다.
  • 문제 : snl_show 에 호스트로 출연한 celeb을 기준으로 소속사가 안테나인 사람을 찾으세요.
select celeb.id, celeb.name, snl_show.id, snl_show.host 
from celeb, snl_show 
where celeb.name=snl_show.host and celeb.agency='안테나';
+----+-----------+----+-----------+
| id | name      | id | host      |
+----+-----------+----+-----------+
|  5 | 유재석    |  2 | 유재석    |
+----+-----------+----+-----------+

self join에서 가장 중요한 것은 "찾으려는 데이터의 조건이 무엇이냐" 를 파악하는 것이다. 예제나 실습 모두 뭘 찾으라는 건지 잘못이해해서 헤맸다. 문해력이 중요한 시대이다. 책좀 읽어라!

profile
나는 무엇이 될것인가!!

0개의 댓글