본문 바로가기

ComputerScience/Database

DB - 19. Intermediate SQL - Join

728x90

1. Natural Join 

- 학생이 수강한 과목 (이름, 과목번호) 반환

- student, takes를 join 한 테이블에서 where를 만족시키는 레코드만 남긴다.

- 위와 동일한 결과를 내는 다른 구문이다 자연조인한 결과를 반환한다. 여기에 where절을 추가해 조건을 달 수 있다.

- 참고로 자연조인은 두 테이블의 join결과에서 동일한 이름의 속성들이 일치하는 경우들만 반환한다.

- natural join의 일반적인 사용법은 위와 같다.

 

- 자연조인시 주의할 점이 있다.  

- 이렇게 하면 학생이 수강한 과목들이 반환된다.

- 이렇게하면 학생이 소속학과에서 개설된 강의중에서 수강한 과목들만 반환된다. 왜냐하면 자연조인시 student.dept_name,과 course.dept_name이 일치하는지도 확인하기 때문이다.

2. Using Join 

- 그래서 sql에서는 위의 구문처럼 쓸 수 있다. student와 takes는 natural join하고 그 결과 테이블과 course를 join하는데 course_id만 일치하는 레코드만 남기도록하는 구문이다.

3. On Join 

- student와 takes를 join하는데 on을 사용하면 임의의 조건을 만족하는 튜플만 남게된다.

- 부등호, equal등 다양한 조건이 가능하다.

- natural join이 아니라 on으로 조건을 주었기 때문에 course_id가 중복으로 두번 나왔다.

4. Inner Join 

- 이제까지 join을 써온 방법이다 inner를 생략하고 사용한 것이다.

5. Outer Join 

- loss of information을 피하기 위해 고안된 방법이다.

- 자연 join시에 동일한 이름의 column이 일치하는 경우만 반환이 되는데 이때 정보의 손실이 발생한다.

- outer join은 join짝이 없는 튜플도 반환한다. 이때 joint짝이 없으니 빈 값은 null을 채운다.

 

- 아래 예시를 통해 이해해보자. course 테이블과 prereq 테이블이 있다.

 

- 만약 두 테이블을 natrual join했다면 아래 결과가 나올 것이다.

- cs-315와 일치하는 튜플이 prereq에는 없기 때문이다. 

- natural left outer join을 한 결과는 아래와 같다.

- left라는 뜻은 왼쪽 테이블에서 짝이없는 튜플들도 다 담겠다는 것이다.

- course의 모든 튜플들은 반드시 결과 set에 나온다. 반면에 prereq의 튜플중에 CS-347은 짝이 없어서 나오지 않았다.

- natural이라는 뜻은 두 테이블을 자연조인 하겠다는 것이다.

- natural 대신 on을 사용했다. 따라서 course_id가 두번 중복해서 나왔다.

- 그러면 이번에는 natural right outer join을 해보자.

- 이번에는 prereq의 짝이없는 CS-347의 튜플이 들어와 있다.

- full은 left, right 모든 짝이없는 튜플도 포함한다.

- 얼마든지 where title is not null처럼 null이 들어간 tuple을 제외할수 있다.

*join 정리

- 네 가지 join과 세가지 조건을 조합해서 다양한 join 연산을 만들 수 있다.

 

 

728x90
반응형

'ComputerScience > Database' 카테고리의 다른 글

DB - 21. Integrity Constraints  (0) 2021.12.01
DB - 20. Intermediate SQL - View  (0) 2021.11.30
DB - 18. Normalization 2  (0) 2021.11.30
DB - 17. Boyce Codd Normal Form  (0) 2021.11.24
DB - 16. Normalization  (0) 2021.11.23