샘플 스키마 : 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 |
0 |
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 컬럼의 값보다는 작은 범위를 검색하는 것으로 동일한 한 값을 찾는 등가 조인과는 다른 방식이다.
위와 같이 조인 조건에 등호(=)를 이용하지 않는 조인을 비등가 조인이라 한다.
'SQL' 카테고리의 다른 글
[SQL 13] 조인 - 자체 조인(Self Join), 외부 조인(Outer Join) (0) | 2017.12.08 |
---|---|
[SQL 12] 조인 문을 쉽게 만드는 Tip (0) | 2017.12.08 |
[SQL 10] 그룹 함수, GROUP BY 절, HAVING 절 (1) | 2017.12.04 |
[SQL 09] 단일 행 함수 - 일반 함수 & 조건 표현식(CASE, DECODE) (0) | 2017.12.03 |
[SQL 08] 단일 행 함수 - 변환 함수 (0) | 2017.12.03 |