본문 바로가기

DB

0928 DB - JOIN

728x90
반응형

 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)

 

하나의 테이블에 원하는 데이터가 모두 있다면 참 좋겠지만, 두 개의 테이블을 엮어야 원하는 결과가 나오는 경우도 많다.

조인을 쓰면 두 개의 테이블을 엮어서 원하는 데이터를 추출할 수 있다.

 

 

 

 

 

728x90
반응형

'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