⛏️/Mysql | Oracle

[SQL] 7. JOIN

defyuil 2023. 8. 9. 09:30

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;