서브쿼리
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 |