[SQL 레벨업] 18강 기능적 관점으로 구분하는 결합의 종류

2024. 1. 30. 22:38·BOOK/SQL 레벨업

 

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
'BOOK/SQL 레벨업' 카테고리의 다른 글
  • [SQL 레벨업] 20강. 결합이 느리다면
  • [SQL 레벨업] 19강 결합 알고리즘과 성능
  • [SQL 레벨업] 16강 SQL에서는 반복을 어떻게 표현할까?
  • [SQL 레벨업] 15강 반복계의 공포
gani+
gani+
꾸준히 기록할 수 있는 사람이 되자 !
  • gani+
    Gani_Dev :)
    gani+
  • 전체
    오늘
    어제
    • 분류 전체보기 (43)
      • 당장 프로젝트 (2)
        • 트러블슈팅 (0)
      • 댕댕어디가 프로젝트 (11)
        • 트러블슈팅 (3)
        • MSA (8)
      • 개발일지 (2)
      • BOOK (12)
        • SQL 레벨업 (10)
      • 프로젝트 (0)
      • ELK (5)
      • 알고리즘 (9)
      • CS (2)
        • 디자인패턴 (2)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    순차탐색
    SW마에스트로
    dfs
    완전탐색
    다익스트라
    정렬
    이것이코딩테스트다
    다이나믹프로그래밍
    4963
    이것이 코딩 테스트다
    소마
    후기
    최단경로
    14기
    플로이드워셔
    알고리즘
    섬의개수
    백준
    백준4963
    해쉬
    이진탐색
    4673
    DP
    9095
    SWMaestro14
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
gani+
[SQL 레벨업] 18강 기능적 관점으로 구분하는 결합의 종류
상단으로

티스토리툴바