[DB, SQL] JOIN - 여러 테이블 조립하기

JUNHO YEOM·2022년 11월 8일
0

DB, SQL

목록 보기
6/21
post-thumbnail

JOIN(Inner Join) - 내부 조인

두 테이블을 JOIN하면 두 테이블을 연결하여 값을 가져올 수 있다.
JOIN을 하는 이유는 data의 중복을 막기 위해 우리가 테이블을 나누어 놨기 때문이다.

  • 양쪽 모두에 값이 있는 행(NOT NULL) 반환한다.
  • INNER은 생략할 수 있다.
SELECT * FROM Categories C 
JOIN Products P
 ON C.CategoryID = P.CategoryID
# Categories 테이블과 Products 테이블을 JOIN한다
# CategoryID를 키값으로 가진다.

ambiguous Error
양쪽 테이블에 같은 이름의 Column이 있는 경우에는
어떤 테이블의 data를 가져올 것인지 명시 해줘야 한다.

SELECT C.CategoryID, C.CategoryName, P.ProductName
FROM Categories C
JOIN Products P 
  ON C.CategoryID = P.CategoryID; 
# Categories 테이블과 Products 테이블을 JOIN한다
# Categories에서 CategoryID, CategoryName을 가져오고
# Products에서 ProductName을 가져온다.

2개 이상 테이블의 JOIN

SELECT 
  C.CategoryID, C.CategoryName, 
  P.ProductName, 
  O.OrderDate,
  D.Quantity
FROM Categories C
JOIN Products P 
  ON C.CategoryID = P.CategoryID
JOIN OrderDetails D
  ON P.ProductID = D.ProductID
JOIN Orders O
  ON O.OrderID = D.OrderID;
# Categories테이블에 Products, OrderDetails, Orders 테이블을 Join하였다.

JOIN한 테이블 GROUP하기

SELECT 
  C.CategoryName,
  MIN(O.OrderDate) AS FirstOrder,
  MAX(O.OrderDate) AS LastOrder,
  SUM(D.Quantity) AS TotalQuantity
FROM Categories C
JOIN Products P 
  ON C.CategoryID = P.CategoryID
JOIN OrderDetails D
  ON P.ProductID = D.ProductID
JOIN Orders O
  ON O.OrderID = D.OrderID
GROUP BY C.CategoryID;

SELF JOIN - 같은 테이블끼리 JOIN하기

SELECT
  E1.EmployeeID, CONCAT_WS(' ', E1.FirstName, E1.LastName) AS Employee,
  E2.EmployeeID, CONCAT_WS(' ', E2.FirstName, E2.LastName) AS NextEmployee
FROM Employees E1 JOIN Employees E2
ON E1.EmployeeID + 1 = E2.EmployeeID;
# 하나의 테이블인 Employees 테이블을 E1과 E2로 나누어 JOIN하였다.
# 해당 sql 구분을 통해서 다음에 올 값이 무엇인지 조회할 수 있다.

OUTER JOIN - 외부 조인

  • LEFT, RIGHT를 선택하여 한쪽의 데이터가 있다면 반대쪽 데이터가 없더라도 출력한다.
  • 선택한 방향의 Table의 행 수가 유지된다.
  • OUTER는 생략할 수 있다.
SELECT
  E1.EmployeeID, CONCAT_WS(' ', E1.FirstName, E1.LastName) AS Employee,
  E2.EmployeeID, CONCAT_WS(' ', E2.FirstName, E2.LastName) AS NextEmployee
FROM Employees E1
LEFT JOIN Employees E2
ON E1.EmployeeID + 1 = E2.EmployeeID
ORDER BY E1.EmployeeID;

CROSS JOIN - 교차 조인

  • 조건 없이 모든 조합이 반환된다(A*B)
SELECT
  E1.LastName, E2.FirstName
FROM Employees E1
CROSS JOIN Employees E2
ORDER BY E1.EmployeeID;
E1의 LastName과 E2의 FirstName의 모든 경우의 수가 조합된 data가 출력됨.

0개의 댓글