JOIN
- 관계형 데이터베이스에서는 중복값 관련 문제를 피하기 위해서 데이터를 조합하는 JOIN의 문법을 사용한다.
- 다양한 형태의 JOIN 문법이 있으며, 필요한 JOIN 규칙을 적용하여 사용한다.
- 기본적으로 테이블의 구조와 테이블의 데이터들의 관계에 대한 이해가 필요하다.
ON절을 사용한 JOIN
- 기본적인 JOIN의 방법으로 JOIN과 ON의 키워드를 활용하여 정보를 조합한다.
- JOIN절 : FROM절의 테이블과 연결할 테이블을 명시한다.
- ON절 : JOIN절 사용 시 필수로 사용해야 하는 절로, JOIN으로 테이블을 연결하는 규칙을 작성하는 절.
- 사원의 정보와 사원이 근무하는 부서의 정보 조회
- 필요한 테이블(JOIN)? employees, departments
- 연결조건(ON)?
- employees.department_id = departments.department_id
*SELECT employees.employee_id,
employees.last_name, employees.department_id,
departments.department_id, departments.department_name
FROM departments // table alias
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 em.employee_id,
em.last_name, em.department_id,
de.department_id, de.department_name
FROM departments de
JOIN employees em
ON em.department_id = de.department_id;
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;
두 테이블에서 같은 값을 추출한 것을 알 수 있다.
- 테이블의 순서는 출력 내용에는 영향이 없으나 실행되는 속도부분에서 최대한 작은 정보를 가진 테이블로 JOIN을 시작하는게 효율적이다.
- 기본적으로 컬럼명 앞에는 테이블명을 작성하며, 사용할 테이블들에 걸쳐 컬럼명이 고유하다면 컬럼명 앞의 테이블명을 생략해도 된다.
- 테이블 명을 대체할 수 있는 table alias를 사용할 수 있다.
ELECT 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;
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;
SELECT employee_id, department_id
FROM employees;
SELECT department_id, department_name
FROM departments;
-- employees, departments --> FROM, JOIN
-- employees.department_id = departments.department_id --> ON(컬럼의 연결규칙)
-- 필요한만큼만 읽고, 쓰기 (가능하면 작은 테이블먼저)
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;
SELF-JOIN
- 같은 테이블의 데이터들을 JOIN으로 연결하여 결과를 출력하는 JOIN의 방식
- 주로 계층형 구조를 가지고 있는 테이블에서 활용한다.
- 테이블명이나 컬럼의 구성이 완전 동일한 상태로 JOIN을 하기 때문에 테이블의 구분은 table alias로 한다. 따라서 table alias는 필수로 작성한다.
- 사원의 사번, 성, 매니저사번, 매니저의 사번, 성을 출력
- 매니저와 사원은 모두 회사의 직원이므로 둘 다 employees 테이블의 데이터이다.
- 사원의 정보는 worker, 매니저의 정보는 manager의 정보를 사용한다.
- 같은 컬럼일 경우 각각 alias 필수!
-- 부하 worker, 매니저 manager
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;
'DB > MySQL' 카테고리의 다른 글
[MySQL] 데이터 언어 - DDL (0) | 2023.09.16 |
---|---|
[MySQL] 데이터 언어 - DML (0) | 2023.09.16 |
[Mysql] ORDER BY절(정렬) (0) | 2023.09.16 |
[Mysql] where절과 연산자(2) (0) | 2023.09.14 |
[Mysql] ★where절(조건문)과 연산자(1) (0) | 2023.09.14 |