* 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