1. Join

  • Join을 통해서 2개 이상의 테이블을 연결할 수 있다.
  • Join은 기본적으로 기본키나 외부키의 값의 연관에 의해 성립되지만, 논리적인 값들의 연관만으로도 성립할 수 있다.
  • Join의 조건은 where절에 기술한다.
  • Join의 종류는 다음과 같다.
Join 방법 의미
equi join 두 개의 테이블 간의 칼럼값들이 정확하게 일치하는 경우에 사용
non- equi join 두 개의 테이블 간의 칼럼값들이 정확하게 일치하지 않는 경우에 사용
outer join Join의 조건을 만족하지 않는 데이터들도 보고자 하는 경우
self join 두 개의 테이블이 아니라 같은 테이블 행들을 Join하는 경우

2. Cross Join(Cartesian Product)

  • 테이블들 간의 Join 조건을 생략하거나 조건을 잘못 설정했을 경우, 첫 번째 테이블의 모든 행들에 대해서 두번째 테이블의 모든 행들이 Join되어 조회되는 데이터의 형태를 말함.
  • 카티션 곱이 발생하면 조회되는 데이터의 수가 기하급수적으로 증가하기 때문에 DB나 네트워크에 부담이 된다.

2.1 예

1
SELECT D.DEPARTMENT_ID, D.DEPARTMENT_NAME, E.FIRST_NAME, E.LAST_NAME FROM HR_DEPARTMENTS D, HR_EMPLOYEES E 

3. Equi join(Inner Join,등가 조인) : ‘=’ 연사자 이용

  • 두 테이블의 일치하는 칼럽을 연결해서 Join하는 것을 등가조인이라고 함.
  • 두 테이블간의 칼럼 값들이 일치하는 경우에 사용하며, 테이블별로 alias를 사용해 구분해주는 것이 좋다.
  • Join을 하는 테이블이 N개인 경우, 최소 N-1개의 Join조건이 where절에 와야 한다.

3.1 예제

1
2
//사원테이블로 부서 테이블에서 부서아이디가 일치하는 경우, 부서아이디, 부서이름, 직원 이름 조회하기
SELECT D.DEPARTMENT_ID, D.DEPARTMENT_NAME, E.FIRST_NAME, E.LAST_NAME FROM HR_DEPARTMENTS D, HR_EMPLOYEES E WHERE D.DEPARTMENT_ID = E.DEPARTMENT_ID

4. Non-Equi Join(비등가조인)

  • 두 개의 테이블간의 칼럼값들이 정확하게 일치하는 않는 경우에 사용(범위를 이용해 등급을 나눌때 용이).
  • = 이 아닌 다른 연산자 들을 사용한다.

5. Outer Join(Left/Right Join)

  • 조건을 만족하지 않는 데이터들도 보고싶을 때 사용한다
  • equi join을 사용하면 칼럼값이 일치하는 데이터만 볼 수 있지만, outer join을 사용하면 다른 데이터 들도 볼 수 있음
  • (+) 연산자를 쓰거나, 보고자하는 테이블이 왼쪽이면 Left, 오른쪽이며 Right를 명시에 사용한다.

5.1 예제

1
2
//직원 테이블과 부서테이블에서 부서아이디가 일치하는 경우 부서아이디 별로 묶어서 개수를 보여주고 부서아이디로 오름차순 정렬, 일치하는 부서가 없는 경우도 보여주기
SELECT D.DEPARTMENT_ID, COUNT(*) FROM HR_EMPLOYEES E RIGHT JOIN HR_DEPARTMENTS D ON E.DEPARTMENT_ID = D.DEPARTMENT_ID GROUP BY E.DEPARTMENT_ID ORDER BY DEPARTMENT_ID ASC

6. Self Join

  • 하나의 테이블에서 두 개의 테이블을 Join하는 것처럼 사용하는 Join
  • alias명을 지정해서 구별해 준다

6.1 예제

1
2
//각 사원의 매니저가 실제로 직업이 매니저인 경우 사원아이디, 이름, 매니저아이디, 매니저의 사원아이디, 매니저 이름, 매니저 직업아이디를 출력하라
SELECT E1.EMPLOYEE_ID, E1.FIRST_NAME, E1.MANAGER_ID, E2.EMPLOYEE_ID, E2.FIRST_NAME, E2.JOB_ID  FROM HR_EMPLOYEES E1, HR_EMPLOYEES E2 WHERE E1.MANAGER_ID = E2.EMPLOYEE_ID AND E2.JOB_ID LIKE '%MAN'