본문 바로가기

Database

[데이터베이스] Join

728x90
반응형
데이터베이스에서 Join은 서로 다른 테이블들을 연결하여 하나의 테이블로 결과를 보여주는 중요한 작업이다.

우선 MySQL로 데이터베이스 테이블과 샘플 데이터를 설정해보자.

-- employees
CREATE TABLE employees (
	emp_id INT PRIMARY KEY,
	name VARCHAR(50),
	dept_id INT
);

-- departments
CREATE TABLE departments (
	dept_id INT PRIMARY KEY,
	dept_name VARCHAR(50)
);

-- insert sample data
INSERT INTO employees (emp_id, name, dept_id) VALUES
	(1, 'Aliece', 101),
	(2, 'Bob', 102),
	(3, 'Charlie' 103),
	(4, 'David', NULL);
    
INSERT INTO departments (dept_id, dept_name) VALUES
	(101, 'HR'),
	(102, 'Finance'),
	(103, 'IT');

결과

 


Inner Join

  • 교집합 연산과 유사. 하나로 합칠 두 테이블에 모두 연관된 값이 있는 유효한 레코드만 가져오는 방법.
  • 두 테이블 중 어느 한쪽이라도 비어있는 값이나 연관성이 없는 값은 제외된다.
  • 두 테이블 A, B가 있고 id 필드가 공통적으로 존재한다고 가정할 때, A, B에서 id가 일치하는 행만 결과로 나타난다.
SELECT e.name, d.dept_name
FROM employees e
INNER JOIN departments d ON e.dept_id = d.dept_id;

 

결과

name dept_name
Alice HR
Bob Finance

Outer Join

Outer Join은 하나로 합칠 두 테이블 중 어느 하나라도 값을 가진 레코드가 있으면 모두 출력하는 조인 방법이다.
Left, Right, Full로 나뉜다.

Left Join

  • 왼쪽 테이블의 모든 행과 오른쪽 테이블의 일치하는 행을 반환한다. 오른쪽 테이블에 일치하는 행이 없는 경우 NULL 값을 갖는다.
SELECT e.name, d.dept_name
FROM employees e
LEFT JOIN departments d ON e.dept_id = d.dept_id;

결과

name dept_name
Alice HR
Bob Finance
Charlie NULL
David NULL

Right Join

  • 오른쪽 테이블의 모든 행과 왼쪽 테이블의 일치하는 행을 반환한다. 왼쪽 테이블에 일치하는 행이 없는 경우 NULL 값을 갖는다.
SELECT e.name, d.dept_name
FROM employees e
RIGHT JOIN departments d ON e.dept_id = d.dept_id;

결과

name dept_name
Alice HR
Bob Finance
NULL IT

Full Outer Join

DBMS 별 지원 여부가 다르다. Oracle의 경우 Full Outer Join을 지원하지만 MySQL/MariaDB의 경우 지원하지 않아 UNION을 사용해야 한다.
  • 두 테이블의 모든 행을 반환한다. 일치하는 행이 없는 경우, 해당 테이블의 부분은 NULL로 표시한다.
SELECT e.name, d.dept_name
FROM employees e
LEFT JOIN departments d ON e.dept_id = d.dept_id

UNION

SELECT e.name, d.dept_name
FROM employees e
RIGHT JOIN departments d ON e.dept_id = d.dept_id;

결과

name dept_name
Alice HR
Bob Finance
Charlie NULL
David NULL
NULL IT

Cross Join

SELECT e.name, d.dept_name
FROM employees e
CROSS JOIN departments d;

 

  • 두 테이블 간 가능한 모든 조합을 반환한다.
  • SQLD나 정처기에서 가끔 레코드 수를 구하는 문제로 출제된다.
    = A의 레코드 수 * B의 레코드 수
728x90
반응형