본문 바로가기

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

SELECT 더 깊이 파보기 > 쿼리 안에 서브쿼리

 

https://inf.run/JvXX

 

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

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

www.inflearn.com

 

1. 비상관 서브쿼리

원래 쿼리와 그 안의 서브쿼리가 독자적으로 실행된다.

 

 

-- 서브쿼리에서 추출한 값을 활용하여 추출
SELECT * FROM Products
WHERE Price < (
-- 이 쿼리에서 28.866364란 값을 추출할 수 있다.
  SELECT AVG(Price) FROM Products
);

 

-- 서브쿼리에서 추출한 값을 활용하여 추출
SELECT
  CategoryID, CategoryName, Description
FROM Categories
WHERE
-- 서브 쿼리를 통해 CategoryID가 1인 조건임을 추출할 수 있다.
  CategoryID =
  (SELECT CategoryID FROM Products
  WHERE ProductName = 'Chais');

 

-- 서브쿼리에서 추출한 값을 활용하여 추출
SELECT
  CategoryID, CategoryName, Description
FROM Categories
WHERE
  -- 하나 이상이 추출되기 때문에 IN을 사용
  CategoryID IN
  -- 서브쿼리에서 하나 이상의 값이 추출된다.
  (SELECT CategoryID FROM Products
  WHERE Price > 50);

 

 

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

 

 

-- 서브쿼리를 모두 만족하는 조건만 추출
SELECT * FROM Products
WHERE Price > ALL (
  SELECT Price FROM Products
  WHERE CategoryID = 2
);

-- 서브쿼리 중 하나 이상의 조건을 만족하면 추출
SELECT
  CategoryID, CategoryName, Description
FROM Categories
WHERE
  CategoryID = ANY
  (SELECT CategoryID FROM Products
  WHERE Price > 50);

 

 

 

2. 상관 서브쿼리

서브쿼리가 바깥쪽의 쿼리와 맞물려서 실행된다.

상관되는 테이블에 별명이 들어간다.

 

-- 아래 내용은 JOIN을 통해 더 쉽게 가능한 동작
-- Products 테이블에서 값을 가져오는데 그 하나하나마다 안의 서브쿼리가 돌아간다.
SELECT
  ProductID, ProductName,
  (
    SELECT CategoryName FROM Categories C
    -- 서브쿼리의 CategoryID와 바깥의 쿼리 CategoryID가 서로 맞물린다.
    WHERE C.CategoryID = P.CategoryID
  ) AS CategoryName
FROM Products P;

 

-- 각 Category마다 거기에 속한 제품들의 Maximum 값, Average 값을 추출한다.
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;

 

EXISTS / NOT EXISTS 연산자

-- EXISTS를 기준으로 값을 추출한다.
SELECT
  CategoryID, CategoryName
FROM Categories C
-- 80이 넘어가는 Product가 있는지 확인
WHERE EXISTS (
  SELECT * FROM Products P
  WHERE P.CategoryID = C.CategoryID
  AND P.Price > 80
);