[제로베이스][SQL] Union, Join

한결·2024년 1월 24일
post-thumbnail

UNION

준비하기

mysql> create table test1
    -> (
    -> no int
    -> );

mysql> create table test2
    -> (
    -> no int
    -> );

mysql> insert into test1 values (1);

mysql> insert into test1 values (2);

mysql> insert into test1 values (3);

mysql> insert into test2 values (5);

mysql> insert into test2 values (6);

mysql> insert into test2 values (3);

UNION

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

  • UNION : 중복된 값을 제거하여 알려준다.
  • UNION ALL : 중복된 값도 모두 보여준다.

SELECT column1, column2, ... FROM tableA
UNION | UNION ALL
SELECT column1, column2, ... FROM tableB;

mysql> select * from test1
    -> union all
    -> select * from test2;


mysql> select * from test1
    -> union
    -> select * from test2;

위에와 다르게 중복된 3은 하나만 출력됩니다.


  1. 성별이 여자인 데이터를 검색하는 쿼리와 소속사가 YG엔터테인먼트인 데이터를 검색하는 쿼리를 UNION ALL로 실행
mysql> select name,sex,agency from celeb where sex='f'
    -> union all
    -> select name,sex,agency from celeb where agency='YG엔터테인먼트';


  1. 성별이 여자인 데이터를 검색하는 쿼리와 소속사가 YG엔터테인먼트인 데이터를 검색하는 쿼리를 UNION으로 실행
mysql> select name,sex,agency from celeb where sex='f'
    -> union 
    -> select name,sex,agency from celeb where agency='YG엔터테인먼트';


JOIN

준비하기

mysql> insert into snl_show values(1,8,7,'2020-09-05','강동원');
Query OK, 1 row affected (0.00 sec)

mysql> insert into snl_show values(2,8,8,'2020-09-12','유재석');
Query OK, 1 row affected (0.01 sec)

mysql> insert into snl_show values(3,8,9,'2020-09-19','차승원');
Query OK, 1 row affected (0.00 sec)

mysql> insert into snl_show values(4,8,10,'2020-09-26','이수현');
Query OK, 1 row affected (0.01 sec)

mysql> insert into snl_show values(5,9,1,'2021-09-04','이병헌');
Query OK, 1 row affected (0.00 sec)

mysql> insert into snl_show values(6,9,2,'2021-09-11','하지원');

mysql> insert into snl_show values(7,9,3,'2021-09-18','제시');

mysql> insert into snl_show values(8,9,4,'2021-09-25','조정석');

mysql> insert into snl_show values(9,9,5,'2021-10-02','조여정');

mysql> insert into snl_show values(10,9,6,'2021-10-09','옥주현');

mysql> select * from snl)show;


JOIN

INNER JOIN

두개의 테이블에서 공통된 요소들을 통해 결합하는 조인방식

SELECT column1, column2, ...
FROM tableA
INNER JOIN tableB
ON tableA.column = tableB.column
WHERE condition;

  1. snl_show에 호스트로 출연한 celeb을 기준으로 celeb 테이블과 snl_show 테이블을 INNER JOIN
mysql> select celeb.id, celeb.name, snl_show.id, snl_show.host
    -> from celeb
    -> inner join snl_show
    -> on celeb.name = snl_show.host;


LEFT JOIN

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

SELECT column1, column2, ...
FROM tableA
LEFT JOIN tableB
ON tableA.column = tableB.column
WHERE condition;

  1. snl_show에 호스트로 출연한 celeb을 기준으로 celeb 테이블과 snl_show 테이블을 LEFT JOIN
mysql> select celeb.id, celeb.name, snl_show.id, snl_show.host
    -> from celeb
    -> left join snl_show
    -> on celeb.name = snl_show.host;

celeb 기준으로 합쳐졌기에, snl_show에는 존재 안하는 celeb 데이터들은 NULL로 표기된 것을 확인할 수 있습니다.


RIGHT JOIN

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

SELECT column1, column2, ...
FROM tableA
RIGHT JOIN tableB
ON tableA.column = tableB.column
WHERE condition;

  1. snl_show에 호스트로 출연한 celeb을 기준으로 celeb 테이블과 snl_show 테이블을 RIGHT JOIN
mysql> select celeb.id, celeb.name, snl_show.id, snl_show.host
    -> from celeb
    -> right join snl_show
    -> on celeb.name = snl_show.host;

snl_show에는 존재하지만 celeb에는 존재하지 않는 데이터들은 NULL로 표기된것을 확인할 수 있습니다.


FULL OUTER JOIN

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

SELECT column1, column2, ...
FROM tableA
FULL OUTER JOIN tableB
ON tableA.column = tableB.column
WHERE condition;

❗️MySQL은 FULL JOIN을 지원하지 않아 오류가 뜰 수 있다.


SELF JOIN

SELECT column1, column2, ...
FROM tableA, tableB, ...
WHERE condition;

  1. snl_show에 호스트로 출연한 celeb을 기준으로 celeb 테이블과 snl_show 테이블을 SELF JOIN
mysql> select celeb.id, celeb.name, snl_show.id, snl_show.host
    -> from celeb, snl_show
    -> where celeb.name = snl_show.host;


  1. celeb 테이블의 연예인 중, snl_show에 host로 출연했고 소속사가 안테나인 사람의 이름과 직업을 검색
mysql> select celeb.name, celeb.job_title
    -> from celeb, snl_show
    -> where celeb.name = snl_show.host
    -> and agency='안테나';


  1. celeb 테이블의 연예인 중, snl_show에 host로 출연했고, 영화배우는 아니면서 YG엔터테인먼트 소속이거나 40세 이상이면서 YG엔터테인먼트 소속이 아닌 연예인의 이름과 나이, 직업, 소속사, 시즌, 에피소드 정보를 검색
mysql> select name, age, job_title, agency, season, 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엔터테인먼트'));


  1. snl_show에 출연한 연예인의 snl_show 아이디, 시즌, 에피소드, 이름, 직업 정보를 검색
mysql> select snl_show.ID, season,episode, celeb.name, celeb.job_title
    -> from celeb, snl_show
    -> where celeb.name = snl_show.host;


  1. snl_show에 출연한 celeb 중, 에피소드 7,9,10 중에 출연했거나 소속사가 YG로 시작하고 뒤에 6글자로 끝나는 사람 중 2020년 9월15일 이후에 출연했던 사람을 검색
mysql> select name,season,episode,broadcast_date,agency
    -> from celeb, snl_show
    -> where name=host
    -> and (episode in (7,9,10) or agency like 'YG______')
    -> and broadcast_date>'2020-09-15';

profile
낭만젊음사랑

0개의 댓글