[SQL, DB] 서브쿼리

JUNHO YEOM·2022년 11월 7일
0

DB, SQL

목록 보기
5/21
post-thumbnail

1. 비상관 서브쿼리

SELECT
  CategoryID, CategoryName, Description,
  (SELECT ProductName FROM Products WHERE ProductID = 1) # 추가 괄호
FROM Categories;
SELECT * FROM Products
WHERE Price < (SELECT AVG(Price) # Price가 평균보다 작을 경우만 조회
FROM Products
SELECT
  CategoryID, CategoryName, Description
FROM Categories
WHERE
  CategoryID =
  (SELECT CategoryID FROM Products 
  WHERE ProductName = 'Chais');
  # CategoryID가 'Chais' 값을 가지는 CategoryID를 조건으로 함

ALL, ANY

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

SELECT * FROM Products
WHERE Price > ALL (
  SELECT Price FROM Products
  WHERE CategoryID = 2
);
# CategoryID가 2이며, 조회한 Price의 모든 값보다 더 큰 값을 조회한다.
# CategoryID=2 이고, MAX(Price)인 값
SELECT
  CategoryID, CategoryName, Description
FROM Categories
WHERE
  CategoryID = ANY
  (SELECT CategoryID FROM Products
  WHERE Price > 50);
# price가 50미만인 값과 동일한 값이 있을 경우 출력

상관서브 쿼리

SELECT
  ProductID, ProductName,
  (
    SELECT CategoryName FROM Categories C
    WHERE C.CategoryID = P.CategoryID
  ) AS CategoryName
  # P.CategoryID와 C.CategoryID가 같은 경우 CategoryName을 출력
FROM Products P;
SELECT
  CategoryID, CategoryName,
  (
    SELECT MAX(Price) FROM Products P
    WHERE P.CategoryID = C.CategoryID
  ) AS MaximumPrice,
  # CategoryID가 같은(같은 종류의) 물건중 가장 가격이 비싼것
  (
    SELECT AVG(Price) FROM Products P
    WHERE P.CategoryID = C.CategoryID
  ) AS AveragePrice
    # CategoryID가 같은(같은 종류의) 물건으로 평균 가격을 구한다
FROM Categories C;

EXIST, NOT EXIST

SELECT
  CategoryID, CategoryName
  ,(SELECT MAX(P.Price) FROM Products P
  WHERE P.CategoryID = C.CategoryID
  ) AS MaxPrice
# CategoryID가 서로 같은 data중 Products에서 가장 큰 가격
FROM Categories C
WHERE EXISTS (
  SELECT * FROM Products P
  WHERE P.CategoryID = C.CategoryID
  AND P.Price > 80
);
#  CategoryID가 같은 data중 80이 넘어가는 data가 존재 하는지

0개의 댓글