category : 데이터베이스

[Post] JOIN

writer : @blackcat date : 2024. 2. 20. 15:32

JOIN 쿼리는 두 개 이상의 테이블에서 행을 결합할때 사용되는 명령어다.

주로 사용되는 명령어는 INNER, LEFT, FULL 등이 있다.

 

Emlployees 테이블

ID   | Name       | Dept_ID
-----|------------|--------
1    | Kim        | 10
2    | Lee        | 20
3    | Park       | 30
4    | Choi       | NULL

 

Departments 테이블
Dept_ID | Dept_Name
--------|-----------
10      | Sales
20      | Marketing
30      | IT
40      | HR

 


INNER JOIN

 

두 테이블이 있을때 INNER JOIN은 두 테이블의 일치하는 행만 반환한다.

* JOIN경우에는 SELECT * 을하면 JOIN된 테이블의 모든 컬럼까지 다 나온다. 

* ON 뒤에 테이블.컬럼의 순서는 어느것을 먼저 써도 상관없다. 

<예시 작성 쿼리문>
SELECT * FROM Employees INNER JOIN Departments ON Employees.Dept_ID = Departments.Dept_ID;

 

<결과>
ID  | Name  | Dept_ID | Dept_ID | Dept_Name
----|-------|---------|---------|-----------
1   | Kim   | 10      | 10      | Sales
2   | Lee   | 20      | 20      | Marketing
3   | Park  | 30      | 30      | IT
NULL| NULL  | NULL    | 40      | HR

* Dept_ID의 값이 동일했기에 같은 행으로 출력이 된다.

 

 


LEFT JOIN( or LEFT OUTER JOIN)

첫번째 테이블의 모든행과 두번째 테이블의 일치하는 행을 반환하며, 일치하는 않는 행일경우 NULL값을 반환한다.

<예시 쿼리문>
SELECT * FROM Employees LEFT JOIN Departments ON Employees.Dept_ID = Departments.Dept_ID;

 

<결과>
ID | Name | Dept_ID | Dept_ID | Dept_Name
---|------|---------|---------|-----------
1  | Kim  | 10      | 10      | Sales
2  | Lee  | 20      | 20      | Marketing
3  | Park | 30      | 30      | IT
4  | Choi | NULL    | NULL    | NULL

 

 


RIGHT JOIN( or RIGHT OUTER JOIN)

두번째 테이블의 모든 행과 첫번째 테이블에서 일치하는 행을 반환하며, 일치하는 않는 행일경우 NULL값을 반환한다.

*LEFT JOIN과 큰 차이는 없어 일반적으로 LEFT JOIN을 많이쓰긴 한다고 한다..

<예시 쿼리문>
SELECT * FROM Employees RIGHT JOIN Departments ON Employees.Dept_ID = Departments.Dept_ID;
<결과>
ID  | Name  | Dept_ID | Dept_ID | Dept_Name
----|-------|---------|---------|-----------
1   | Kim   | 10      | 10      | Sales
2   | Lee   | 20      | 20      | Marketing
3   | Park  | 30      | 30      | IT
NULL| NULL  | NULL    | 40      | HR

*LEFT JOIN과 다르게 RIGHT JOIN을 썼기에, 두번째 테이블인 Departments의 기준으로 값이 출력된다.

 

 

 


FULL JOIN( or FULL OUTER JOIN)

두 테이블의 모든 행을 반환한다. 일치하는 행이 없는 경우 NULL로 표시된다.

출력을 두 테이블의 모든 행을 출력한다고 생각해야한다. 

<예시 쿼리문>
SELECT * FROM Employees FULL JOIN Departments ON Employees.Dept_ID = Departments.Dept_ID;
<결과>
ID  | Name | Dept_ID | Dept_ID | Dept_Name
----|------|---------|---------|-----------
1   | Kim  | 10      | 10      | Sales
2   | Lee  | 20      | 20      | Marketing
3   | Park | 30      | 30      | IT
4   | Choi | NULL    | NULL    | NULL
NULL| NULL | NULL    | 40      | HR

CROSS JOIN

두 테이블의 모든 행을 결합하는것이 크로스 조인이다.

크로스 조인은 FROM 뒤에 나오는 테이블의 행을 기준으로 크로스조인의 모든 행을 하나씩 대입해서 출력한다.

<예시 쿼리문>
SELECT * FROM Employees CROSS JOIN Departments;

 

<결과>
ID | Name | Dept_ID | Dept_ID | Dept_Name
---|------|---------|---------|-----------
1  | Kim  | 10      | 10      | Sales
1  | Kim  | 10      | 20      | Marketing
1  | Kim  | 10      | 30      | IT
1  | Kim  | 10      | 40      | HR
2  | Lee  | 20      | 10      | Sales
2  | Lee  | 20      | 20      | Marketing
2  | Lee  | 20      | 30      | IT
2  | Lee  | 20      | 40      | HR
3  | Park | 30      | 10      | Sales
3  | Park | 30      | 20      | Marketing
3  | Park | 30      | 30      | IT
3  | Park | 30      | 40      | HR
4  | Choi | NULL    | 10      | Sales
4  | Choi | NULL    | 20      | Marketing
4  | Choi | NULL    | 30      | IT
4  | Choi | NULL    | 40      | HR

SELF JOIN

SELF JOIN은 자기 자신과 JOIN되는 것을 말한다. 하나의 테이블을 두개처럼 사용해 조하는 것이다.

Employees TABLE
ID ㅣ	NAME   ㅣ   MANAGER_ID
---ㅣ-----------ㅣ--------------
1  ㅣ  Kim      ㅣ       3
2  ㅣ  Lee      ㅣ       3
3  ㅣ  Park     ㅣ      Null
4  ㅣ  Choi     ㅣ       1
<예시 쿼리문>
SELECT e1.NAME as EMPLOYEE, e2.NAME as MANAGER 
FROM Employees e1 
JOIN Employees e2 ON e1.MANAGER_ID = e2.ID

*JOIN ---  ON --- 이 JOIN문의 특징이다.

 

테이블의 있는 직원을 차례로 조사한다. 데이터가 쌓여있는 순부터다.

먼저, ID 1의 KIM의 매니저 이름부터 찾아야하는데, 그 기준은 KIM의 매니저의 ID가 직원 테이블의 ID값과 일치하는 경우이다. 데이터베이스에 쌓여있는 ID 1부터 차순적으로 찾아 나갈거다.

매니저 조건이 쿼리문에서 e1.MANAGER_ID = e2.ID 라고 되어있다.

e1.MANAGER_ID(매니저의 아이디=ID)와 동일한 e2.ID(ID)와 일치하는 것을 있다면, 그 사람이 KIM의 매니저다.

<결과>
EMPLOYEE ㅣ  MANAGER
---------ㅣ----------
  Kim    ㅣ   Park
  Lee    ㅣ   Park
  Choi   ㅣ   Kim

 

 

'데이터베이스' 카테고리의 다른 글

서브쿼리(Subquery), 스칼라 서브쿼리  (0) 2024.02.16
AS, HAVING 절  (0) 2024.02.16
group by  (0) 2024.02.16
RDBMS QUERY  (0) 2024.02.16
Database 설계 및 모델  (0) 2024.02.16