Joined Relations

 

Join연산은 두 개의 relations를 하나의 다른 relation으로 합치는 것을 말합니다. Join에는 Natural join, Inner join, Outer join이 있습니다. *select를 할 때 필요한 attr.가 서로 다른 table에 있는 경우 table을 합쳐야하고, 이때 join을 해야한다고 판단하면 됩니다.

 

Natural Join in SQL

 

Natural join은 같은 속성 이름을 갖는 속성을 기준으로 같은 값을 갖는 튜플끼리 매칭하여 테이블을 연결하는 것을 말합니다.

 

List the names of students along with the course ID of the courses that they taught

SELECT name, course_id
FROM students, takes
WHERE student.ID = takes.ID;

 

위와 같은 쿼리도 가능하지만 Natural join을 사용한다면 다음과 같이 나타낼 수 있습니다:

SELECT name, course_id
FROM student NATURAL JOIN takes;

 

(left) student (right) takes
student NATURAL JOIN takes

 

Danger in Natural Join

 

Natural join을 하는 경우에는 attr.의 이름에 신경을 써야합니다. Natural join의 join기준은 attr.의 이름이기 때문에 의도치 않게 연결되는 경우가 발생할 수 있습니다. *3개 이상의 table들을 join하는 경우 헷갈릴 수 있습니다.

 

예를 들어 다음과 같은 테이블이 있습니다:

 

student (ID, name, dept_name, tot_cred)

takes (ID, course_id, sec_id, semester, year, grade)

course (course_id, title, dept_name, credits)

 

이때 세 테이블을 모두 natural join으로 묶는다면,

원래 의도는 student와 takes는 ID를 기준으로, takes와 course는 course_id를 기준으로 join하려했지만,

course (dept_name)과 student (dept_name)이 의도치않게 연결될 수 있습니다.

 

List the name of student along with the titles of courses that they have taken (incorrect version)

SELECT name, title
FROM student NATURAL JOIN takes NATURAL JOIN course; // incorrect!!

 

correct version

SELECT name, title
FROM student NATURAL JOIN takes, course
WHERE takes.course_id = course.course_id

 

이렇게 이름만 같다고 매칭이 되는 경우를 피하기 위해 using문을 사용할 수 있습니다.

SELECT name, title
FROM (student NATURAL JOIN takes) NATURAL JOIN course USING (course_id)

 

하지만 NATURAL JOIN을 사용할 때 using을 사용하는 것은 별로 좋지 않습니다. NATURAL이라는 것 자체가 같은 이름을 갖는 것을 매칭한다는 조건을 말하고 있기 때문에 중복으로 조건을 거는 것입니다. 차라리 나중에 배울 INNER JOIN과 on을 사용하는 것이 좋습니다.

 

Join Condition

 

on은 join다음에 나와서 join의 조건을 알려줍니다. 이때 join은 inner join을 말합니다.

 

만약 join을 사용하지 않으면 다음과 같은 쿼리이지만,

SELECT *
FROM student, takes
WHERE student.ID = takes.ID

 

join을 사용하면 다음과 같이 나타낼 수 있습니다.

SELECT *
FROM student JOIN takes ON student_ID = takes_ID

 

Outer Join

 

outer join은 join시 발생하는 정보의 손실을 피하기 위한 연산입니다. inner join시 조건에 맞지 않으면 모두 결과 테이블에 들어갈 수 없었지만, outer join은 join의 종류에 따라 그 튜플들을 버리지 않습니다. 또한 null값을 사용한다는 특징을 갖습니다. *inner join을 수행한 후 outer에 해당하는 tuple들을 추가한다.

 

Left Outer Join

 

left outer join은 연산자 기준 왼쪽에 있는 테이블의 튜플들을 null값을 이용해 살리는 것입니다.

left outer join

 

Right Outer Join

 

right outer join은 연산자 기준 오른쪽에 있는 테이블의 튜플들을 null값을 이용해 살리는 것입니다.

right outer join

 

Full Outer Join

 

full outer join은 모든 피연산자 테이블의 튜플들을 null값을 이용해 살리는 것입니다.

full outer join

 

*참고로 natural과 outer join연산은 아무런 상관이 없습니다. natural은 조건일 뿐이지 outer join연산만 따로 사용할 수 있습니다.

 

Joined Types and Conditions

 

Join의 종류는 inner, left outer, right outer, full outer가 있고, Join condition에는 natural, on <P>, using (A1, A2, ..., An)이 있습니다. 이 둘을 잘 조합해서 사용하면 됩니다.

ex
ex

 

*이때 조건으로 on을 사용하면 조건에 사용된 attr.이 중복으로 결과 테이블이 나타날 수 있습니다. 이는 using이나 natural의 경우 두 테이블의 attr.을 하나의 attr.로 간주하기 때문에 중복으로 나타나지 않는 반면, on은 join의 기준이 되는 attr.을 서로 다른 것으로 간주하기 때문에 중복으로 나타날 수 있습니다 (위 예시의 경우 course_id가 결과 테이블에 중복으로 나타납니다).