SJ_Koding

SQLD 대비 (9) - JOIN 본문

SQL/SQLD

SQLD 대비 (9) - JOIN

성지코딩 2023. 11. 16. 22:13
SELECT *
FROM Employees
CROSS JOIN Departments;

SELECT *
FROM Employees, Departments;​
 

SQLD 대비 (8) - SQL 문법 및 라이브러리_3

SQLD 대비 (7) - SQL 문법 및 라이브러리_2 SQLD 대비 (6) - SQL 문법 및 라이브러리_1 SQLD 대비 (5) - 관계형 데이터베이스 (RDBMS) 과목 II 시작 ! 노랭이 책으로 과목 I을 모두 풀고 오답정리까지 마무리했다

sjkoding.tistory.com

시험이 코앞으로 다가왔다. 노랭이책 2-1까지 2회독을 진행했다. 이 블로그에 정리해둔 개념은 전반적인 틀을 잡기 위함이며 절대 이 내용으로만 합격할 수 없음을 깨달았다. 노랭이책이 짱이다.

이전 글과 이어지는 글입니다. 해당 정리글은 아래의 유튜브 영상을 참고하여 만들었습니다. 문제 시 삭제하겠습니다.
빨간색 형광펜은 강의에서 강조한 부분, 노란색 형광펜은 추가 서치로 내용을 '직접' 보강한 부분입니다.

Join이란?

  • 두 개 이상의 테이블을 결합하여 데이터를 출력하는 명령어
  • 관계형 데이터베이스의 핵심적인 기능
  • PF와 FK의 값을 기반으로 join이 성립됨
  • 조인은 여러 테이블을 하나의 테이블로 만드는 과정
INNER JOIN 동일한 데이터의 값을 기준으로 실행되는 JOIN
NATURAL JOIN 양 테이블 간 동일한 컬럼명을 가지고 자동으로 매칭되는 INNER JOIN
CROSS JOIN JOIN하는 테이블간 조인 조건이 없을 때 실행되는 JOIN
OUTER JOIN INNER JOIN과 같은 상태에서 기준이 되는 테이블은 다른 쪽에 같은 값이 없어도 실행되어 출력되는 JOIN

 

CROSS JOIN

  • 두 개의 테이블 간의 매칭되는 모든 데이터 조합을 출력
  • 카티션곱 (CARTESIAN PRODUCT)과 동의어
  • JOIN 조건을 따로 정의하지 않는다.
SELECT *
FROM major, professional

SELECT *
FROM major CROSS JOIN professor

INNER JOIN

  • 두 개의 테이블 간에 매칭되는 모든 데이터 조합 중 특정 컬럼끼리 값이 같은 것만 출력.
  • 가장 보편적인 JOIN 방법
  • INNER는 생략 가능
SELECT *
FROM major m INNER JOIN professor p
ON m.major_id = p.bl_major_id

NATURAL JOIN

  • 두 테이블 간에 동일한 이름을 갖는 모든 컬럼들에 대해 자동으로 EQUI JOIN을 실행한다.
  • WHERE 절에서 JOIN 조건을 사용하거나, ON절 또는 USING절을 사용할 수 없다.
SELECT *
FROM major m NATURAL JOIN professor p

OUTER JOIN

  • INNER JOIN과 다르게 기준이 되는 한쪽은 매칭되는 값이 없어도 출력 된다.
  • 동일한 값이 없다면 한쪽은 NULL이 출력 된다.
CREATE TABLE major_outer AS SELECT * FROM major WHERE MAJOR_PRFS_CNT > 6

SELECT *
FROM professor p LEFT OUTER JOIN major_outer m
ON m.major_id = p.bl_major_id

SELECT *
FROM professor p, major_outer m
WHERE m.major_id = p.bl_major_id

 

GPT 예시

 

Employees 테이블 예시:

EmployeeID Name DepartmentID
1 Alice 101
2 Bob 102
3 Charlie 103

Departments 테이블 예시:

DepartmentID DepartmentName
101 Human Resources
102 Finance
104 IT

이제 각 조인 타입에 따른 결과를 살펴보겠습니다.

INNER JOIN 

SELECT Employees.Name, Departments.DepartmentName
FROM Employees
INNER JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID;
NAME DepartmentName
Alice Human Resources
Bob Finance

CROSS JOIN

SELECT *
FROM Employees
CROSS JOIN Departments;

SELECT *
FROM Employees, Departments;

 

  • 결과:

    Employee ID Name DepartmentID DepartmentName
    1 Alice 101 Human Resources
    1 Alice 101 Finance
    1 Alice 101 IT
    2 Bob 102 Human Resources
    2 Bob 102 Finance
    2 Bob 102 IT
    3 Charlie 103 Human Resources
    3 Charlie 103 Finance
    3 Charlie 103 IT

NATURAL JOIN 

SELECT *
FROM Employees
NATURAL JOIN Departments;

결과:

Department ID Name Department Name
101 Alice Human Resources
102 Bob Finance

OUTER JOIN 

LEFT OUTER JOIN 

SELECT Employees.Name, Departments.DepartmentName
FROM Employees
LEFT JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID;

-- ORACLE LEFT OUTER JOIN
SELECT *
FROM Employees, Departments
WHERE Employees.DepartmentID = Departments.DepartmentID(+);
Name Department Name
Alice Human Resources
Bob Finance
Charlie NULL

RIGHT OUTER JOIN 

SELECT Employees.Name, Departments.DepartmentName
FROM Employees
RIGHT JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID;

-- ORACLE RIGHT OUTER JOIN
SELECT *
FROM Employees, Departments
WHERE Employees.DepartmentID(+) = Departments.DepartmentID;
Name Department Name
Alice Human Resources
Bob Finance
NULL IT

FULL OUTER JOIN 예시 결과:

SELECT Employees.Name, Departments.DepartmentName
FROM Employees
FULL OUTER JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID;
Name Department Name
Alice Human Resources
Bob Finance
Charlie NULL
NULL IT

 

ON절

  • ON절은 동일하지 않은 이름을 가진 컬럼끼리도 JOIN조건에 사용가능하도록 한다.
  • 물론, 동일한 이름도 가능하다.
  • WHERE절과 혼용하여 사용도 가능하다.
-- 예시
SELECT Employees.Name, Departments.DepartmentName
FROM Employees
JOIN Departments ON Employees.EmpDeptID = Departments.DeptID;

USING절

  • USING절에 두 테이블에 존재하는 공통된 컬럼명을 사용
  • 데이터 유형도 동일해야한다.

 

데이터 증가

  • 조인을 잘못하면 데이터가 많아진다.
  • 중복된 데이터가 있을 때 JOIN은 신중하게 해야 한다.
SELECT Employees.Name, Departments.DepartmentName
FROM Employees
JOIN Departments USING (DepartmentID);