Tech

Diary

Lecture

About Me

개발중

SQL join

JeongSeulho

2025년 01월 07일

준비중...
클립보드로 복사

implicit join

  • 앞에서 배웠던 JOIN을 명시하지 않은채 두 테이블을 조회하는 방법
copy
FROM employees AS E, departments AS D
WHERE E.department_id = D.id;

explicit join

  • 명시적으로 JOIN을 사용하여 두 테이블을 조회하는 방법
copy
FROM employees AS E
JOIN departments AS D ON E.department_id = D.id;

inner join

copy
SELECT column_name
FROM table1
[INNER] JOIN table2 ON join_condition
  • 두 테이블에서 join_condition을 만족하는 tuple들로 테이블을 만듬
  • join_conditionTRUE이어야 테이블에 포함(UNKNOWN, FALSE는 포함하지 않음)

outer join

  • 두 테이블에서 join_condition을 만족하지 않는 tuple들도 테이블에 포함
  • 만족하지 않는 tuple들의 attribute는 NULL로 채워짐
  • left, right, full outer join이 있음

left outer join

copy
SELECT column_name
FROM table1
LEFT [OUTER] JOIN table2 ON join_condition
  • table1이 LEFT 테이블이며 해당 테이블에 table2를 오른쪽으로 붙여서 테이블을 만듬(table1table2의 attribute를 추가)
  • 이때, join_condition을 기준으로 attribute 추가
  • 만약 join_condition을 만족하지 않는 tuple이 table1에 있으면 table2의 attribute는 NULL로 채워짐

right outer join

copy
SELECT column_name
FROM table1
RIGHT [OUTER] JOIN table2 ON join_condition
  • table2가 RIGHT 테이블이며 해당 테이블에 table1을 왼쪽으로 붙여서 테이블을 만듬(table2table1의 attribute를 추가)
  • 이때, join_condition을 기준으로 attribute 추가
  • 만약 join_condition을 만족하지 않는 tuple이 table2에 있으면 table1의 attribute는 NULL로 채워짐

full outer join

  • MYSQLFULL OUTER JOIN을 지원하지 않음
  • LEFT OUTER JOINRIGHT OUTER JOIN을 합쳐서 사용하는 것으로 대체
copy
SELECT column_name
FROM table1
FULL [OUTER] JOIN table2 ON join_condition
  • table1table2를 그대로 붙여서 테이블을 만듬
  • 이때, join_condition을 기준으로 tuple을 이어붙임
  • 만약 join_condition을 만족하지 않는 tuple이 table1이나 table2에 있으면 NULL로 채워짐

using 키워드

  • join_condition에서 사용하는 키워드
  • 두 테이블을 join에서 join_condition의 두 컬럼의 이름이 같으면서도 =을 조건으로 하는 join에 사용
  • ON T.column_name = S.column_name 대신 USING (column_name)으로 축약 가능
copy
FROM table1
JOIN table2 USING (column_name)

join에서 = 을 조건으로 join하는 것을 equi-join이라고 함

ON 키워드 join 결과

Image

  • 두 테이블에서 각각 dept_id를 가져와 중복 됨

USING 키워드 join 결과

Image

  • dept_id 중복 1개로 만든 이후 맨 왼쪽으로 붙여서 테이블을 만듬

natural join

  • 두 테이블에서 같은 컬럼 이름을 가지는 attribute pair에 대하여 equi-join을 하는 것
copy
SELECT *
FROM employee E
NATURAL JOIN department D

두 테이블에서 같은 컬럼 이름을 가지는 컬럼이 1개인 경우

Image

  • dept_id 컬럼이 두 테이블에서 유일하게 이름이 같으므로 해당 컬럼을 기준으로 equi-join 진행
  • 아래와 같이 USING 사용한 것과 동일한 결과
copy
SELECT *
FROM employee E
JOIN department D USING (dept_id)

두 테이블에서 같은 컬럼 이름을 가지는 컬럼이 2개 이상인 경우

Image

  • dept_id 컬럼과 name 컬럼이 두 테이블에서 이름이 같음 => 두 컬럼의 attribute pair를 기준으로 equi-join 진행 => 이 경우 결과는 empty set
  • 아래와 같이 USING 사용한 것과 동일한 결과
copy
SELECT *
FROM employee E
JOIN department D USING (dept_id, name)
  • 아래와 같이 ON 사용한 것과 동일한 결과
copy
SELECT *
FROM employee E
JOIN department D ON E.dept_id = D.dept_id AND E.name = D.name

cross join

  • 두 테이블의 tuple pair로 만들 수 있는 모든 조합(Cartesian product)을 테이블로 만듬

implicit cross join

copy
SELECT *
FROM table1, table2

explicit cross join

copy
SELECT *
FROM table1
CROSS JOIN table2

Image

self join

  • 한 테이블 안에서도 관계가 있는 경우 사용할 수 있다.
copy
SELECT E1.name, E2.name
FROM employee E1, employee E2
WHERE E1.manager_id = E2.id

JOIN 다이어그램 시각화

Image Image Image Image

Copyright ©gparkkii All rights reserved.

2024 | built with gatsby | Developed by gparkkii, JeongSeulho