[Database] SQL Join 개념 및 종류

정현명·2022년 3월 17일
0

Database

목록 보기
15/17
post-thumbnail

[Database] SQL Join 개념 및 종류


Join

둘 이상의 테이블에서 데이터가 필요한 경우 테이블 조인

일반적으로 조인 조건을 포함하는 WHERE절을 작성

조인조건은 일반적으로 각 테이블의 PK 및 FK 로 구성



Join 종류

Inner Join

Outer Join

Left Outer Join

Right Outer Join



Join 조건에 따른 구분

equi-join : 동등 비교 조건 (=)

non equi-join : 동등 비교가 아닌 조건 (≥, ≤, >, <)



조인 결과 처리 방식에 따른 구분

inner-join : 조인조건에 부합하는 레코드를 가져올 때, 부합하는 레코드만 결과 집합으로 가져옴

outer-join : 조인조건에 부합하는 레코드 뿐만 아니라 부합하지 않는 레코드도 포함하여 결과 집합으로 가져옴 ⇒ 기준 테이블을 정하고 그 테이블의 전체 데이터를 가져옴 left or right



그 밖

self join : 자신과 자신을 조인하는 형태 ( 사원 : 사원-상사 ), ( 게시판 : 자식글 -부모글)

cross join : 두 테이블의 모든 가능한 조인을 다 처리한 형태의 결과 (조인조건을 명시하지 않았을 때)

natural join : 조인조건을 명시하지 않고 두 테이블의 모든 공통컬럼을 이용하여 조인



Join시 주의

조인의 처리는 어느 테이블을 먼저 읽을지를 결정하는 것이 중요(처리할 작업량이 상당히 달라짐)

Inner Join : 어느 테이블을 먼저 읽어도 결과가 달라지지 않아 MySql 옵티마이저가 조인의 순서를 조절하여 다양한 방법으로 최적화

Outer Join : 반드시 Outer가 되는 테이블을 먼저 읽어야 하므로 옵티마이저가 조인 순서를 선택할 수 없다



Inner Join

가장 일반적인 Join의 종류이며 교집합

동등 조인(Equi-Join)이라고도 하며 N개의 테이블 조인시 N-1개의 조인 조건이 필요

-- 기본 형
select col1, col2, ... colN
from table1 Inner join table2
on table1.column = table2.column;

-- N개의 Inner Join을 위해서는 N-1개의 join 조건이 필요
select col1, col2, ..colN
from table1 Inner join table2 Inner join table3
on table1.column_a = table2.column_a
and table1.column_b = table3.column_b;

-- 컬럼명이 동일할 때 조인조건에서 컬럼명을 각 테이블별로 명시하지 않고 
-- Using절 사용
select col1, col2, ... colN
from table1 Inner join table2
using (column);
-- using절에 alias나 table 이름을 명시하면 오류!


Natural join

동일한 타입과 이름을 가진 컬럼을 조인조건으로 이용

반드시 두 테이블 간의 동일한 이름, 타입을 가진 컬럼이 필요

조인에 이용되는 컬럼을 명시하지 않아도 자동으로 조인에 사용

-- 기본형
select col1, col2, .. colN
from table1 natural join table2

-- 두 테이블 간의 동일한 이름의 컬럼이 자동으로 조인에 사용되므로 
-- 이 컬럼의 타입과 의미가 같아야 한다
-- 예를 들어 사원 테이블의 manager 컬럼은 상사를 의미하고 
-- 부서 테이블의 manager 컬럼이 부서장을 의미할 때 이를 자연조인 하면
-- 자연조인 조건에 부합하지 않기 때문에 원하지 않은 결과가 나올 수 있다


Outer join

Left Outer join과 Right Outer join으로 나뉨

어느 한쪽 테이블에는 해당하는 데이터가 존재하는데 다른 쪽 테이블에는 데이터가 존재하지 않을 경우 그 데이터가 검색되지 않는 문제점을 해결하기 위해 사용

Outer join


-- Left Outer join 기본형
select col1, col2, .. colN
from table1 left outer join table2
-- on or using

-- Right Outer join 기본형
select col1, col2, .. colN
from table1 right outer join table2
-- on or using

-- full outer join  -> mysql에서는 따로 기능이 없기 때문에
-- left outer join과 right outer join을 합집합
select col1, col2, .. colN
from table1 left outer join table2
union
select col1, col2, .. colN
from table1 right outer join table2

-- oracle에서 full outer join
select col1, col2, .. colN
from table1 full outer join table2
-- on or using


Self join

같은 테이블끼리 join할 때 사용

ex : 한 테이블에 사원 이름과 사원번호, 상사 번호가 있을 때, 상사 이름을 알고싶다면?

-- 한 사원의 상사 번호와 일치하는 사원번호를 찾아 이름과 함께 출력, 상사 번호가 없으면 사장!?
select e.employee_id, e.first_name, m.employee_id, m.first_name
from employees e join employyes m
on e.manager_id  = m.employee_id;


Non-Equi join

테이블의 PK, FK가 아닌 일반 조건을 join 조건으로 지정 (공통 컬럼이 아닌 컬럼에 <, >, ≤, ≥, 등 비교연산자로 범위지정)

full table scan을 하기 때문에 속도가 느림

-- 사원 테이블의 급여에 대해 급여등급 테이블의 기준에 따라 급여등급을 부여하기
-- 이 때 사원 테이블과 급여등급 테이블은 같은 컬럼이 없기 때문에 동등조건을 주지 않는다
-- 대신 비교연산자로 조인 조건으로 준다 == None-Equi join
select e.employee_id, e.first_name, e.salary, s.grade
from employee e join salgrades s
on e.salary between s.lowsal and s.highsal

SELECT *  
FROM table_name1, table_name2  
WHERE table_name1.column [> |  < |  >= | <= ] table_name2.column;
profile
꾸준함, 책임감

0개의 댓글