프로그래밍 언어/SQL

SQL 함수 간단 실습 :: 서브쿼리 (비상관 커리, 상관 커리)

gamjadori 2024. 1. 26. 11:13
728x90

<서브 쿼리>

  • 쿼리 안에 쿼리 작성
  • SELECT *, (SELECT * FROM...) FROM... WHERE ... (SELECT * FROM...)
  1. 비상관 서브커리: 연계되지 않고 독립적으로 반환되는 서브쿼리
SELECT categoryid, categoryname, DESCRIPTION,
    (SELECT productname FROM products WHERE `ProductID` = 1)
FROM categories;
>>categories의 categoryid, categoryname, DESCRIPTION를 출력하고,
products의 ProductID가 1인 경우, productname를 출력해라.

<결과>

SELECT * FROM products
WHERE price < (SELECT AVG(`Price`) FROM products)
ORDER BY `Price` DESC;
>> products에서 products의 Price의 평균이 price보다 큰 경우
Price를 내림차순해서 출력하시오.

<결과>

SELECT categoryid, categoryname, DESCRIPTION
FROM categories
WHERE `CategoryID` IN (SELECT `CategoryID` FROM products WHERE `Price` > 50);
>> categories에서 products의 Price가 50보다 큰 항목 중 CategoryID가 있으면
categoryid, categoryname, DESCRIPTION를 출력해라.

<결과>

<ALL / ANY>

  • ALL: 서브쿼리의 모든 결과에 대해서
  • ANY: 서브쿼리의 하나 이상의 결과에 대해서
SELECT * FROM products
WHERE `Price` > ALL (SELECT `Price` FROM products WHERE `CategoryID` = 2);
>> products의 CategoryID가 2인 항목의 Price를 출력한 모든 결과가
Price보다 작은 것 중, products의 모든 항목을 출력해라.

<결과>

SELECT categoryid, categoryname, DESCRIPTION
FROM categories
WHERE `CategoryID` = ANY (SELECT `CategoryID` FROM products WHERE `Price` > 50);
>> products의 Price가 50보다 큰 항목의 CategoryID를 출력한 모든 결과 중
하나라도 CategoryID와 같으면
categories의 categoryid, categoryname, DESCRIPTION를 출력해라

<결과>

2. 상관 서브커리: 부모 명령과 자식인 서브쿼리가 특정 관계를 맺는 것

SELECT
    productid, productname,
    (SELECT categoryname FROM categories C WHERE C.`CategoryID` = P.`CategoryID`)
FROM products P
WHERE `Price` > 100;

P=products
C=categories

>>products에서 Price가 100보다 큰 항목 중 productid, productname,
categoryname와 categories의 CategoryID가 같은 경우를 출력하라.

<결과>

SELECT
    categoryid, categoryname,
    -- 해당 카테고리에서 가장 비싼 상품의 가격,
    (SELECT MAX(price) FROM products P WHERE P.`CategoryID` = C.categoryid) AS MaximumPrice,
    -- 해당 카테고리의 평균 상품 가격
    (SELECT AVG(price) FROM products P WHERE P.`CategoryID` = C.categoryid) AS AveragePrice
FROM categories C;

P=products
C=categories

>> categories의 categoryid, categoryname와
products의 P의CategoryID와 C의 categoryid가 같은 항목 중 가장 높은 가격을 MaximumPrice로,
products의 P의CategoryID와 C의 categoryid가 같은 항목 중 가격의 평균을 AveragePrice로 출력하시오.

<결과>