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 |