개발지식 먹는 하마 님의 블로그

SQL 문법 - 서브쿼리, CTEs 본문

MySQL

SQL 문법 - 서브쿼리, CTEs

devhippo 2025. 1. 16. 17:39

[ 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