SQL join
JeongSeulho
2025년 01월 07일
준비중...
클립보드로 복사
implicit join
- 앞에서 배웠던
JOIN
을 명시하지 않은채 두 테이블을 조회하는 방법
FROM employees AS E, departments AS D
WHERE E.department_id = D.id;
explicit join
- 명시적으로
JOIN
을 사용하여 두 테이블을 조회하는 방법
FROM employees AS E
JOIN departments AS D ON E.department_id = D.id;
inner join
SELECT column_name
FROM table1
[INNER] JOIN table2 ON join_condition
- 두 테이블에서
join_condition
을 만족하는 tuple들로 테이블을 만듬 join_condition
은TRUE
이어야 테이블에 포함(UNKNOWN
,FALSE
는 포함하지 않음)
outer join
- 두 테이블에서
join_condition
을 만족하지 않는 tuple들도 테이블에 포함 - 만족하지 않는 tuple들의 attribute는
NULL
로 채워짐 - left, right, full outer join이 있음
left outer join
SELECT column_name
FROM table1
LEFT [OUTER] JOIN table2 ON join_condition
table1
이 LEFT 테이블이며 해당 테이블에table2
를 오른쪽으로 붙여서 테이블을 만듬(table1
에table2
의 attribute를 추가)- 이때,
join_condition
을 기준으로 attribute 추가 - 만약
join_condition
을 만족하지 않는 tuple이table1
에 있으면table2
의 attribute는NULL
로 채워짐
right outer join
SELECT column_name
FROM table1
RIGHT [OUTER] JOIN table2 ON join_condition
table2
가 RIGHT 테이블이며 해당 테이블에table1
을 왼쪽으로 붙여서 테이블을 만듬(table2
에table1
의 attribute를 추가)- 이때,
join_condition
을 기준으로 attribute 추가 - 만약
join_condition
을 만족하지 않는 tuple이table2
에 있으면table1
의 attribute는NULL
로 채워짐
full outer join
MYSQL
은FULL OUTER JOIN
을 지원하지 않음LEFT OUTER JOIN
과RIGHT OUTER JOIN
을 합쳐서 사용하는 것으로 대체
SELECT column_name
FROM table1
FULL [OUTER] JOIN table2 ON join_condition
table1
과table2
를 그대로 붙여서 테이블을 만듬- 이때,
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)
으로 축약 가능
FROM table1
JOIN table2 USING (column_name)
join에서 = 을 조건으로 join하는 것을
equi-join
이라고 함
ON 키워드 join 결과
- 두 테이블에서 각각
dept_id
를 가져와 중복 됨
USING 키워드 join 결과
dept_id
중복 1개로 만든 이후 맨 왼쪽으로 붙여서 테이블을 만듬
natural join
- 두 테이블에서 같은 컬럼 이름을 가지는
attribute pair
에 대하여equi-join
을 하는 것
SELECT *
FROM employee E
NATURAL JOIN department D
두 테이블에서 같은 컬럼 이름을 가지는 컬럼이 1개인 경우
dept_id
컬럼이 두 테이블에서 유일하게 이름이 같으므로 해당 컬럼을 기준으로equi-join
진행- 아래와 같이
USING
사용한 것과 동일한 결과
SELECT *
FROM employee E
JOIN department D USING (dept_id)
두 테이블에서 같은 컬럼 이름을 가지는 컬럼이 2개 이상인 경우
dept_id
컬럼과name
컬럼이 두 테이블에서 이름이 같음 => 두 컬럼의attribute pair
를 기준으로equi-join
진행 => 이 경우 결과는empty set
- 아래와 같이
USING
사용한 것과 동일한 결과
SELECT *
FROM employee E
JOIN department D USING (dept_id, name)
- 아래와 같이
ON
사용한 것과 동일한 결과
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
SELECT *
FROM table1, table2
explicit cross join
SELECT *
FROM table1
CROSS JOIN table2
self join
- 한 테이블 안에서도 관계가 있는 경우 사용할 수 있다.
SELECT E1.name, E2.name
FROM employee E1, employee E2
WHERE E1.manager_id = E2.id
JOIN 다이어그램 시각화