DB : MySQL | Oracle | MyBatis

MySQL 기본 (3) : 서브쿼리 / JOIN / UNION

기매_ 2022. 9. 27. 21:27

[ Lesson 1. 쿼리 안에 서브쿼리 ]

 

1. 비상관 서브쿼리

SELECT
  CategoryID, CategoryName, Description
FROM Categories
WHERE
  CategoryID IN
  (SELECT CategoryID FROM Products
  WHERE Price > 50);

 

~ ALL 서브쿼리의 모든 결과에 대해 ~하다
~ ANY 서브쿼리의 하나 이상의 결과에 대해 ~하다

 

2. 상관 서브쿼리

SELECT
  ProductID, ProductName,
  (
    SELECT CategoryName FROM Categories C
    WHERE C.CategoryID = P.CategoryID
  ) AS CategoryName
FROM Products P;

 

: 사실 Join 으로 가능

 

EXISTS / NOT EXISTS 연산자

SELECT
  CategoryID, CategoryName
  -- ,(SELECT MAX(P.Price) FROM Products P
  -- WHERE P.CategoryID = C.CategoryID
  -- ) AS MaxPrice
FROM Categories C
WHERE EXISTS (
  SELECT * FROM Products P
  WHERE P.CategoryID = C.CategoryID
  AND P.Price > 80
);

[ Lesson 2. JOIN - 여러 테이블 조립하기 ]

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

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

💡 SELF JOIN - 같은 테이블끼리

 

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

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

 

3. CROSS JOIN - 교차 조인

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

[ Lesson 3. UNION - 집합으로 다루기 ]

 

1. 합집합

UNION 중복을 제거한 집합
UNION ALL 중복을 제거하지 않은 집합 (중복 포함)
SELECT CustomerName AS Name, City, Country, 'CUSTOMER'
FROM Customers
UNION
SELECT SupplierName AS Name, City, Country, 'SUPPLIER'
FROM Suppliers
ORDER BY Name;

 

 

2. 교집합

SELECT CategoryID AS ID
FROM Categories C, Employees E
WHERE 
  C.CategoryID > 4
  AND E.EmployeeID % 2 = 0
  AND C.CategoryID = E.EmployeeID;


3. 차집합

SELECT CategoryID AS ID
FROM Categories
WHERE 
  CategoryID > 4
  AND CategoryID NOT IN (
    SELECT EmployeeID
    FROM Employees
    WHERE EmployeeID % 2 = 0
  );


4. 대칭차집합

SELECT ID FROM (
  SELECT CategoryID AS ID FROM Categories
  WHERE CategoryID > 4
  UNION ALL
  SELECT EmployeeID AS ID FROM Employees
  WHERE EmployeeID % 2 = 0
) AS Temp 
GROUP BY ID HAVING COUNT(*) = 1;