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문에 작성하는 서브쿼리
      1. 단일행
      2. 복수(다중)행
      3. 다중 컬럼
    • 인라인뷰 - FROM 문에 작성하는 서브쿼리
    • 스칼라 서브쿼리 - SELECT문에 작성하는 ㅅ서브 쿼리
  • 서브쿼리는 반드시 ()로 감싸야 한다.
  • 서브쿼리는 단일행 또는 다중행 비교 연산자와 함께 사용한다.
  • 서브쿼리가 사용이 가능한곳
    • 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