티스토리 뷰

카테고리 없음

[Database] SUBQUERIES

daze1002 2025. 5. 18. 22:02
반응형

🔍 MySQL SUBQUERIES 정리

주요 키워드: MySQL, SUBQUERY, 상관 서브쿼리, EXISTS, CTE, 파생 테이블


🧭 개요

SUBQUERY(서브쿼리)다른 쿼리 내에서 실행되는 쿼리입니다.
복잡한 조건, 계산, 필터링 등에 활용되며 SELECT, FROM, WHERE, HAVING 등 다양한 위치에서 사용할 수 있습니다.


1️⃣ SUBQUERY 활용 예시

📌 서브쿼리를 WHERE 절에 사용하는 경우

SELECT category_code
FROM tbl_menu
WHERE menu_name = '민트미역국';
-- '민트미역국'의 category_code를 반환
SELECT 
    menu_code,
    menu_name,
    menu_price,
    category_code,
    orderable_status
FROM tbl_menu
WHERE category_code = (
    SELECT category_code
    FROM tbl_menu
    WHERE menu_name = '민트미역국'
);
-- '민트미역국'과 같은 category_code를 가진 메뉴 전체를 조회

📌 파생 테이블 (FROM절에 사용)

SELECT
    COUNT(*) AS 'count'
FROM tbl_menu
GROUP BY category_code;
-- category_code별 메뉴 개수
SELECT MAX(count)
FROM (
    SELECT COUNT(*) AS 'count'
    FROM tbl_menu
    GROUP BY category_code
) AS countmenu;
-- 카테고리 중 메뉴가 가장 많은 개수를 가진 값을 출력

2️⃣ 상관 서브쿼리

  • 메인 쿼리의 각 행에 따라 서브쿼리가 다시 실행됨
SELECT
    AVG(menu_price)
FROM tbl_menu
WHERE category_code = 4;
-- category_code = 4의 평균 가격
SELECT 
    menu_code,
    menu_name,
    menu_price,
    category_code,
    orderable_status
FROM tbl_menu a
WHERE menu_price > (
    SELECT AVG(menu_price)
    FROM tbl_menu
    WHERE category_code = a.category_code
);
-- 각 카테고리의 평균 가격보다 높은 가격의 메뉴만 조회

3️⃣ EXISTS

  • 서브쿼리의 결과가 존재하면 TRUE를 반환
SELECT category_name
FROM tbl_category a
WHERE EXISTS (
    SELECT 1
    FROM tbl_menu b
    WHERE b.category_code = a.category_code
)
ORDER BY 1;
-- 메뉴가 존재하는 카테고리만 조회

4️⃣ CTE (Common Table Expression)

  • 일시적인 이름을 가진 결과 테이블
  • 파생 테이블보다 가독성과 재사용성이 뛰어남
WITH menucate AS (
    SELECT
        menu_name,
        category_name
    FROM tbl_menu a
    JOIN tbl_category b ON a.category_code = b.category_code
)
SELECT *
FROM menucate
ORDER BY menu_name;
-- 메뉴명과 카테고리명을 미리 정의된 CTE(menucate)로 깔끔하게 조회

🔍 요약

유형 설명
일반 SUBQUERY WHERE, SELECT, FROM 절에 사용
파생 테이블 FROM절에 정의된 하위 SELECT 결과에 별칭 부여
상관 서브쿼리 메인 쿼리의 각 행에 따라 실행됨
EXISTS 서브쿼리 결과의 존재 유무에 따라 필터링
CTE WITH절을 통해 선언, 가독성/재사용성이 뛰어남

📎 참고 자료