JOIN

JOIN

join 조인

여러 테이블에 있는 데이터를 합쳐서 출력.
join은 FROM절에 작성된다.

join은 정말 많이 사용된다.




join(조인) 유형

  1. Natural Join
  2. Using
  3. On : self-join, Nonequijoin
  4. Outer join : left, right, full
  5. Cartesian Product : cross join




Natural Join

오라클이 다중 테이블을 뒤져봐서 컬럼명이 같고 데이터타입이 같은 컬럼을 기준으로 join을 하여 데이터를 보여준다.

  • 예시 :
    test1테이블과 test2테이블을 natural join해서 오라클이 직접 두 테이블을 찾아보고 컬럼명과 데이터타입리 같은 컬럼을 기준으로 모든 컬럼을 출력한다.
    이때 오라클이 자동으로 찾은 기준 컬럼은 양쪽 테이블에서 컬럼명이 같고 데이터타입이 같다
1
2
$ select * 
$ from test1 natural join test2;
  • 만약 컬럼명이 같도 데이터타입이 같은 컬럼이 한 개이상이면 어떻게 될까?
    해당 컬럼들의 조합값으로 기준으로 조인을 시켜준다.




Using

  • 여러 컬럼의 이름은 동일하지만 데이터 유형이 다른 경우 using 절을 사용한다.
  • 꼭 괄호를 작성하고 그 괄호안에 컬럼명을 넣어줘야한다
  • 예시 :
    test1테이블과 test2테이블을 ex이라는 컬럼을 기준으로 join해서 모든 컬럼을 출력한다.
    test1과 test2테이블의 name컬럼명이 같지만 데이터 유형이 다를때 using사용한다.
1
2
3
$ select * 
$ from test1 join test2
$ using (ex);
  • 테이블의 엘리아스를 사용하여 컬럼들이 어느 소속인지 엘리아스 접두어를 컬럼앞에 붙여주면 명령문 구문 분석 속도를 향상시킨다.
  • 하지만 using절에서 참조하고 있는 컬럼은 절대 엘리야스 붙이면 안된다.




On

  • 가장 기본이 되는 join유형이고 가장 많이 사용한다.
  • 컬럼명이 달르고 데이터타입이 달라도 상관없이 사용가능하다.
  • 예시 :
    test1테이블과 test2테이블을 ex이라는 컬럼을 기준으로 join해서 모든 컬럼을 출력한다.
    test1과 test2테이블의 name컬럼명도 다르고 데이터 유형이 달라도 사용할 수 있는 것이 on이다.
1
2
3
$ select * 
$ from test1 join test2
$ on (test1.ex = test2.example);

self-join

self-join : 하나의 테이블을 엘리아스를 달리 주면 한 개의 테이블로 join이 가능하다
많이 사용된다.

예를 들면 회사의 매니저들이 어떤 사원들을 관리하고 있는지 출력하고 싶다.
이때 회사의 매니저들도 사원이기에 employee_id가 있기에 결국 내 테이블을 2번 참조해야하는 self-join이 된다

1
2
3
$ select manager.name, worker.name
$ from employees worker join employees manager
$ on worker.manager_id = manager.employee_id);




Natural Join, Useing, On 비교

절종류 컬럼명 데이터타입 엘리아스
Natural Join 일치 일치 join할 테이블의 컬럼명들 중 같은 컬럼명 있다면 필수
useing 일치 상관없음 컬럼의 엘리아스 쓰면안됨
on 상관없음 상관없음 필수
  • 비교 : 아래 세개는 결과값이 똑같다.
  1. from departments natural join location
  2. from departments d join location l using(location_id)
  3. from departments d join location l on d.location_id = l.loc_id)




non-equi join과 equi join 비교

equi(이퀴)조건과 non-equi(넌 이퀴)조건을 비교해보자

절종류 특징 종류
non-equi join 조인조건에 동등연산자가 사용된 조인 유형 Natural join, Using join, On(=) join
equi join 조인조건에 동등연산자가 아닌 그 외 다른 비교연산자가 사용된 조인 유형 On(=이 아닌 비교연산자) join




inner join과 outer join 비교

절종류 특징 종류
inner join 조인조건을 만족하는 행만 반환하는 조인 유형 Natural join, Using join, On join
outer join 조인조건을 만족하는 행과 조인조건을 만족하지않는 행을 모두 반환하는 조인 유형 left outer join, right outer join, full outer join

https://insomniachaos.tistory.com/202




Cartesian Product (카테시안 곱 = 곱집합)

  • 한 테이블의 모든 행을 다른 테이블의 모든 행과 조인한다.
  • 모든 경우의 수를 나열.
  • 다수의 행을 생성하므로 결과는 그다지 유용하지 않다.




cross join

  • 두 테이블의 Cartesian Product 를 생성하는 join작업이다.
1
2
3
$ select last_name, department_name
$ from employees
$ cross join departments




join 예시

employees 테이블로부터 모든 사원의 last_name, employee_id, 매니저이름, manager_id를 함께 출력하는 쿼리를 작성하시오

join에 있어 자주 틀리는 오답도 확인해둬야한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//첫번째 방법
$ select e1.last_name as "Employee", e1.employee_id as "Emp#", e2.last_name as "Manager", e1.manager_id as "Mgr#"
$ from employees e1 join employees e2
$ on (e1.manager_id = e2.employee_id);

//두번째 방법
$ select e1.last_name as "Employee", e1.employee_id as "Emp#",
e2.last_name as "Manager", e2.employees_id as "Mgr#"
$ from employees e1 join employees e2
$ on (e1.manager_id = e2.employee_id);

//오답
$ select e1.last_name as "Employee", e1.employee_id as "Emp#",
e2.last_name as "Manager", e2.manager_id as "Mgr#"
$ from employees e1 join employees e2
$ on (e1.manager_id = e2.employee_id);