[MySQL] JOIN

unzinzanda·2023년 4월 16일
0

MySQL

목록 보기
2/2
post-thumbnail

JOIN

JOIN

  • 둘 이상의 테이블에서 데이터가 필요한 경우 테이블 조인이 필요.
  • 조인 조건을 포함하는 ON 절을 반드시 작성해야 함.
  • 조인 조건은 일반적으로 각 테이블의 PK 및 FK로 구성.

JOIN의 종류

  • Inner Join
  • Outer Join
    • Left Outer Join
    • Right Outer Join
  • Self Join
  • Non-Equi Join
  • Join 조건의 명시에 따른 구분
    • Natural Join
    • Cross Join (Full [Outer] Join, Cartesian Join)

JOIN 시 주의

  • 조인의 처리는 어느 테이블을 먼저 읽을지를 결정하는 것이 중요.(처리할 작업량이 상당히 달라짐)
  • Inner Join : 어느 테이블을 먼저 읽어도 결과가 달라지지 않아 MySQL 옵티마이저가 조인의 순서를 조절해서 다양한 방법으로 최적화를 수행.
  • Outer Join : 반드시 Outer가 되는 테이블을 먼저 읽어야 하므로 옵티마이저가 조인의 순서를 선택할 수 없음.

JOIN의 필요성

  • 사번이 100인 사원의 사번, 이름., 급여, 부서이름을 출력.
select employee_id, first_name, salary, department_name
from employees
where employee_id = 100;
-- 결과 : 오류
  • 문제점 : department_name은 departments라는 테이블에 있고 나머지는 employees라는 테이블에 존재.
  • Join이 없다면 이런 식으로 불편하게 출력해야 함.
select e.employee_id, e.first_name, e.salary, d.department_name
from employees e, departments d -- e와 d가 각 테이블의 alias
where e.department_id = d.department_id 
and e.employee_id = 100;
  • 코드가 너무 길어지고 불편하기 때문에 Join을 사용.



INNER JOIN

  • 가장 일반적인 JOIN의 종류이며 교집합.
  • 동등 조인(Equi-Join)이라고도 함.
  • N개의 테이블 조인 시 N - 1개의 조인 조건 필요.

형식

SELECT col1, col2, ..., colN
FROM   table1 (INNER) JOIN table2
ON	   table1.column = table2.column;
-- join 조건은 on 절로, 일반 조건은 where 절로.

SELECT col1, col2, ..., colN
FROM   table1 (INNER) JOIN table2
USING  (공통column);
-- using 절에서는 table이름이나 alias를 명시하면 error
  • table에 alias 사용.
SELECT alias1.col1, alias1.col2, ..., alias2.colN
FROM   table1 AS alias1 (INNER) JOIN table2 AS alias2
ON	   alias1.column = alias2.column;

위의 예시에 INNER JOIN 적용

  • 사번이 100인 사원의 사번, 이름, 급여, 부서이름
SELECT e.employee_id, e.first_name, e.salary, 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, d.department_name
FROM   employees e INNER JOIN departments d
USING  (department_id)
WHERE  e.employee_id = 100;



NATURAL JOIN

  • 알아서 두 테이블의 겹치는 컬럼을 가지고 JOIN.
  • 하지만 두 테이블에 겹치는 컬럼이 여러 개일 경우 오류가 발생하므로 주의해서 사용해야 함.

형식

SELECT col1, col2, ..., colN
FROM   table1 NATURAL JOIN table2;



OUTER JOIN

OUTER JOIN

  • LEFT, RIGHT, FULL OUTER JOIN으로 구분. (MySQL에서 FULL OUTER JOIN 제공 X)
  • 어느 한 쪽 테이블에는 해당하는 데이터가 존재하는데 다른 쪽 테이블에는 데이터가 존재하지 않는 경우 그 데이터가 검색되지 않는 문제점을 해결하기 위해 사용.

LEFT OUTER JOIN

  • 왼쪽 테이블 기준으로 JOIN 조건에 일치 하지 않는 데이터까지 출력.

형식

SELECT col1, col2, ..., colN
FROM   table1 LEFT OUTER JOIN table2
ON or USING;

사용 예시

SELECT e.employee_id, e.first_name, d.department_name
FROM   employees e INNER JOIN departments d
USING  (department_id)
  • 원래라면 107명의 정보가 나와야 하지만 department_id = null인 사원이 한 명 존재하기 때문에 106명만 검색됨.
    → null이기 때문에 JOIN 조건을 만족할 수 없음.
  • 이럴 때, OUTER JOIN 사용.
SELECT e.employee_id, e.first_name, d.department_name
FROM   employees e LEFT (OUTER) JOIN departments d
ON     e.department_id = d.department_id;

RIGHT OUTER JOIN

  • 오른쪽 테이블 기준으로 JOIN 조건에 일치하지 않는 데이터까지 출력.

형식

SELECT col1, col2, ..., colN
FROM   table1 RIGHT OUTER JOIN table2
ON or USING;

FULL OUTER JOIN

  • 양쪽 테이블 기준으로 JOIN 조건에 일치하지 않는 데이터까지 출력.

형식

SELECT col1, col2, ..., colN
FROM   table1 FULL OUTER JOIN table2
ON or USING;
  • MySQL에선 지원하지 않음.
  • 따라서 MySQL에선 UNION을 통해 FULL OUTER JOIN을 어느 정도 대체.
  • UNION할 때는 출력할 컬럼명의 갯수, 종류, 순서를 모두 맞춰줘야 함.

예시

SELECT d.department_name, e.employee_id, e.first_name
FROM   employees e LEFT JOIN departments d
ON     e.department_id = d.department_id
UNION
SELECT d.department_name, e.employee_id, e.first_name
FROM   employees e RIGHT JOIN departments d
ON     e.department_id = d.department_id;

SELF JOIN

  • 같은 테이블끼리 JOIN.
  • 같은 테이블의 alias를 달리하여 각각 별도의 테이블처럼 사용.
SELECT alias1.col1, alias2.col2, ..., alias2.colN
FROM   table1 AS alias1, table1 AS alias2
ON     alias1.col1 = alias2.col2;

NONE-EQUI JOIN

  • table의 PK, FK가 아닌 일반 column을 JOIN 조건으로 지정.
profile
안녕하세요 :)

0개의 댓글