SQL - JOIN, SELF JOIN

Bean·2024년 2월 13일

Data

목록 보기
6/14

JOIN

  • 두 개 이상의 테이블을 결합하는 것
  • JOIN의 종류엔 네 개가 있다
  • UNION이 수직 결합이라면 JOIN은 수평결합 형태
-- 문법
SELECT tableA.column1, tableB,column1,...  -- 다중테이블 호출 시 table이름.칼럼명을 명시해야한다
FROM tableA		-- LEFT TABLE
LEFT JOIN | RIGHT JOIN | INNER JOIN | FULL JOIN tableB	 -- RIGHT TABLE
ON tableA.column1 = tableB.column1	 -- 두 테이블의 JOIN 기준을 제공, 각 칼럼에 같은 DATA만 가져옴
WHERE condition;

LEFT JOIN, RIGHT JOIN

  • 두 개의 테이블에서 공통영역을 포함해 왼쪽 OR 오른쪽 테이블의 데이터를 포함하여 가져옴

  • LEFT JOIN인 경우 공통영역+왼쪽 테이블의 데이터를 가져오는데 오른쪽 테이블에 없는 데이터라면 NULL값으로 호출됨

    (예제)

    mysql> select celeb.ID, celeb.NAME, snl_show.ID, snl_show.HOST, snl_show.SEASON
      -> from celeb
      -> right join snl_show
      -> on celeb.name = snl_show.host;
      -- left table(celeb)과 right table(snl_show)의 공통 영역인 name과 host는 정적으로 불러왔고,
      -- select에서 snl_show.season 칼럼의 데이터는 left table(celeb)에 없기 때문에 NULL로 불러온 것
    +------+--------+----+--------+--------+
    | ID   | NAME   | ID | HOST   | SEASON |
    +------+--------+----+--------+--------+
    |    4 | 강동원  |  1 | 강동원 |      8 |
    |    5 | 유재석  |  2 | 유재석 |      8 |
    |    6 | 차승원  |  3 | 차승원 |      8 |
    |    7 | 이수현  |  4 | 이수현 |      8 |
    | NULL | NULL   |  5 | 이병헌 |      9 |
    | NULL | NULL   |  6 | 하지원 |      9 |
    | NULL | NULL   |  7 | 제시   |      9 |
    | NULL | NULL   |  8 | 조정석 |      9 |
    | NULL | NULL   |  9 | 조여정 |      9 |
    | NULL | NULL   | 10 | 옥주현 |      9 |
    +------+--------+----+--------+--------+

FULL OUTER JOIN

  • 두 테이블의 공통 부분과 공통되지 않은 부분을 가져옴

  • 단, MySQL에서 지원되지 않고 다른 DBMS에선 사용 가능

  • MySQL에서 FULL OUTER 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
      -> 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   |    1 | 강동원 |
      | NULL | NULL   |    2 | 유재석 |
      | NULL | NULL   |    3 | 차승원 |
      | NULL | NULL   |    4 | 이수현 |
      | NULL | NULL   |    5 | 이병헌 |
      | NULL | NULL   |    6 | 하지원 |
      | NULL | NULL   |    7 | 제시   |
      | NULL | NULL   |    8 | 조정석 |
      | NULL | NULL   |    9 | 조여정 |
      | NULL | NULL   |   10 | 옥주현 |
      +------+--------+------+--------+

INNER JOIN

  • 두 개의 테이블에서 공통 된 요소들을 결합

    -- 예제) snl_show테이블의 호스트 출연자 중 celeb 테이블을 기준으로 각 테이블 id,이름을 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;
      +----+--------+----+--------+
      | ID | NAME   | ID | HOST   |
      +----+--------+----+--------+
      |  4 | 강동원  |  1 | 강동원 |
      |  5 | 유재석  |  2 | 유재석 |
      |  6 | 차승원  |  3 | 차승원 |
      |  7 | 이수현  |  4 | 이수현 |
      +----+--------+----+--------+

SELF JOIN

  • 가장 많이 사용되는 JOIN 방식
  • 문법은 다르지만 INNER JOIN과 같은 결과를 가진다
    select tableA.column1, tableA.column2, tableB.column1, tableB.column2,...
     from tableA, tableB	-- JOIN 문법과 다르게 from절에 테이블 2개 호출
     where tableA.colmn1 = tableB.column1;	-- ON이 아닌 where 절에 두 테이블을 JOIN 시킬 기준 제공
     -- 예제) snl_show테이블의 호스트 출연자 중 celeb 테이블을 기준으로 각 테이블 id,이름을 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 | 이수현 |
       +----+--------+----+--------+
    -- 🤔만약 where 절에서 두 테이블을 JOIN 시킬 수 없는 기준을 준다면?
    select celeb.ID, celeb.NAME, snl_show.ID, snl_show.HOST
    from celeb, snl_show
    where celeb.BIRTHDAY = snl_show.BROADCAST_DATE;
    -- 데이터타입은 날짜형태로 같지만 서로에게 없는 데이터이기 때문에 아래와 같은 결과가 나옴
    Empty set (0.00 sec)
profile
시리즈별로 봐주시길

0개의 댓글