개발지식 먹는 하마 님의 블로그
SQL 문법 - 서브쿼리, CTEs 본문
[ Sub-Query ]
메인 SQL 문 안에 포함된 또 다른 하위 SQL 문이다.
서브쿼리가 먼저 실행되고 그 결과를 메인쿼리가 사용한다.
< 사용 목적 >
- 데이터 필터링 : ex) 동적으로 조건값을 생성할 때
- 복잡한 집계
- JOIN : ex) 다중 테이블 간의 데이터를 비교할 때
< 주의 사항 >
- MySQL은 서브쿼리 내에서 LIMIT를 사용할 수 없다.
- LIMIT를 사용하기 위해서는 임시 테이블 생성해서 해결해야 한다.
- 상황에 따라 JOIN이 더 효율적일 때도 있다.
< 사용 위치 >
- SELECT
- FROM
- WHERE
더보기
메인 쿼리의 WHERE 절에 사용한 서브 쿼리가
여러 행의 결과값을 반환하는 경우
<다중 행 비교 연산자>
IN : WHERE 절 IN과 같은 역할, 서브쿼리 결과에 존재하는 값들 중 동일한 값이 있는가
ALL : 서브쿼리 결과에 존재하는 모든 값을 만족하는 조건인가
ex) '>'를 사용했다면, 서브쿼리 결과의 최댓값보다 큰 건이 조건을 만족한다.
ANY : 서브쿼리 결과에 존재하는 값들 중 하나라도 조건을 만족하는가
ex) '>'를 사용했다면, 서브쿼리 결과의 최솟값보다 큰 건이 조건을 만족한다.
EXISTS : 서브쿼리 결과를 만족하는 값이 존재하는 지의 여부를 확인한다.
1건만 찾으면 더이상 검색하지 않는다.
- HAVING
- ORDER BY
[ CTEs, 공통 테이블 표현식 ]
- 쿼리를 통해 만들어낸 일회성 테이블이다.
- 하나의 쿼리문이 끝날 때까지만 지속된다.
- 생성 권한이 필요 없다.
< 장점 >
- 복잡한 쿼리문의 가독성을 높인다.
- 서브쿼리의 중복을 방지한다.
< 구조 >
-- CTEs 구조
WITH 테이블명 AS (
SELECT…
)
-- CTE 예시 (GitLab)
WITH important_list AS (
SELECT DISTINCT
specific_column
FROM other_table
WHERE specific_column != 'foo'
)
SELECT
primary_table.column_1,
primary_table.column_2
FROM primary_table
INNER JOIN important_list
ON primary_table.column_3 = important_list.specific_column
[ 참고자료 ]
https://heleownae.tistory.com/42#3%EF%B8%8F%E2%83%A3%20%EC%9E%AC%EA%B7%80%EC%A0%81%20CTE-1
'MySQL' 카테고리의 다른 글
SQL - 윈도우 함수 (0) | 2025.01.19 |
---|---|
SQL - 피벗 테이블 (0) | 2025.01.17 |
SQL 문법 - 조인 (0) | 2025.01.16 |
SQL 문법 - 조건 (0) | 2025.01.15 |
SQL 문법 - 문자열 (0) | 2025.01.15 |