본문 바로가기

TIL

TIL 3/12 - 서브쿼리

서브쿼리

SUBQUERY, 쿼리문 안에 포함돼있는 또 다른 쿼리문

메인 쿼리를 위해 보조 역할 수행

실행 순서 서브쿼리 → 메인쿼리

일반 서브쿼리(중첩 서브쿼리)

단일행 서브쿼리

다중행 서브쿼리

상관 서브쿼리

스칼라 서브쿼리

인라인 뷰 (파생테이블)

서브쿼리는 반드시 소괄호로 묶어서 표기할 것

서브쿼리는 연산자 우측에 위치

서브쿼리 내 order by 절 미지원

단일행 서브쿼리

서브쿼리 결과값이 한 행일 경우

서브쿼리를 통한 일반 비교 연산자 사용 가능

, <, ≥, ≤, =, ≠, <>

SELECT
    menu_code
  , menu_name
  , menu_price
  , category_code
FROM    
    tbl_menu
WHERE
    (menu_price, category_code) = (SELECT menu_price
                       , category_code
                    FROM tbl_menu
                    WHERE menu_name = '생갈치쉐이크');

다중행 서브쿼리

서브쿼리의 결과값이 여러행일 경우

서브쿼리를 가지고 일반 비교연산자만을 통한 비교 불가

사용 가능 연산자

IN 여러 결과값 중 한개라도 일치하는 값이 있을 경우 참

ALL값1보다 크고 값2보다 크고(AND), .. 이면 참

SELECT
    menu_code
  , menu_name
  , menu_price
FROM
    tbl_menu
WHERE
    menu_price <= ALL (SELECT menu_price
                        FROM tbl_menu); -- 모든  값들보다 작거나 같아야함, 즉 최솟값

ANY 값1보다 크거나 값2보다 크거나(OR) … 일 경우 참

상관 서브쿼리

메인쿼리 값을 서브쿼리에서 사용

메인쿼리 테이블의 레코드에 따라 결과도 매번 달라짐

SELECT
    menu_name
  , menu_price
  , m.category_code
FROM
    tbl_menu m
WHERE
    menu_price = (SELECT MAX(menu_price)
                    FROM tbl_menu
                    WHERE category_code = m.category_code);

스칼라 서브쿼리

SELECT name
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);

실제 테이블에 근거한 논리적인 가상테이블

inline-view : from 절에 작성하는 서브쿼리로 임시 테이블처럼 활용, 1회용

SELECT
    MAX(메뉴개수)
FROM (SELECT
        category_code 카테고리
      , COUNT(*) 메뉴개수
      FROM
        tbl_menu
    GROUP BY
        category_code) menu_count;

stored-view : 서브쿼리 구문을 VIEW 객체로 생성해두고 사용 가능, 영구 사용 가능

WITH menu_count AS (
SELECT
        category_code 카테고리
      , COUNT(*) 메뉴개수
      FROM
        tbl_menu
    GROUP BY
        category_code
)

SELECT
    MAX(메뉴개수)
  , MIN(메뉴개수)
FROM
    menu_count;

'TIL' 카테고리의 다른 글

TIL 3/14 - 제약조건,No SQL, AWS EC2  (0) 2025.03.14
TIL 3/13 - DDL  (0) 2025.03.13
TIL 3/11 - 그룹함수, GROUPING, JOIN  (0) 2025.03.11
TIL 3/10 - DB(2) SELECT, 빌트인함수  (0) 2025.03.10
TIL 3/7 - DB  (0) 2025.03.07