SQL Join의 모든 것

알비레오·2024년 7월 31일

DB

목록 보기
6/15

Join 종류

1. 교차조인(CROSS JOIN)

카티션프로덕트(교차곱 A X B)

( JOIN 조건을 잘못 기술한 경우, JOIN 조건을 정의하지 않았을 때, JOIN에 참여하는 릴레이션의 모든 튜플이 조인되는 경우)

2. 세타조인(THETA JOIN) ⋉, 왼쪽 세미조인 ⋉, 오른쪽 세미조인 ⋊

T= R⋈(AΘB) S

R의 속성 A와 S의 속성 B가 세타관계가 성립하는 새로운 T 릴레이션을 생성

조인 조건에 관계 연산자(=, <, > 등) 사용을 일반화하여 표현

조인에 관련된 모든 속성을 포함(중복 허용)

3. 동일(동등)조인(EQUI JOIN) = 내부조인(INNER JOIN)

⋈(A=B)

교집합(A∩B)

세타조인에서 비교연산자가 =인 경우

조인에 관련된 모든 속성을 포함(중복 허용)

4. 자연조인(NATURAL JOIN)

⋈N

자연 조인은 동일 조인의 결과에서 중복되는 속성을 제거한 릴레이션

5. 세미조인(SEMI JOIN)

A,B가 조인될 경우 A와 조인될 가능성이 있는 B의 튜플만을 골라 전송하는 연산

자연조인 후 어느 한쪽 릴레이션의 애트리뷰트만으로 프로젝트

세미조인도 방향이 있음

6. 완전 외부조인 (FULL OUTER JOIN) ⟗


합집합(A∪B) or 합집합 연산 결과에서 교집합 연산 결과를 뺀것((A∪B) - (A∩B))

* OUTER JOIN 속성 : 공통된 속성을 매개로 하는 정보가 아니더라도 버리지 않고

연산의 결과 릴레이션에 정보를 남겨둠

(공통 속성 아닌 경우 NULL)

7. 왼쪽 외부조인 (LEFT OUTER JOIN) ⟕


교집합 연산 결과와 차집합 연산 결과를 합친것( (A∩B) ∪ (A-B) ) or 차집합 연산(A-B)

오라클 SQL은 WHERE 테이블A.조인키컬럼 = 테이블B.조인키컬럼(+) 표시

8. 오른쪽 외부조인 (RIGHT OUTER JOIN) ⟖


교집합 연산 결과와 차집합 연산 결과를 합친것( (A∩B) ∪ (B-A) ) or 차집합 연산(B-A)

오라클 SQL은 WHERE 테이블A.조인키컬럼(+) = 테이블B.조인키컬럼 표시

9. 셀프조인

같은 두 릴레이션을 활용하여 데이터를 추출하는 기법

조인 쿼리문 및 결과

-- employees 테이블 생성
CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    emp_name VARCHAR(50),
    dept_id INT
);
-- departments 테이블 생성
CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    dept_name VARCHAR(50)
);
-- 데이터 삽입
INSERT INTO employees (emp_id, emp_name, dept_id) VALUES
(1, 'Alice', 1),
(2, 'Bob', 2),
(3, 'Charlie', 3),
(4, 'David', NULL);
INSERT INTO departments (dept_id, dept_name) VALUES
(1, 'HR'),
(2, 'Engineering'),
(3, 'Marketing'),
(4, 'Sales');

1. 크로스 조인

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

2. 세타 조인

SELECT e.emp_id, e.emp_name, d.dept_name
FROM employees e, departments d
WHERE e.dept_id = d.dept_id;

3. 내부 조인 = 동등(동일) 조인

SELECT * 
FROM employees
INNER JOIN departments
ON employees.dept_id = departments.dept_id;

4. 자연 조인

SELECT *
FROM employees
NATURAL JOIN departments;

5. 세미 조인

SELECT e.emp_id, e.emp_name
FROM employees e
WHERE EXISTS (SELECT 1 FROM departments d WHERE e.dept_id = d.dept_id);

6. 왼쪽 외부 조인

SELECT e.emp_id, e.emp_name, d.dept_name
FROM employees e
LEFT OUTER JOIN departments d
ON e.dept_id = d.dept_id;

7. 오른쪽 외부 조인

SELECT e.emp_id, e.emp_name, d.dept_name
FROM employees e
RIGHT OUTER JOIN departments d
ON e.dept_id = d.dept_id;

8. 완전 외부 조인

SELECT e.emp_id, e.emp_name, d.dept_name
FROM employees e
FULL OUTER JOIN departments d
ON e.dept_id = d.dept_id;

9. 셀프 조인

CREATE TABLE book
(
BookNumber INT,
BookName VARCHAR(10),
FSubjectBookNumber INT
);
INSERT INTO book
VALUES
(111, 'OS', 222),
(222, 'DataStructure', 555),
(555, 'ComputerStructure', NULL);

SELECT A.BookNumber, A.BookName, B.BookNumber, B.BookName
FROM book A JOIN book B
ON A.FSubjectBookNumber = B.BookNumber;

조인 정리

1. 크로스 조인 ⊃ 세타 조인 ⊃ 내부 조인 ⊃ 자연 조인 ⊃ 세미 조인

크로스 조인에 <, >, = 추가한게 세타 조인

세타 조인에 = 만 사용한게 내부(동등) 조인

내부(동등 )조인에 동일한 이름의 컬럼을 자동으로 매칭한게 자연조인

자연조인에 한쪽 테이블의 결과만 반환한게 세미조인

2. 외부 조인 ⊃ 내부 조인

외부 조인에서 조건을 만족하는 행만 반환한 게 내부 조인

3. 세타 조인과 외부 조인은 서로 포함 관계가 아님

세타 조인은 조건을 만족하는 행만 반환하는 조인

외부 조인은 조건을 만족하지 않는 행도 포함하여 반환하는 조인

4. 셀프 조인

테이블 하나를 2개처럼 두고 조인

다른 조인들과 서로 포함관계가 성립하지 않음

0개의 댓글