반응형
Join
정의
- 두개 이상의 테이블을 연결 또는 결합하여 데이터를 출력하는 것
목적
- 조인을 사용하는 이유는 정규화로 인해 분리된 테이블에서 필요한 데이터만 얻기 위한 이유
종류
- Inner Join
- Outer Join
- Cross Join
- Self Join
- Anti Join
- Semi Join
테스트 데이터
- 테스트 코드
create table department (
dep_id bigint primary key auto_increment,
dep_name varchar(50)
);
create table employee (
emp_id bigint primary key auto_increment,
dep_number bigint,
name varchar(20),
age int,
foreign key (dep_number) references department(dep_id)
on delete cascade on update cascade
);
insert into employee(dep_number, name, age) values(1, 'kkh', 26);
insert into employee(dep_number, name, age) values(1, 'hsh', 25);
insert into employee(dep_number, name, age) values(1, 'ljk', 25);
insert into employee(dep_number, name, age) values(1, 'jojodo', 26);
insert into employee(dep_number, name, age) values(2, 'kwj', 26);
insert into employee(dep_number, name, age) values(2, 'hello', 28);
insert into employee(dep_number, name, age) values(3, 'pwl', 26);
insert into employee(dep_number, name, age) values(3, 'kjw', 28);
insert into department(dep_name) value('dev');
insert into department(dep_name) value('marketing');
insert into department(dep_name) value('design');
Inner Join
정의
- 두 테이블에 공통 속성(교집합)을 가진 튜플들을 보여준다.
Equal Join
SELECT *
FROM employee, department
WHERE employee.dep_number = department.dep_id;
명시적 Inner Join
- 외래 키와 pk가 동일한 이름을 가질 경우 using 사용 가능
SELECT *
FROM employee JOIN department USING(dep_id);
SELECT *
FROM employee INNER JOIN department
ON employee.dep_number = department.dep_id;
- using 조건절
- alias나 테이블 이름과 같은 접두사를 사용할 수 없음
- 1개 이상의 컬럼을 정의할 수 있음
- ON 조건절
- 컬럼명이 다르더라도 JOIN 조건을사용할 수 있음
- 테이블이 많이 사용될 경우 가독성이 떨어질 수 있음
Outer Join
정의
- 한쪽 테이블에 정보를 join조건에 맞지 않더라도 모든 정보를 보여주고 싶을 경우 사용한다.
Left Outer Join
- 왼쪽 테이블 기준으로 데이터 출력
- Join조건이 성립되지 않을 경우 오른쪽 테이블 정보에 null로 체워져 있음
SELECT *
FROM employee LEFT JOIN department
ON employee.dep_number = department.dep_id;
Right Outer Join
- 오른쪽 테이블 기준으로 데이터 출력
- Join조건이 성립되지 않을 경우 왼쪽 테이블 정보에 null로 체워져 있음
SELECT *
FROM employee RIGHT JOIN department
ON employee.dep_number = department.dep_id;
Full Outer Join
- mysql 에서는 지원하지 않음
- left outer join, right outer join 2개의 결과를 합친 것
SELECT *
FROM employee FULL OUTER JOIN department
ON employee.dep_number = department.dep_id;
- mysql 은 아래와 같이 작성해야 한다.
SELECT *
FROM employee RIGHT JOIN department
ON employee.dep_number = department.dep_id
UNION
SELECT *
FROM employee LEFT JOIN department
ON employee.dep_number = department.dep_id;
Cross Join
정의
- cross product 라고도 한다.
- 테이블간 Join 조건 없을 때 생기는 모든 경우의 수를 나타냄
- 카타시안 곱이라고 말할 수 있음
SELECT *
FROM employee CROSS JOIN department;
Self Join
정의
- 자기 자신과 조인하는 것을 말한다.
SELECT *
FROM employee AS E INNER JOIN employee AS M
ON E.mgr = M.emp_id;
Anti Join
정의
- 조인 대상이 되는 테이블과 일치하지 않는 데이터를 추출하는 조인 방식
- NOT IN, NOT EXISTS 사용해서 JOIN하는 연산을 말한다.
SELECT *
FROM employee
WHERE name NOT IN (
SELECT "kkh"
FROM
dual);
Semi Join
정의
- 조인과 유사하게 데이터를 연결하는 조인 기법
- 분산 질이에 도움이 된다.
- sub query에서 row수를 최대한 줄이고 join할 때 많이 사용한다. -> row수를 줄이는 로직을 분산해서 최적의 효율을 내기 위해서 사용
SELECT *
FROM employee AS emp
WHERE emp.dep_number IN (
SELECT DEP.dep_id
FROM department AS dep
WHERE dep.dep_id in (1, 3)
);
반응형
'CS > Database' 카테고리의 다른 글
RDB Join 방식 (0) | 2021.12.09 |
---|---|
NamingLock을 이용한 동시성 이슈, Deadlock query 이슈 해결 (0) | 2021.12.01 |
DB Isolation (0) | 2021.10.30 |
Mysql Replication (3) | 2021.10.06 |
DB 스키마 (0) | 2021.06.05 |