본문 바로가기
CS/Database

RDB Join Query

by clearinging 2021. 6. 5.
반응형

Join

정의

  • 두개 이상의 테이블을 연결 또는 결합하여 데이터를 출력하는 것

목적

  • 조인을 사용하는 이유는 정규화로 인해 분리된 테이블에서 필요한 데이터만 얻기 위한 이유

종류

  1. Inner Join
  2. Outer Join
  3. Cross Join
  4. Self Join
  5. Anti Join
  6. 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