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
);
'프로그래밍 강의 메모 > 갖고노는 MySQL 데이터베이스 by 얄코' 카테고리의 다른 글
데이터 조작하기 > 테이블 만들고 데이터 입력하기 (0) | 2022.05.04 |
---|---|
SELECT 더 깊이 파보기 > JOIN - 여러 테이블 조립하기 (0) | 2022.05.04 |
SELECT 기초 > 조건에 따라 그룹으로 묶기 (0) | 2022.05.01 |
SELECT 기초 > 시간/날짜 관련 및 기타 함수들 (0) | 2022.05.01 |
SELECT 기초 > 숫자와 문자열을 다루는 함수들 (0) | 2022.05.01 |