JOIN
여러 테이블의 정보를 하나의 명령어로 활용할 수 있는 문법
제일 Basic한 Join 문법
ON절을 활용한 JOIN
JOIN절
=> FROM절의 테이블과 연결할 테이블을 명시
ON절
=> 테이블간의 연결 조건을 명시
[문법]
테이블 : employees, departments 조건사원.department_id = 부서.department_id
여러군데에 나눠져 있던 테이블이 한번에 불러와졌음
-- 102사원의 사번, 성, 급여, 소속부서, 부서명 출력
SELECT employees.employee_id, employees.last_name,
employees.salary, employees.department_id,
departments.department_name
FROM employees JOIN departments
ON employees.department_id = departments.department_id
WHERE employees.employee_id = 102;
EMPLOYEE_ID|LAST_NAME|SALARY|DEPARTMENT_ID|DEPARTMENT_NAME|
-----------+---------+------+-------------+---------------+
102|De Haan | 17000| 90|Executive |
FROM절의 테이블과 연결할 테이블을 JOIN절에 작성
두 테이블들을 연결하는 경우 연결할 규칙은 ON절에 명시
WHERE절은 기존 사용하는 방법 그대로 사용
table alias
구문 실행 동안 사용할 수 있는 테이블의 별명
사용 방법은 테이블명 다음 위치에 한칸 띄우고 원하는 공백이 없는 문자열을 작성
SELECT emp.employee_id, emp.last_name,
emp.salary, emp.department_id,
dept.department_name
FROM employees emp JOIN departments dept
ON emp.department_id = dept.department_id
WHERE emp.employee_id = 102;
JOIN에서 컬럼명 생략하기
JOIN을 사용하여 여러 테이블의 컬럼을 연결하여 출력하는 경우 각 테이블이 가지고 있는 고유한 이름의 컬럼명인 경우에는 컬럼이 속한 테이블 명을 적을 필요 없음.
고유한 이름의 컬럼명이 아닌 경우 필히 해당 컬럼이 속한 테이블 명을 작성!
아래의 구문에서는 department_id컬럼명은 employees, departments 테이블에 동일한 이름으로 있으므로 테
이블명(table alias)를 생략할 수 없다.
SELECT employee_id, last_name,
salary, emp.department_id,
department_name
FROM employees emp JOIN departments dept
ON emp.department_id = dept.department_id
WHERE employee_id = 102;
JOIN을 사용한 상태에서도 그룹에 대한 연산은 사용가능하며 그 사용 규칙도 동일하게 적용된다.
SELECT location_id, MAX(salary), MAX(emp.department_id)
FROM employees emp JOIN departments dept
ON emp.department_id = dept.department_id
GROUP BY location_id;
LOCATION_ID|MAX(SALARY)|MAX(EMP.DEPARTMENT_ID)|
-----------+-----------+----------------------+
1700| 24000| 110|
1400| 9000| 60|
2400| 6500| 40|
1500| 8200| 50|
1800| 13000| 20|
2500| 14000| 80|
2700| 10000| 70|
연습문제 풀이(p.26)
SELECT employee_id "employees", last_name, salary, dept.department_id, department_name
FROM employees emp JOIN departments dept
ON emp.department_id = dept.department_id;
employees|LAST_NAME |SALARY|DEPARTMENT_ID|DEPARTMENT_NAME |
---------+-----------+------+-------------+----------------+
200|Whalen | 4400| 10|Administration |
201|Hartstein | 13000| 20|Marketing |
202|Fay | 6000| 20|Marketing |
114|Raphaely | 11000| 30|Purchasing |
115|Khoo | 3100| 30|Purchasing |
116|Baida | 2900| 30|Purchasing |
117|Tobias | 2800| 30|Purchasing |
ON절을 사용한 Self-join
ON절을 사용한 JOIN구문을 작성 시 연결할 테이블이 서로 같은 테이블인 경우 이를 self-join이라 한다.
연결할 테이블명이 같으므로 table alias를 적절하게 활용하여 각 테이블의 내용을 구분해서 사용해준다.
모든 컬럼명이 중복되기 때문에 컬럼명 작성시 어떤 테이블의 컬럼인가를 명시하는 table alias를 생략할 수 없다.
-- 사원의 사번, 성, 매니저사번, 매니저의성
SELECT worker.employee_id, worker.last_name,
manager.employee_id, manager.last_name
FROM employees worker JOIN employees manager
ON worker.manager_id = manager.employee_id;
EMPLOYEE_ID|LAST_NAME |EMPLOYEE_ID|LAST_NAME|
-----------+-----------+-----------+---------+
168|Ozer | 148|Cambrault|
169|Bloom | 148|Cambrault|
170|Fox | 148|Cambrault|
171|Smith | 148|Cambrault|
172|Bates | 148|Cambrault|
…
둘 이상 테이블들의 JOIN
연결 할 테이블들을 JOIN과 ON절로 정의하면서 구문을 완성한다.
SELECT employee_id, last_name,
dept.department_id, dept.location_id,
lo.city, lo.country_id, co.country_name,
co.region_id, re.region_name
FROM employees emp
JOIN departments dept
ON emp.department_id = dept.department_id
JOIN locations lo
ON dept.location_id = lo.location_id
JOIN countries co
ON lo.country_id = co.country_id
JOIN regions re
ON co.region_id = re.region_id
WHERE emp.department_id > 90;
EMPLOYEE_ID|LAST_NAME|DEPARTMENT_ID|LOCATION_ID|CITY |COUNTRY_ID|COUNTRY_NAME |REGION_ID|REGION_NAME|
-----------+---------+-------------+-----------+-------+----------+------------------------+---------+-----------+
108|Greenberg| 100| 1700|Seattle|US |United States of America| 2|Americas |
109|Faviet | 100| 1700|Seattle|US |United States of America| 2|Americas |
110|Chen | 100| 1700|Seattle|US |United States of America| 2|Americas |
111|Sciarra | 100| 1700|Seattle|US |United States of America| 2|Americas |
112|Urman | 100| 1700|Seattle|US |United States of America| 2|Americas |
113|Popp | 100| 1700|Seattle|US |United States of America| 2|Americas |
205|Higgins | 110| 1700|Seattle|US |United States of America| 2|Americas |
206|Gietz | 110| 1700|Seattle|US |United States of America| 2|Americas |
SQL 기본 문법: JOIN(INNER, OUTER, CROSS, SELF JOIN)
하나의 테이블에 원하는 데이터가 모두 있다면 참 좋겠지만, 두 개의 테이블을 엮어야 원하는 결과가 나오는 경우도 많다.
조인을 쓰면 두 개의 테이블을 엮어서 원하는 데이터를 추출할 수 있다.
'DB' 카테고리의 다른 글
1004 DB - SubQuery 서브 쿼리 (0) | 2022.10.04 |
---|---|
1004 JSP - (MVC) 커넥션 풀 (DBCP), boardList (1) | 2022.10.04 |
0928 DB - Having 절 (0) | 2022.09.28 |
0927 DB - GROUP BY 절 ~ HAVING절 (0) | 2022.09.27 |
0921 DB - 일반함수 (1) | 2022.09.21 |