Search
Duplicate
😀

04. Group by (작성필요)

태그

Join

2개 이상의 테이블을 논리적으로 연결하여 가져오는 것
n개의 테이블을 join하는 경우에는 최소 n-1개의 조인 조건이 필요하다
조인 조건은 일반적으로 각 테이블의 PK(Primary Key) 및 FK(Foreign Key)로 구성된다.

Join의 종류

처리 방식에 따라
inner join : 조인 조건에 부합하는 레코드만 포함
outer join : 조인 조건에 부합되지 않는 레코드도 포함
조인 컬럼에 따라
natural join : 조인조건 생략, 공통컬럼 기준으로 조인
cross join : 조인조건 생략, 공통컬럼 X, 곱의 형태로 조인
Self join : 계층형 테이블에서만 사용

JOIN시 주의할 점

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

MySQL Optimizer

RBO (Rule based optimizer)
무조건 정해진 규칙에 의해서 수행됨.
과거에는 hw 성능이 좋지 않아 처리 방법에 대한 비용 산정으로 인한 부담이 있었지만, 요즘은 hw 성능의 향상으로 CBO를 많이 채택함
CBO (cost based optimizer)
optimizer가 select 등 수행 문장이 주어지면 처리 방법에 대한 비용을 산정해보고 적은 비용이 들어가는 처리방법 선택

INNER JOIN

가장 일반적인 JOIN의 종류이며 교집합이다.
동등 조인(Equi-Join)이라고도 하며, N개의 테이블 조인 시 N-1개의 조인 조건이 필요함
# 형식 select col1, col2,,,, colN from table1 INNER JOIN table2 on table1.column = table2.column; # using을 이용한 join 조건 지정 select col1, col2,,,, colN from table1 INNER JOIN table2 using (column); # using절에서는 table 이름이나 alias를 명시하면 error
SQL
복사

OUTER JOIN

LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN(MySql은 지원 X)으로 구분 됨
어느 한쪽 테이블에는 해당하는 데이터가 존재하는데 다른 쪽 테이블에는 데이터가 존재하지 않을 경우 그 데이터가 검색되지 않는 문제점을 해결하기 위해 사용
Left Outer Join
왼쪽 테이블 기준으로 Join 조건에 일치하지 않는 데이터까지 출력
Right Outer Join
오른쪽 테이블 기준으로 Join 조건에 일치하지 않는 데이터까지 출력
Full Outer Join
양쪽 테이블을 기준으로 Join 조건에 일치하지 않는 데이터까지 출력
MySQL은 지원하지 않음
# left outer join select COl1, COL2, COl3 from table1 left outer join table2 on or using; #right outer join select COl1, COL2, COl3 from table1 right outer join table2 on or using;
SQL
복사

SELF JOIN

같은 테이블끼리 join하는 경우
예시 : 모든 사원의 사번, 이름, 매니저사번, 매니저이름
select e.employee_id, e.first_name, m.employee_id, m.first_name from employees e inner join employees m on e.manager_id = m.employee_id;
SQL
복사

None-Equi JOIN

table의 PK, FK가 아닌 일반 column을 join 조건으로 지정
예시 : 모든 사원의 사번, 이름, 급여, 급여등급
select e.employee_id, e.first_name, e.salary, s.grade from employees e join salgrades s where e.salary between s.losal and s.hisal;
SQL
복사