RDBS/MYSQL

[MySQL]WITH문을 사용하여 가상의 테이블을 만들어 사용하기

MoonSta 2023. 6. 25. 12:32

 SQL을 사용하여 대량의 데이터를 다루는 경우, 임의의 결과를 저장할 때마다 테이블에 저장할 수 없다. 그렇다고 해서 그때마다 테이블을 생성할 수도 없다. 이러한 이 유로 인해 임시 결과를 정의하고 사용하는 경우의 임시테이블을 만들어 해당 테이블에 값을 저장할 수 있다. 이번 포스팅은 임시 테이블을 만들고, 실제 자주 사용하는 구문인 WITH문에 대해 알아보도록 하겠습니다.

 


 

WITH문은 언제 사용할까?

 

 실제 실무에서는 동일한 SQL이 반복되어 사용되는 경우가 많다. 하지만 그때마다 동일한 쿼리를 실행하게 된다면, 프로그램 전체적으로 성능이 느려지는 문제가 발생한다. 이러한 상황에서 반복적인 사용을 가능하게 해주는 구문이 WITH 절입니다. 즉, 게임에서 사용하는 매크로와 마찬가지로 한번 지정해 주면 자동으로 반복하여 실행되도록 할 수 있습니다. 

 


 

WITH문의 기본 구조

WITH CTE AS 
(
    #반복시킬 쿼리
    SELECT 
)

위와 같이 실행시킬 쿼리를 WITH문으로 감싸 CTE라는 임시 테이블을 생성할 수 있다.

 


 

WITH문

 

우선 샘플로 사용할 데이터를 MEMBER 테이블에서 조회해 보겠습니다. 조회할 항목은 성별, 이름, 나이입니다.

SELECT gender
     , name
     , age
  FROM MEMEBER;
gender name age
MALE 문OO 14
FEMAIL 채OO 24
MALE 유OO 25
MALE 김OO 16
FEMALE 정OO 23

 

실제 쿼리에 조건을 부여하고, 그 결과를 임시 테이블에 저장해 보도록 하겠습니다. 

 

WITH ADULT AS 
(
    SELECT gender
         , name
         , age
      FROM MEMBER
     WHERE age > 19
)
SELECT gender
     , name
     , age
  FROM ADULT

 

gender name age
FEMAIL 채OO 24
MALE 유OO 25
FEMALE 정OO 23

 

MEMBER 테이블에서 age가 19보다 높은 데이터만을 추출하여 ADULT라는 새로운 임시테이블을 생성하였습니다.

 


 

다중 WITH문

 

WITH T1 AS (
SELECT '1' A FROM DUAL UNION ALL
SELECT '2' FROM DUAL
), T2 AS (
SELECT '3' A FROM DUAL UNION ALL
SELECT A FROM T1
)
 
SELECT * FROM T2

 

또한 위와 같은 방법으로 여러 개의 임시 테이블에 대한 생성도 가능합니다.  해당 내용은 직접 공부하면서 사용해 보시면 좋을 것 같습니다. 사실 이외에도 WITH문으로 할 수 있는 다양한 절이 존재합니다. 그중 가장 많이 사용하는 재귀형 계층 쿼리  WITH RECURSIVE 문에 대한 내용도 남겨놓도록 하겠습니다. 읽어주시면 감사하겠습니다. 

 

 

 

[MYSQL] 계층 쿼리 - WITH RECURSIVE 사용

MySQL에서 재귀쿼리를 사용해야한다면? WITH RECURSIVE문을 사용할 수 있다. WITH RECURSIVE 는 UNION ALL 과 함께 사용한다. ⚡️기본 형식 with recursive 테이블명(CTE) as ( select 초기값 as -- 최초 실행 union all sel

mooonstar.tistory.com