본문 바로가기

프로그래밍 강의 메모/갖고노는 MySQL 데이터베이스 by 얄코

SELECT 더 깊이 파보기 > JOIN - 여러 테이블 조립하기

https://inf.run/JvXX

 

갖고노는 MySQL 데이터베이스 by 얄코 - 인프런 | 강의

비전공자도 이해할 수 있는 MySQL! 빠른 설명으로 필수개념만 훑은 뒤 사이트의 예제들과 함께 MySQL을 ‘갖고 놀면서’ 손으로 익힐 수 있도록 만든 강좌입니다., - 강의 소개 | 인프런...

www.inflearn.com

 

1. JOIN(INNER JOIN) - 내부 조인

양쪽 모두에 값이 있는 행(NOT NULL) 반환
'INNER '는 선택사항

 

-- Categories와 Products 테이블에서 CategoryID를 기준으로 같은 것끼리 묶어준다.
-- 묶은 것에서 C.CategoryID, C.CategoryName, P.ProductName만 추출
SELECT C.CategoryID, C.CategoryName, P.ProductName
FROM Categories C
JOIN Products P 
  ON C.CategoryID = P.CategoryID; 

-- ambiguous 주의!
-- C.CategoryID에서 별명 C를 빼고 작성하면 CategoryID는 Categories와 Products 테이블 모두 존재하여 
-- ambiguous 에러 발생

 

 

여러 테이블을 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;

 

 

JOIN한 테이블 GROUP하기

SELECT 
  C.CategoryName, P.ProductName,
  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, P.ProductID;

 

 

SELF 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;

-- 1번의 전, 마지막 번호의 다음은?
-- 존재하지 않기에 가져오지 않는다. INNER JOIN의 특징
-- 한 쪽이 없어도 다른 쪽을 가져오려고 할 때는 LEFT/RIGHT OUTER JOIN을 사용한다.

 

 

 

2. LEFT/RIGHT OUTER JOIN - 외부 조인

반대쪽에 데이터가 있든 없든(NULL), 선택된 방향에 있으면 출력 - 행 수 결정

'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;

 

 

 

3. CROSS JOIN - 교차 조인

조건 없이 모든 조합 반환(A * B)

 

-- 조건 없이 모든 조합을 반환하여 9*9인 81행이 추출
SELECT
  E1.LastName, E2.FirstName
FROM Employees E1
CROSS JOIN Employees E2
ORDER BY E1.EmployeeID;