2020. 5. 7. 18:21ㆍDB
JOIN
- 2개 이상의 테이블에서 데이터를 조회하는 것
1. Cross join(cartesion product)
- 2개 테이블의 모든 조합이 생성
- 열의 개수는 2개 테이블의 열의 개수의 합
- 행의 개수는 2개 테이블의 열의 개수의 곱
- from 절에 테이블 이름을 2개 기재하면 cross join
emp 테이블은 8열 14행 / dept 테이블은 3열 4행
=> cross join 하면 11열 56행
2. Inner join
- 2개 테이블의 공통된 의미가 있는 열이 있을 때 수행가능한 join
- where 절에 2개 테이블의 공통된 의미가 있는 열의 값이 같은 경우에만 결합을 하도록 하는
join으로 Equi join이라고도 함.
EMP 테이블의 deptno는 부서 번호이고 Dept 테이블의 deptno도 부서 번호이다.
*양쪽 테이블에 동일한 이름의 열이 있을 경우 테이블이름을 명시해주어야 함.
3. Outer join
- 어느 한쪽 테이블에만 존재하는 데이터도 join에 참여하는 것
- 왼쪽 테이블에 있는 데이터가 참여하면 left outerjoin, 반대는 right oj
- join 조건을 만들 때 참여하고 싶은 테이블의 컬럼 뒤에 (+)를 붙이면 됨.
- 표준 sql에서는 (+)를 한쪽에만
Self Join
=>동일한 테이블을 가지고 join
=>하나의 테이블에 동일한 의미를 갖는 열이 2개 이상 존재하는 경우에 가능
=>동일한 의미를 갖는 컬럼을 이용해서 다른 정보를 조회하고자 할 때 사용
=>from 절에 동일한 이름의 2개의 테이블이 설정되게 되는데 이렇게 되면 이름에 문제가 발생하기 때문에 이름 뒤에 별칭을 부여해서 테이블을 구분
=>from 절에서 설정한 별명은 이후 모든 절에 적용이 되어야 함.
=>select 절에서 열 이름에 별명을 부여하는 것은 실제 별명이 아니고 출력하기 위해서 사용하는 개념이라서 별명을 써도 되고 원래의 이름을 입력해도 됨.
=>from 절에서 부여한 별명은 데이터를 구분하기 위해서 부여한 별명이기 때문에 이후에는 별명으로 사용해야 함.
ex1) emp에서 scott인 사원의 관리자 이름을 조회
ex2) emp에서 empno가 7369인 사원의 ename과 관리자의 Ename 그리고 job을 조회
ex3) 특정인의 친구의 친구중 특정인을 제외한 데이터만 가져오기
ANSI JOIN
- 미국 표준 협회가 제시한 join 문법
1. Cross join
=> 특별한 조인 조건 없이 2개 테이블의 모든 조합을 만들어내는 것
=> 열의 개수는 두 테이블의 열의 개수의 합, 행의 개수는 곱
ANSI INNER JOIN
- 양쪽 테이즐에 동일한 의미를 갖는 열의 값이 양쪽 테이블 모두에 존재하는 경우에만 결합하는 join
from table1 inner join table2
ex)
select *
from emp inner join dept
on emp.deptno = dept.deptno;
동일한 의미를 갖는 열 이름이 양쪽 테이블에서 동일하다면 on 대신에 using 사용 가능
-> using(공통된 열이름)
Natural join
양쪽 테이블의 공통된 의미를 갖는 열 이름이 같을 때는 inner join 대신에 natural join
이라고 설정해서 공통된 열 이름을 생략할 수 있다.
ANSI OUTER JOIN
- 한쪽 테이블에만 존재하는 데이터도 join에 참여
select *
from table1 left/full/right outer join
on table.열이름 = 테이블2.열이름
emp 테이블에는 deptno가 10,20,30
dept에는 deptno가 10,20,30,40
inner join하면 40인 데이터는 조회되지 않음
조회하려면 outer join
Set operation
- 동일한 구조를 갖는 테이블끼리 연산
1. union. union all
-> 테이블 2개를 합치는 것
2.INTERSACT
- 양쪽 테이블에 공통으로 존재하는 행만 추출해서 새로운 테이블을 만드는 것
3. MINUS
- 한쪽 테이블에만 존재하는 행만 추출해서 새로운 테이블을 만드는 것