저번 시간에, 자연 조인에 대해서 이야기 했습니다. 아직 보고 오지 않으셨다면 보고 오시는 것을 권장드립니다. 이것은, 속성이 같은 것을 JOIN 조건으로 삼습니다. 그렇기 때문에, 의도치 않은 결과가 나올 수 있어요. 저번 시간에 했으니, 복습을 한 번 해 봅시다. 돛단배 DB 교과서에는 대학교 DB 예제가 있습니다.

 

 

 classroom의 정보를 모두 봅시다.

 

 

 그러면, capacity랑, room_number랑 building이 있습니다. 즉, 이 교실은 x명을 수용할 수 있고, room 번호가 y이고, building이 z입니다. 당연하게도, 교실 번호는 중복될 수 있습니다. 일례로 우리 학교도 경상관 101호랑, 정보 과학관 101호가 있습니다. 101호가 중복되어 있을 수 있습니다.

 

 

 그리고 이것은 section table입니다. 분반, 코스 id, 몇 학년도 몇 학기에 어느 building의 몇 호에서 강의했는지에 대한 정보가 나타납니다. 그 다음에 학생들이 수강한 과목들의 목록은 takes라는 테이블에 있습니다.

 

 

 3개의 테이블을 잘 보셨나요? 이제, 다음과 같은 쿼리를 생각해 봅시다.

 

 어떻게 하면 좋을까요? 일단, 3개의 테이블을 잘 JOIN 해야 하는 것은 분명해 보입니다.

 

 


 먼저, 필터링 제 1조건은 takes에서 학생의 ID가 1000번이라는 것입니다. 그리고 확실한 것은 수업의 분반이 어디인지, 어디서 하는 것인지에 대한 정보를 얻어야 하는데, 이것은 takes에 있습니다.

 

 

 from A join B using(C) 구문인데요. 여기서 A는 takes 릴레이션, B는 section, C는 course_id를 의미합니다. 일단, 두 테이블인, takes와 section은 join을 합니다. 그런데 어떤 A의 어떤 속성과 B의 어떤 속성이 같아져야 하는지를 using 내부에서 명시를 해 줍니다. 예를 들자면, 위 구문에서는 course_id만 같으면 되는 것입니다.

 

 

 그런데, 보시면, course_id가 362로 공통적인 것이 있음을 알 수 있어요. 그것도 362, 1000, 1, Fall 이라는 정보가 겹쳐져 있음을 알 수 있어요. 왜 이렇게 된 것일까요? 이유는 간단합니다. 제가 JOIN 조건을 무엇이라고 명시했나요? course_id라는 속성이 같으면 EQU 조인하라고 했어요.

 

 

 그러니, <362, 1, Fall, 2005>랑, <362, 2, Fall, 2006>이랑 조인 조건이 맞아들어간 것입니다. 쉽게 비유를 하자면, OS 라는 수업만 가지고 JOIN을 한 셈입니다. 그런데 실제로는 몇 학년도 몇 학기에 무슨 분반에서 이 수업을 했는지도 중요합니다. 따라서 Using 조건을 아래와 같이 바꾸면 됩니다.

 

 

 이렇게 바꿔볼까요? 그러면 course_id, sec_id, semester, year 이렇게 4개의 쌍이 같아야만 join이 되어 버립니다.

 

 

 아까와는 다르게 course_id가 362인 것에 대해서 중복된 결과가 나오지 않았음을 알 수 있어요. 이제 이것과 classroom을 잘 JOIN을 해야 합니다. 여기에는 building이랑 호수랑 capacity 이렇게 3개가 묶여 있을 겁니다. 그러면 2번째로 JOIN을 할 때 어떻게 해야 할까요?

 


 

 building하고 room_number의 행이 같아져야 한다고 명시를 하면 됩니다. 그리고, capacity는 30보다 크거나 같아야 한다는 필터링 조건을 걸어버리면 될 거에요.

 

 

 6개의 row가 리턴이 됩니다. 그런데, 이건 사실 자연 조인을 해도 같다는 것을 알 수 있어요.

 

 

 오히려 쿼리도 더 짧아졌습니다.

 

 

 이것은, takes랑 section을 자연조인 하는 과정에서 같은 속성이 <course_id, sec_id, semester, year>이기 때문입니다. 그렇기 때문에 이들이 같은 것끼리만 JOIN이 되어버립니다. 이 둘이 합쳐지면, ID, course_id, sec_id, semester, year, building, room_no, time_slot_id 이렇게 될 겁니다. 다음에, classroom하고 합칠 건데요. 중복되는 속성이 building과 room_no입니다.

 

 제가 using 조건을 준 것과 같은 속성을 가지고 이퀄 조인을 걸어버리기 때문에 결과가 같습니다. using 절을 써서, 조인을 할 때 같아야 되는 속성을 명시한다. 정도만 기억하시면 될 듯 싶습니다.