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;
'프로그래밍 강의 메모 > 갖고노는 MySQL 데이터베이스 by 얄코' 카테고리의 다른 글
데이터 조작하기 > 데이터 변경, 삭제하기 (0) | 2022.05.04 |
---|---|
데이터 조작하기 > 테이블 만들고 데이터 입력하기 (0) | 2022.05.04 |
SELECT 더 깊이 파보기 > 쿼리 안에 서브쿼리 (0) | 2022.05.03 |
SELECT 기초 > 조건에 따라 그룹으로 묶기 (0) | 2022.05.01 |
SELECT 기초 > 시간/날짜 관련 및 기타 함수들 (0) | 2022.05.01 |