샘플 스키마 : HR

설명하는 과정에서 예제로 주어진 문장은 눈으로 보지만 말고 직접 실행시켜 보길 권한다.


이제부터 SQL:1999 표준에서 제시되어 있는 조인을 표현하는 방법을 배워보도록 하겠다




No. 01

 

 ㅈ

자연 조인(Natural Join)


자연 조인은 등가 조인하는 방법 중 하나이다.

동일한 타입과 이름을 가진 컬럼을 조인 조건으로 이용하는 조인을 간단히 표현하는 방법이다.


기본 구조

SELECT 컬럼, 컬럼, …

FROM 테이블1

NATURAL JOIN 테이블2

[NATURAL JOIN 테이블3] …

WHERE 검색 조건;

  • 반드시 두 테이블 간의 동일한 이름, 타입을 가진 컬럼이 필요하다.
  • 조인에 이용되는 컬럼은 명시하지 않아도 자동으로 조인에 사용된다.
  • 동일한 이름을 갖는 컬럼이 있지만 데이터 타입이 다르면 에러가 발생한다.
  • 조인하는 테이블 간의 동일 컬럼이 SELECT 절에 기술되도 테이블 이름을 생략해야 한다.


◈ 예제

select department_id 부서번호, department_name 부서이름, location_id 지역번호, city 도시

from departments

natural join locations

where city = 'Seattle';


원하는 결과를 얻기 위해 일반 조건을 사용할 경우는 원래처럼 where 절에 기술하면 된다.


▶ 이전 표현과 자연 조인을 비교

1) 오라클(SQL:1999 이전 문법)

select department_id 부서번호, department_name 부서이름, d.location_id 지역번호, city 도시

from departments d, locations l

where d.location_id = l.location_id;


2) SQL:1999 표준

select department_id 부서번호, department_name 부서이름, location_id 지역번호, city 도시

from departments

natural join locations;


두 테이블은 location_id(지역번호) 컬럼을 이용하여 조인되었고, 같은 결과를 출력한다.

보시다시피 자연 조인에서는 조인 조건을 기술하지 않아도 자동으로 공통 컬럼을 찾아서 조인한다. 또 SELECT 절에 테이블 명을 기술하지 않고 검색하는 것이 가능하다.


▶ 두 테이블에 동일한 이름과 타입의 컬럼이 두 개 있을 때

select employee_id 사원번호, first_name 이름,

d.department_id 부서번호, department_name 부서명

from employees e, departments d

where e.department_id = d.department_id;


select employee_id 사원번호, first_name 이름,

department_id 부서번호, department_name 부서명

from employees

natural join departments;


위 두개의 SQL 문을 보면 같은 결과가 나올 것 같지만 결과가 다르다는 것을 볼 수 있다.

자연 조인은 조인 조건을 기술하지 않고 간단하게 조인을 표현하는 방법이지만 제약이 따른다.

우선 첫 번째 결과가 원하던 결과였다.

두 번째 SQL 문의 결과가 다르게 나온 이유는 EMPLOYEES 테이블과 DEPARTMENTS 테이블은 department_id, manager_id 두 개의 이름, 타입이 동일한 컬럼을 가지고 있다. department_id 컬럼은 두 테이블에서 의미하는 것이 같지만 manager_id 컬럼은 의미하는 것이 다르다.

employees.manager_id는 각 사원의 상사를 의미하는 번호이고 departments.manager_id는 그 부서의 부장을 의미하는 번호이다. 자연 조인은 컬럼의 이름, 타입이 같은 컬럼들을 모두 조인에 사용하기 때문에 원하지 않는 결과가 나올 수 있다.

자연 조인은 테이블간에 동일한 형식을 갖는 공통 컬럼이 반드시 하나만 존재해야 한다.




No. 02

 

 

USING 절을 사용한 조인


자연 조인에서 사용하는 테이블간에 동일한 이름과 형식의 컬럼이 둘 이상인 경우 자연 조인을 사용할 수 없다.

이럴 경우 USING 절을 이용한 조인문을 이용하면 조인문을 구사할 수 있다.


기본 구조

SELECT 컬럼, 컬럼, …

FROM 테이블1

JOIN 테이블2 USING(조인 컬럼)

[JOIN 테이블3 USING(조인 컬럼)] …

WHERE 검색 조건;

  • USING 절은 조인에 사용될 컬럼을 지정한다.
  • NATURAL 절과 USING 절은 함께 사용할 수 없다.
  • 조인에 이용되지 않은 동일 이름을 가진 컬럼은 컬럼명 앞에 테이블명을 기술한다.
  • 조인 컬럼은 괄호로 묶어서 기술해야 한다.


◈ 예제

select department_id 부서번호, department_name 부서이름, location_id 지역번호, city 도시

from departments

join locations using (location_id);


select department_id 부서번호, department_name 부서이름, location_id 지역번호, city 도시

from departments

join locations using (location_id)

where city = 'Seattle';


USING 절에는 조인 컬럼을 기술해야 하며, 괄호로 묶어서 표현해야 한다.



▶ 두 테이블에 동일한 이름과 타입의 컬럼이 두 개 있을 때

1) 오라클(SQL:1999 이전 문법)

select employee_id 사원번호, first_name 이름, e.manager_id 상사번호,

d.department_id 부서번호, department_name 부서명

from employees e, departments d

where e.department_id = d.department_id;

2) SQL:1999 표준

select employee_id 사원번호, first_name 이름, e.manager_id 상사번호,

department_id 부서번호, department_name 부서명

from employees e

join departments d using (department_id);


위의 예제는 자연 조인문으로 정확한 결과를 보지 못했던 예전 표현을 USING절을 이용하여 조인문을 구사했다. 조인에 사용될 컬럼을 명시적으로 지정하기 때문에 동일한 결과를 얻는 것이 가능하다.


주의할 점은 조인에 사용된 컬럼에는 테이블명을 기술하지 않고, 각 테이블에 조인이 이용되지 않았지만 동일 이름을 가진 컬럼은 테이블명을 기술해야 한다.



▶ NATURAL 조인과 USING 절을 이용한 조인

select department_name, city, country_name

from countries

join locations using (country_id)

join departments using (location_id)

where city in ('Seattle', 'London')

and country_name like 'United%';

select department_name, city, country_name

from countries

natural join locations

natural join departments

where city in ('Seattle', 'London')

and country_name like 'United%';


위의 경우처럼 조인되는 테이블간 공통된 컬럼이 하나 밖에 없을 경우 서로 바꿔 표현할 수 있다.

여러번 얘기 했지만 조인되는 테이블간 공통된 컬럼이 2개 이상이라면 둘의 결과는 완전히 다르다.



 TIP

* 여러 테이블 간 조인할 경우 자연 조인과 USING 절을 이용한 조인 모두 사용 가능할 때 가독성이 좋은 USING 절을 이용한 방법을 권한다.

* 자연 조인이나 USING 절을 이용한 조인은 등가 조인만을 표현할 수 있다.




+ Recent posts