| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- MVMM
- 프로그래머스
- 파이썬
- 스터디윗미
- dangerouslySetInnerHTML
- til
- 조건문
- mysql
- GoogleCloudConsole
- Error Handling
- INSERT SELECT
- sql
- RESIGNAL
- 유데미코리아
- join
- Gemini
- 회고
- react
- 백준
- Google Cloud Skills Boost
- 자바
- Java
- 개념
- AI
- 자바의 정석
- 스레드
- javascript
- 유데미
- 알고리즘
- databse
- Today
- Total
휘적이는 기록공간
[SQL] Join의 종류 본문
Join이란
2개의 테이블에서 각각의 공통값을 이용함으로써 필드를 조합하는 수단이 된다.
데이터베이스는 객체가 1 : N의 관계를 가질 때, 정보의 중복을 제거하기 위해 정규화를 시킨다.
조인은 정규화 후 데이터를 조합해서 가져오는 기술이라 할 수 있습니다.


예문에서는 편의를 위해 전체 값을 가져오고 있습니다만
사실 * 연산자로 모든 컬럼을 불러오는 것은 DB에 무리가 가기 때문에 필요한 컬럼만 가져와야합니다.
조인은 크게 inner join과 outer join으로 나눌 수 있습니다.
Inner Join
내부 조인은 조인 구문을 충족하는 모든 결과를 찾기 위해 A테이블의 각 열을 B테이블의 각 열과 비교 합니다.
조인 구문이 충족되면 A, B 테이블에서 일치된 각 열의 컬럼 값은 결과 열로 결합됩니다.
SELECT *
FROM emplyee el INNER JOIN department dm
ON el.DepartmentID = dm.DepartmentID
;
| Employee.LastName | Employee.DepartmentID | Department.DepartmentName | Department.DepartmentID |
| Robinson | 34 | 사무부 | 34 |
| Jones | 33 | 기술부 | 33 |
| Smith | 34 | 사무부 | 34 |
| Seinberg | 33 | 기술부 | 33 |
| Rafferty | 31 | 영업부 | 31 |
Outer Join
Left (outer) Join
SELECT *
FROM employee el LEFT OUTER JOIN department dt
ON el.DepartmentID = dt.DepartmentID
;
| Employee.LastName | Employee.DepartmentID | Department.DepartmentName | epartment.DepartmentID |
| Jones | 33 | 기술부 | 33 |
| Rafferty | 31 | 영업부 | 31 |
| Steinberg | 33 | 기술부 | 33 |
| Robinson | 34 | 사무부 | 34 |
| Smith | 34 | 사무부 | 34 |
| John | null | null | null |
Left Join은 왼쪽 테이블을 기준으로 둔 후 outer join을 해줍니다.

Right (outer) Join
SELECT *
FROM employee el RIGHT OUTER JOIN department dt
ON el.DepartmentID = dt.DepartmentID
;
| Employee.LastName | Employee.DepartmentID | Department.DepartmentName | epartment.DepartmentID |
| Smith | 34 | 사무부 | 34 |
| Jones | 33 | 기술부 | 33 |
| Robinson | 34 | 사무부 | 34 |
| Steinberg | 33 | 기술부 | 33 |
| Rafferty | 31 | 영업부 | 31 |
| null | null | 마케팅 | 35 |
Right Join은 기능적으로 Left Join과 동일합니다. 중점이 되는 테이블이 오른쪽이냐 왼쪽이냐의 차이일 뿐입니다.
Full (outer) Join
SELECT *
FROM employee FULL OUTER JOIN department
ON employee.DepartmentID = department.DepartmentID
;
| Employee.LastName | Employee.DepartmentID | Department.DepartmentName | epartment.DepartmentID |
| Smith | 34 | 사무부 | 34 |
| Jones | 33 | 기술부 | 33 |
| Robinson | 34 | 사무부 | 34 |
| John | null | null | null |
| Steinberg | 33 | 기술부 | 33 |
| Rafferty | 31 | 영업부 | 31 |
| null | null | 마케팅 | 35 |
Full Join은 공통된 부분만 반환하는 Inner Join과 다르게 공통된 부분 + 공통되지 않은 부분 모두를 반환합니다.
일부 데이터베이스 시스템에서는 Full Join을 지원하지 않습니다. 이때 UNION을 사용해 비슷하게 구현할 수 있습니다.
SELECT *
FROM employee el LEFT OUTER JOIN department dt
ON el.DepartmentID = dt.DepartmentID
UNOIN
SELECT *
FROM employee el RIGHT OUTER JOIN department dt
ON el.DepartmentID = dt.DepartmentID
;
Cross Join
Cross Join절은 조인되는 두 테이블에서 곱집합을 반환합니다.
예를 들어 m행을 가진 테이블과 n행을 가진 테이블이 교차 조인되면 m*n개의 행을 생성합니다.
SELECT *
FROM employee CROSS JOIN department
;

Self Join
Self Join은 자기 자신을 조인 시키는 것입니다. Self Join은 동일한 테이블의 두 복사본을 결합한 것으로 볼 수 있습니다.
실제로 테이블은 복사되지 않지만 SQL은 마치 복사된 것처럼 명령을 수행합니다.
계층적 데이터를 추출하거나 동일한 테이블 내에서 행을 비교할 때 가장 유용합니다.

SELECT A.CustomerName AS CustomerName1, B.CustomerName AS CustomerName2, A.City
FROM Customers A, Customers B
WHERE A.CustomerID <> B.CustomerID
AND A.City = B.City
ORDER BY A.City
;
<>는 !=와 동일합니다
SQL Tryit Editor v1.6
WebSQL stores a Database locally, on the user's computer. Each user gets their own Database object. WebSQL is supported in Chrome, Safari, Opera, and Edge(79). If you use another browser you will still be able to use our Try SQL Editor, but a different ver
www.w3schools.com
출처
'Tech Notes & Growth > Learning Notes' 카테고리의 다른 글
| [JavaScript] nullish 병합 연산자 '??'(Nullish coalescing operator) (0) | 2022.07.25 |
|---|---|
| [Start With Udemy] Python 부트캠프: 100개의 프로젝트로 Python 개발 완전 정복 Day1 (1/2) (0) | 2022.05.09 |
| [Start With Udemy] Python 부트캠프: 100개의 프로젝트로 Python 개발 완전 정복 Start (0) | 2022.05.01 |
| (TIL) 2FA: 2-factor authentication (0) | 2022.04.27 |
| [Javascript] 클로저 (Closure) (0) | 2022.04.19 |