18강 | 기능적 관점으로 구분하는 결합의 종류
17강은 5장의 내용을 정리한 부분이라, 스킵했습니다.
정리
Employees 테이블
Department 테이블
테이블 생성
-- Employees 테이블 생성
CREATE TABLE Employees (
emp_id INT PRIMARY KEY,
emp_name VARCHAR(50),
dept_id INT,
FOREIGN KEY (dept_id) REFERENCES Department(dept_id)
);
-- Department 테이블 생성
CREATE TABLE Department (
dept_id INT PRIMARY KEY,
dept_name VARCHAR(50)
);
-- Employees 테이블에 데이터 추가
INSERT INTO Employees (emp_id, emp_name, dept_id) VALUES
(1, '하린', 10),
(2, '한미루', 11),
(3, '사라', 11),
(4, '중민', 12),
(5, '웅식', 12),
(6, '주아', 12);
-- Department 테이블에 데이터 추가
INSERT INTO Department (dept_id, dept_name) VALUES
(10, '총무'),
(11, '인사'),
(12, '개발'),
(13, '영업');
크로스 결합
- 2개의 테이블의 레코드에서 가능한 모든 조합을 구하는 연산
- 비용이 매우 많이 들며, 필요한 경우가 거의 없어 실무에 자주 사용되지 않는다.
- 실수로 결합 조건을 적지 않으면 크로스 결합이 사용됨
SELECT * FROM Employees CROSS JOIN Department;
// employees 레코드가 6개, Departments 레코드가 4개 있다면 크로스 결과는 24개 레코드가 나온다.
내부 결합
SELECT * FROM Employees E INNER JOIN Department D ON E.dept_id = D.dept_id;
- 상관 서브쿼리를 사용해 대체 가능하다
- 그러나 상관 서브쿼리를 스칼라 서브쿼리로 사용하면 결과 레코드 수만큼 상관 서브쿼리를 실행해 비용이 높아지기 때문에 결합을 사용하는 것이 더 좋다.
SELECT E.emp_id,E.emp_name , E.dept_id,
(SELECT D.dept_name FROM Department D WHERE E.dept_id = D.dept_id) AS dept_name
FROM Employees E ;
외부 결합
외부 결합 종류
- 왼쪽 외부 결합
- 오른쪽 외부 결합
- 완전 외부 결합
왼쪽 외부 결합
- 왼쪽 테이블을 기준으로 결합한다
- 왼쪽 테이블인 Department 테이블이 기준이므로,dept_id가 13인 레코드는 emp_id,emp_name이 null이다.
SELECT E.emp_id,E.emp_name,E.dept_id,D.dept_name
FROM Department D LEFT OUTER JOIN Employees E
ON D.dept_id = E.dept_id;
오른쪽 외부 결합
- 오른쪽 테이블을 기준으로 결합한다
- 위의 결과와 같이 오른쪽 테이블인 Department 테이블을 기준으로 한다.
SELECT E.emp_id,E.emp_name,E.dept_id,D.dept_name
FROM Employees E Right OUTER JOIN Department D
ON D.dept_id = E.dept_id;
완전 외부 결합
- 완전 외부 결합은 Mysql에서 지원하지 않는다.
- 하지만 왼쪽 외부 결합과 오른쪽 외부 결합을 UNION 하면 완전 외부 결합과 같은 값을 얻을 수 있다.
SELECT E.emp_id,E.emp_name,E.dept_id,D.dept_name
FROM Employees E LEFT OUTER JOIN Department D
ON D.dept_id = E.dept_id
UNION
SELECT E.emp_id,E.emp_name,E.dept_id,D.dept_name
FROM Employees E RIGHT OUTER JOIN Department D
ON D.dept_id = E.dept_id;
'BOOK > SQL 레벨업' 카테고리의 다른 글
[SQL 레벨업] 20강. 결합이 느리다면 (0) | 2024.02.06 |
---|---|
[SQL 레벨업] 19강 결합 알고리즘과 성능 (1) | 2024.02.05 |
[SQL 레벨업] 16강 SQL에서는 반복을 어떻게 표현할까? (1) | 2024.01.27 |
[SQL 레벨업] 15강 반복계의 공포 (1) | 2024.01.25 |
[SQL 레벨업] 13강 자르기 (1) | 2024.01.23 |