[SQL] 7. JOIN
JOIN
- 관계형 데이터베이스에서는 중복값 관련 문제를 피하기 위해서 데이터를 조합하는 JOIN의 문법을 사용한다.
- 다양한 형태의 JOIN 문법이 있으며, 필요한 JOIN 규칙을 적용하여 사용한다.
- 기본적으로 테이블의 구조와 테이블의 데이터들의 관계에 대한 이해가 필요하다.
ON절을 사용한 JOIN
- 기본적인 JOIN의 방법으로 JOIN과 ON의 키워드를 활용하여 정보를 조합한다.
- JOIN절 : FROM절의 테이블과 연결할 테이블을 명시한다.
- ON절 : JOIN절 사용 시 필수로 사용해야 하는 절로, JOIN으로 테이블을 연결하는 규칙을 작성하는 절.
- 테이블의 순서는 출력 내용에는 영향이 없으나 실행되는 속도부분에서 최대한 작은 정보를 가진 테이블로 JOIN을 시작하는게 효율적이다.
- 기본적으로 컬럼명 앞에는 테이블명을 작성하며, 사용할 테이블들에 걸쳐 컬럼명이 고유하다면 컬럼명 앞의 테이블명을 생략해도 된다.
- 테이블 명을 대체할 수 있는 table alias를 사용할 수 있다.
SELECT employees.employee_id, employees.last_name, employees.department_id, departments.department_id, departments.department_name FROM departments ← 가능하면 작은 테이블먼저 JOIN employees ON employees.department_id = departments.department_id; |
employee_id|last_name |department_id|department_id|department_name |
-----------+-----------+-------------+-------------+----------------+
200|Whalen | 10| 10|Administration |
…
106|Pataballa | 60| 60|IT |
107|Lorentz | 60| 60|IT |
204|Baer | 70| 70|Public Relations|
145|Russell | 80| 80|Sales |
146|Partners | 80| 80|Sales |
…
SELECT employee_id, last_name, em.department_id, de.department_id, department_name FROM departments de JOIN employees em ON em.department_id = de.department_id; |
table alias
- 구문이 실행되는 동안 유지되는 테이블에 대한 별명
- 전체 테이블명을 대체하여 사용할 수 있다.
- 중복되지 않는다면 글자수와 상관없이 사용 가능하다.
- 모든 테이블에서 사용하는 컬럼명이 고유한 이름을 가지고 있는 경우 컬럼명 앞에 작성되는 테이블명을 생략할 수 있다.
SELECT employee_id, last_name, em.department_id, de.department_id, department_name FROM departments de JOIN employees em ON em.department_id = de.department_id; |
SELECT employee_id, dept.department_id, department_name FROM departments dept JOIN employees emp ON dept.department_id = emp.department_id WHERE emp.department_id = 20; |
employee_id|department_id|department_name|
-----------+-------------+---------------+
201| 20|Marketing |
202| 20|Marketing |
Q.employees, jobs 테이블에서 사번, 성, job_id, job_title 정보를 JOIN하여 출력
SELECT e.employee_id, e.last_name, j.job_id, j.job_title FROM jobs j JOIN employees e ON e.job_id = j.job_id; |
SELECT e.employee_id, e.last_name, j.job_id, j.job_title FROM jobs j JOIN employees e ON e.job_id = j.job_id WHERE job_title LIKE '%President%'; |
- departments, locations의 테이블을 조인하여
부서 번호, 부서명, 위치코드, 도시
SELECT d.department_id, d.department_name, l.location_id, l.city FROM locations l JOIN departments d ON l.location_id = d.location_id; |
연습문제 풀이(p.118)
SELECT employee_id, last_name, salary, d.department_id, department_name FROM departments d JOIN employees e ON d.department_id = e.department_id; |
SELECT employee_id, e.department_id, d.department_id, department_name FROM employees e, departments d WHERE e.department_id = d.department_id; |
self-join
- 같은 테이블의 데이터들을 JOIN으로 연결하여 결과를 출력하는 JOIN의 방식
- 주로 계층형 구조를 가지고 있는 테이블에서 활용한다.
SELECT worker.employee_id, worker.last_name, worker.manager_id, manager.employee_id, manager.last_name FROM employees worker JOIN employees manager ON worker.manager_id = manager.employee_id; |
연습문제 풀이
SELECT w.last_name Employee, w.employee_id "Emp#", m.last_name Manager,m.employee_id "Mgr#" FROM employees w JOIN employees m ON w.manager_id = m.employee_id; |
3 이상의 테이블의 JOIN
- JOIN은 데이터가 작은 테이블부터 시작해주는 것이 좋음.
- 추가적인 테이블들의 JOIN은 JOIN절과 ON절을 반복해서 계속 연결이 가능하다.
SELECT employee_id, last_name, j.job_title, department_name, city, c.country_id, c.country_name, r.region_id, region_name FROM jobs j JOIN employees e ON j.job_id = e.job_id JOIN departments d ON e.department_id = d.department_id JOIN locations l ON d.location_id =l.location_id JOIN countries c ON l.country_id = c.country_id JOIN regions r ON c.region_id = r.region_id; |