[Inter SQL] Join Expressions
Category: Database System
Chapter 4는 더 복잡한 형태의 SQL query 구문과 그 형식들을 다루고 있다.
이번에 정리해보려고 하는 것은 그 중에서 자주 쓰이는 Join operation.
Join Expressions
두 개 이상의 relation을 묶어서 새로운 하나의 relation을 만든다. join을 하기 위해서는 join type과 join condition을 지정해주어야 한다.
Join은 relation에서 공통된 attribute을 기준으로 결합시키기 때문에 Cartesian Product와 유사하다. From 구문의 subquery로 사용된다.
Join 종류는 다음과 같이 나눌 수 있다.
- Inner join
- Outer join (Left, Right, Full)
Natural Join
Natural join은 같은 이름의 attribute을 기준으로 가진 같은 값들을 가진 칼럼들을 묶어서 새로운 relation을 만든다.
select A1, A2, … An from r1 natural join r2 natural join .. natural join rn where P ;
일반적인 SQL 구문 (where 조건을 활용)
select *
from student, takes
where student.ID = takes.ID;
Natural join을 사용한 구문
select *
from student
natural join takes;
두 query의 결과는 위와 같다. 항목의 이름이 같다면, Natural join을 사용하는 편이 좋다!
(참고) student 학생 테이블, takes 학생이 들은 과목 테이블
(참고) 그리고 Natural join을 수행한 결과 테이블
Inner Join
Inner Join .. On은 Natural join과 유사한 기능을 수행하지만, 명시적으로 조건을 지정해줄 수 있다는 점에서 다르다. on (또는 using)을 통해 조건을 넣고, 성립하는 테이블의 칼럼들을 결합한다.
inner join r1 on (condition) ;
join r1 on (condition) ;
앞에 단어 명시 없이 그냥 join을 쓰는 경우, SQL은 자동적으로 inner join으로 인식한다.
select *
from student inner join takes on student.ID = takes.ID;
/* ID가 일치할 때, student 튜플과 takes 튜플을 매칭시키겠다는 의미 */
조건을 직접 지정할 수 있다는 유연성 때문에 Natural join보다 실제에서 많이 사용된다.
Outer Join
Natural Join의 문제점
Natural Join과 Join .. On은 조건을 충족하지 못하는 일부 칼럼이 누락된다는 단점이 있다.
ex. 학생들 name과 수강하는 과목 title을 출력하는 query를 보낸다고 하자.
2번째 query에서 문제점이 발생한다. course_id와 dept_name이 동시에 필터링이 되면서 다른 department에서 수업을 듣는 학생들에 대한 정보가 모두 누락된다. 그래서 이와 같은 문제를 해결하기 위해 Outer join을 사용한다. Outer join은 먼저 join을 계산한 후, 매칭되지 못한 나머지 정보들을 null로 업데이트해서 포함시킨다.
Outer join의 종류
예시로 설명하기 위해서 다음과 같은 course, prereq 테이블이 있다고 하자.
-
Left Outer Join : 왼쪽에 있는 tuple 정보 보존
from course natural left outer join prereq
-
Right Outer Join : 오른쪽에 있는 tuple 정보 보존
from course natural right outer join prereq
-
Full Outer Join : 양쪽에 있는 tuple 정보 보존
from course natural full outer join prereq
@Database System Concepts sixth edition 내용을 참고함