JOIN
Updated:
JOIN
- 둘 이상의 테이블에서 데이터가 필요한 경우 테이블 조인이 필요.
- 일반적으로 조인 조건을 포함하는 where절을 작성해야 한다..
- 조인 조건은 일반적으로 각 테이블의 PK 및 FK로 구성됩니다.
- JOIN의 종류
- INNER JOIN
- OUTER JOIN : LEFT OUTER JOIN, RIGHT OUTER JOIN
- JOIN 조건의 명시에 따른 구분: NATURAL JOIN, CROSS JOIN(FULL JOIN, CARTESIAN JOIN)
- JOIN시 주의
- 조인의 처리는 어느 테이블을 먼저 읽을지를 결정하는 것이 중요(처리할 작업량이 상당히 달라진다.)
- INNER JOIN : 어느 테이블을 먼저 읽어도 결과가 달라지지 않아 MySQL 옵티마이저가 조인의 순서를 조절해서 다양한 방법으로 최적화를 수행할 수 있다.
- OUTER JOIN : 반드시 OUTER가 되는 테이블을 먼저 읽어야 하므로 옵티마이저가 조인 순서를 선택할 수 없다.
` – 사번이 100인 사원의 사번, 이름, 급여, 부서이름을 출력. select employee_id, first_name, salary, department_name from employees, departments where employees.department_id = departments.department_id and employee_id = 100; `
INNERJOIN
- 가장 일반적인 JOIN의 종류이며 교집합이다.
- 동등 조인이라고도 하며, N개의 테이블 조인시 N-1개의 조인 조건이 필요함.
-
on을 사용하여 join조건 설정 ` select e.employee_id, e.first_name, e.salary, d.department_id, d.department_name from employees e inner join departments d on e.department_id = d.department_id where e.employee_id = 100; `
- using을 사용하여 조건을 설정할 수도 있다. ` select e.employee_id, e.first_name, e.salary, department_id, d.department_name from employees e inner join departments d using (department_id) where e.employee_id = 100; `
- using사용시 department_id가 누구껀지를 명시해주지 않는다.
Natural join
- 컬럼이 똑같은걸 알아서 합쳐준다.
- 단 똑같은 컬럼이 2개 이상인 경우 사용시에 원하는 결과를 못얻을 수 있다. ` select e.employee_id, e.first_name, e.salary, d.department_id, d.department_name from employees e natural join departments d where e.employee_id = 100;
select d., l. from departments d natural join locations l; `
Outer join
- LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN으로 구분됨
- 어느 한쪽 테이블에는 해당하는 데이터가 존재하는데 다른쪽 테이블에는 데이터가 존재하지 않을 경우 그데이터가 검색되지 않는 문제점을 해결하기 위해 사용.
- LEFT OUTER JOIN
- 왼쪽 테이블을 기준으로 JOIN조건에 일치하지 않는 데이터까지 출력
- RIGHT OUTER JOIN
- 오른쪽 테이블을 기준으로 JOIN 조건에 일치하지 않는 데이터까지 출력
- FULL OUTER JOIN
- 양쪽 테이블을 기준으로 JOIN 조건에 일치하지 않는 데이터까지 출력
- SELF JOIN
- 같은 테이블끼리 JOIN
- None-Equi JOIN
- 테이블의 PK, FK가 아닌 일반 column을 join조건으로 지정
서브쿼리
- 서브쿼리란 다른 쿼리 내부에 포함되어 있는 SELECT문을 의미한다.
- 서브쿼리를 포함하고 있는 쿼리를 외부쿼리 또는 메인 쿼리라고 부르며, 서브 쿼리는 내부 쿼리라고도 부른다.
- 서브쿼리는 비교 연산자의 오른쪽에 기술해야 하고 반드시 괄호(())로 감싸져 있어야만 한다.
- 서브쿼리의 종류
- 중첩서브쿼리 : WHERE문에 작성하는 서브쿼리
- 단일행
- 복수(다중)행
- 다중 컬럼
- 인라인뷰 - FROM 문에 작성하는 서브쿼리
- 스칼라 서브쿼리 - SELECT문에 작성하는 ㅅ서브 쿼리
- 중첩서브쿼리 : WHERE문에 작성하는 서브쿼리
- 서브쿼리는 반드시 ()로 감싸야 한다.
- 서브쿼리는 단일행 또는 다중행 비교 연산자와 함께 사용한다.
- 서브쿼리가 사용이 가능한곳
- SELECT
- FROM
- WHERE
- HAVING
- ORDER BY
- INSERT문의 VALUES
- UPDATE의 SET
- Nested Subquery - 단일행 ` SELECT department_name from departments where department_id = ( select department_id from employees where employee_id=100 ); `
-
다중행 : 서브쿼리의 결과가 다중행을 리턴 : IN, ANY, ALL 상호연관서브쿼리알아보기
- 다중 컬럼 ` select employee_id, first_name from employees where (salary, department_id) in ( select salary, department_id from employees where commission_pct is not null and manager_id = 148 ); `
서브쿼리 종류
- 인라인 뷰
- FROM 절에 사용되는 서브 쿼리를 인라인 뷰라 한다.
- 서브 쿼리가 FROM 절에 사용되면 뷰처럼 결과가 동적으로 생성된 테이블로 사용 가능
- 임시적인 뷰이기 때문에 데이터베이스에는 저장되지 않는다.
- 동적으로 생성된 테이블이기 때문에 COLUMN을 자유롭게 참조 가능.
` select e.employee_id, e.first_name, e.salary, e.department_id from ( select distinct department_id from employees where salary < (select avg(salary) from employees) ) a join employees e on a.department_id = e.department_id; `
- limit활용
- 스칼라서브쿼리
- SELECT 절에 있는 서브쿼리
- 한개의 행만 반환
Leave a comment