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_conditiontable1이 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_conditiontable2가 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_conditiontable1과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.namecross join
- 두 테이블의
tuple pair로 만들 수 있는 모든 조합(Cartesian product)을 테이블로 만듬
implicit cross join
SELECT *
FROM table1, table2explicit cross join
SELECT *
FROM table1
CROSS JOIN table2self join
- 한 테이블 안에서도 관계가 있는 경우 사용할 수 있다.
SELECT E1.name, E2.name
FROM employee E1, employee E2
WHERE E1.manager_id = E2.idJOIN 다이어그램 시각화