프로그래밍[Univ]/데이터베이스(DB)

[DB] JOIN

Cloud Travel 2012. 3. 28. 21:00

* Join

 - 둘 이상의 테이블을 합쳐서 하나의 큰 테이블로 만드는 방법

 - 데이터 의 중복을 최소화하며, 데이터의 일관성과 효율을 높이기 위해서 사용

 - FK를 이용하여 참조를 한다.

 - Syntax

  SELECT COL1, COL2, COL3, ... FROM TABLE1, TABLE2, ... WHERE [조건]

  > 조건은 테이블 개수보다 한개 적은 것이 보통 필요로 하며, PK와 FK사이의 조건이 많이온다.

  ex) select id, name, dept_name from student, dept where student.dept_no = dept.dept_no;

  

* Join의 종류

 - Cross join(Cartesian product) : 모든 가능한 쌍이 모두 나타난다.

 - Inner join : join 조건을 만족하는 튜플만 나타난다.

 - Outer join : Join조건을 만족하지 않는 튜플도 null로 표시되어 나타난다.

  > Join조건을 만족하지 않는 튜플의 경우 Null로 값을 체워서 결과로 표현해준다.

  > 이로인해 모든 행이 테이블에 나타나게 된다.(Outer방향에 해당하는)

  ⓐ Left Outer join : 왼쪽의 모든 행이 나타나게함.

  ⓑ Right Outer Join : 오른쪽의 모든 행이 나타나게함.

  ⓒ Full Outer Join : 양쪽의 모든 행이 타나타게 한다.

   in Oracle) NULL이 올수 있는 쪽 조건에 (+)기호를 붙인다.

   ex) select id, name, dept_name from student, dept where student.dept_no(+) = dept.dept_no;

         // 오른쪽에 NULL로 체워질수 있으므로, 왼쪽의 값을 모두 표시하는 Left Outer Join 이다.

        select id, name, dept_name from student, dept where student.dept_no(+) = dept.dept_no(+);

         // 양쪽에 모두 NULL로 체워질수 있으므로, Full Outer Join이다.

  표준) select id, name, dept_name from student RIGHT OUTER JOIN dept ON(student.dept_no = dept.dept_no);

 - Theta join : 조건이 존재하는 join

 - Equi-join : Theta join에 조건이 = 인것

 - Natural join : Join후 중복 칼럼 제거

  > 표준으로 명령어가 정의 되있다.

  > select * from student NATURAL JOIN dept;

 - Self join : 자기 자신끼리 Join, 자기자신끼리의 join이므로 테이블의 이름을 변경후 실시해야한다.

 > 일반적인 select 문으로 outer join, natural join은 하기가 힘들다.

 

* Aggregate Function(집계함수)

 - 기본적으로 모든 DB는 AVG, COUNT, MAX, MIN, SUM을 지원해준다.

 - COUNT : count * > NULL도 센다 / count(expr) > expr이 NULL인 것은 세지 않는다. /

                 count(distinct expr) > expr이 NULL인 것을 세지 않고, 중복한 것도 제거한다.

 - 집계 함수의 결과는 한 row만 남게된다. 따라서 그외의 row는 group by로 그룹핑을 해줘야한다.

  ex) select dept_no, count(name) from student; (X)

       select dept_no, count(name) form student group by dept_no; (O) 

       //학과별 학생수 출력

 ※ Group By 절

  > select에 aggregate function을 제외하고는 모두 group by로 compatibility하게 연결되야 한다.

  > Group By뒤에 조건절로 오는 Having이 존재한다. 

  > Group By에 참여하지 않은 열은 삭제가 된다. 그뒤에 나오는 절에서 사용불가능.(having절에 사용불가)

 ※ Having 절

  > Group By뒤에 오는 조건절이다. 

  ex) select dept_no, count(name) from student group by dept_no having dept_no = 10;

        // dept_no가 10인 학과의 총인원수


* 단일 SQL문 실행 순서

 - join을 통해서 큰 테이블을 만든다.(From)

 - where절을 통해서 조건에 맞지 않는 것은 삭제한다.

 - Group by에 의해서 의미 단위가 같은 것을 그룹핑한다.

 - having절을 이용해 다시 조건을 줘서 골라낸다.

 - order by에 따라서 정렬을 한다.

 - select로 결과를 projection한다.


* Sub-query

 - query가 여러개 섞여 있는 것을 말한다.

 - Sub-query의 결과가 한 줄인 경우

  > select name from student where dept_no = (select dept_no from dept where dept_name = 'cs');

 - Sub-query의 결과가 여러줄인 경우에는 ANY, ALL, IN, EXIST ... 등을 붙여서 해준다.

 >select name from student where dept_no ANY(select dept_no from dept where dept_no between 0 and 100 );

  // 학과번호과 0~100중에 있는 과의 학생수를 출력한다.


* Correlated Query

 - Outer Query와 Inner Query가 서로 연관되 있다.

 - Outer query에서 원하는 행을 얻은뒤에 Inner Query로 조건을 검사한다.


* Top - K query

 - select rownum, name, credit from (select * from student order by credit) where rownum < 4;

   전체중 학점이 3등안에 드는 학생을 추출한다.

 - (in oracle) rownum : 질의의 결과에 가상으로 부여되는 가상 number