샘플 스키마 : HR

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




No. 01

 

 

조인(JOIN)이란?


하나의 스키마에서 여러 테이블이 존재하고 정보를 저장하고 있다. 지금까지는 하나의 테이블에서만 정보를 검색했지만, 동시에 두 개 이상의 테이블에서 정보를 검색해야 할 때가 있다. 여러 테이블의 데이터를 검색하는 것을 조인(Join)이라 하고 조인은 테이블 간의 관계를 기반으로 수행된다.


예를 들어 2개의 테이블을 조인한다면 2개의 테이블을 합친 가상의 하나의 테이블이 만들어진다고 생각하면 된다.



두 테이블은 각각 사원의 정보와 부서의 정보를 담고 있는 테이블이다.

조인을 함으로써 각 사원이 일하고 있는 부서의 이름을 확인할 수 있다.

조인을 하지 않고 각 사원이 일하고 있는 부서의 이름을 알아내려면 EMPLOYEES 테이블에서 각 사원이 일하고 있는 부서번호를 검색하고 다시 DEPARTMENTS 테이블을 검색해서 그 분서번호에 대응하는 부서명을 알아 낼 수 있다. 검색 결과를 따로 봐야 하기 때문에 불편함이 있고 효율적이지 못하다.

반면,조인은 하나의 SQL문으로 검색하고자 하는 결과를 정리하여 볼 수 있다.


조인을 쉽게 사용하고자 한다면 각 테이블간의 관계를 명확히 파악해야 한다. 각 테이블간의 공통 컬럼이나 동일 내용을 담고 있는 컬럼이 무엇인지 알지 못한다면 조인 문장을 구사할 수 없다.

그러나 조인은 반드시 같은 값을 이용하는 것만은 아니다.




No. 02

 

 

조인(JOIN)의 종류


JOIN은 SQL:1999 문법 이전과 이후로 구분할 수 있다.

오라클 8i 버전까지의 조인 구문은 ANSI 표준과 달랐지만, 9i 버전부터는 SQL:1999 표준을 준수하는 조인구문을 제공한다.


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

SQL:1999 표준 

 

 등가 조인

 자연 / 내부 조인

 JOIN USING  

 

 포괄 조인

 왼쪽 포괄 조인, 오른쪽 포괄 조인

 

 -

 전체 포괄 조인 

 

 자체조인

 JOIN ON

 

 비등가 조인

 

 카티시안 곱

 교차조인 

 


SQL:1999 이전 문법을 설명하는 이유는 실제 현장에서는 아직도 예전 표현법을 사용하는 곳도 있기 때문이다. 예전 표현법을 보더라도 당황하지 않고 해석할 수 있기를 바라면서 모든 표현법들을 공부해 보도록 한다.

그러나 가능한 새로운 표현법을 사용하길 권한다. 표준으로 정해 놓았기 때문에 오라클 SQL이 아닌 다른 SQL 프로그램에서도 사용되는 표현법이기 때문이다.




No. 03

 

 

등가 조인, 비등가 조인


기본 구조

SELECT 테이블1.컬럼, 테이블2.컬럼, …

FROM 테이블1, 테이블2, …

[AND 조인 조건]

[AND 일반 조건];

  • 조인 조건이란 두 테이블 간의 관계를 수식으로 표현한 것이다.
  • 조인 문장에서 기술된 모든 테이블은 반드시 조인 조건을 기술해야 한다.
  • 조인에 사용되는 테이블 개수가 n이라면 조인 조건의 개수는 (n-1)개 이상이어야 한다.
  • FROM 절을 기술할 때 각각의 테이블에 별명을 붙일 수 있다.
  • 동일한 이름의 컬럼이 여러 테이블에 존재하는 경우 테이블 이름을 써줘야 한다.

조인 조건에 '='를 이용하는 조인을 등가 조인(Equi-join)이라 하고

부등호가 포함된 조인 조건을 이용하는 조인을 비 등가 조인(Non equi-join)이라고 한다.


▶ 등가 조인 예제

select employee_id 사원번호, first_name 이름, employees.department_id 부서번호,

departments.department_id 부서번호, department_name 부서이름

from employees, departments

where employees.department_id = departments.department_id;


위와 같이 조인 조건에 등호(=)를 이용하는 조인을 등가 조인이라 한다.

조인에 사용하는 테이블의 개수가 2개 이므로 조인 조건은 (2-1)개의 조인 조건을 이용했다.


SELECT절에 사용되는 컬럼은 원래 테이블에서 사용하던 컬럼이름을 써도 되지만, 조인에 참여하는 다른 테이블에 같은 이름의 컬럼이 존재하는 경우 어느 테이블의 컬럼인지 반드시 써줘야 한다.


select location_id, employee_id 사원번호, first_name 이름,

e.department_id 부서번호, department_name 부서이름

from employees e, departments d

where e.department_id = d.department_id

and location_id = 1700;


'location_id = 1700'과 같은 일반 조건도 같이 사용할 수 있다.


select location_id, employee_id 사원번호, first_name 이름,

employees.department_id 부서번호, department_name 부서이름

from employees e, departments d

where e.department_id = d.department_id

and location_id = 1700;

ORA-00904: "EMPLOYEES"."DEPARTMENT_ID": invalid identifier

00904. 00000 -  "%s: invalid identifier"


테이블에 별명을 사용했음에도 불구하고 별명을 쓰지 않으면 위와 같은 에러가 발생한다.

그 이유는 SQL문을 처리할 때 select 절보다 from 절이 먼저 처리되기 때문이다.

FROM 절의 테이블에 별명을 사용할 경우 SQL문 전체에서 반드시 테이블명 대신 별명을 사용해야 한다.


select e.last_name, d.department_name, l.city

from employees e, departments d, locations l

where e.department_id = d.department_id

and d.location_id = l.location_id;


위와 같이 3개 이상의 테이블을 조인 가능하다.

조인을 할 때 주의점은 각 테이블간의 공통된 컬럼(연결고리)가 있어야 한다는 것이다.



▶ 비등가 조인 예제

HR스키마의 테이블로 표현하기 어려운 부분이 있어 테이블 예제를 들어 설명한다.

테이블을 새로 만들어 실습해볼 수 있지만 아직 배우지 않았기 때문에 나중에 테이블 생성을 배우고 직접 실행시켜보기 바란다.


다음과 같은 두 개의 테이블이 있다고 한다면


EMPLOYEES 테이블

EMPLOYEE_ID

FIRST_NAME 

SALARY 

DEPARTMENT_ID 

 

 

 100 

 Steven

 24000 

 90 

 

 

 108 

 Nancy 

 12000 

 100 

 

 

110 

 John 

8200 

100 

 

 

  115 

 Alexander 

3100 

30 

 

 

145 

 John 

14000 

80 

 

 


SALARYGRADE 테이블

GRADE

LOSALARY 

HISALARY 

 

 

 

 A

20000 

99999 

 

 

 

 B

12000 

19999 

 

 

 

 C

8000 

11999 

 

 

 

 D

4000 

7999 

 

 

 

 E

3999 

 

 

 


select employee_id, first_name, salary, grade

from employees, salarygrade

where salary between losalary and hisalary;

EMPLOYEE_ID

FIRST_NAME

SALARY

GRADE

 

 

 100 

 Steven 

24000 

 A 

 

 

108 

 Nancy

12000 

 B

 

 

110 

 John

8200 

 C

 

 

115 

 Alexander

3100 

 E

 

 

145 

 John

14000 

 B

 

 


위 예제의 조인은 조인조건은 급여가 salarygrade 테이블의 losalary 컬럼의 값 보다는 크고 hisalary 컬럼의 값보다는 작은 범위를 검색하는 것으로 동일한 한 값을 찾는 등가 조인과는 다른 방식이다.


위와 같이 조인 조건에 등호(=)를 이용하지 않는 조인을 비등가 조인이라 한다.




+ Recent posts