DB/SQL

[SQL] WITH절 정리

h_sseul 2023. 6. 8. 15:31

 

WITH절에 대해 찾아보던 중, 쿼리에서 'WHERE 1 = 1' 부분을 보고 궁금해서 찾아낸 결과들

 

 

[MSSQL] WHERE 1=1이 뭐야? 왜 쓰는 거야?

회사에 입사하고 쿼리를 사용하면서 종종 보지만, 잘 이해가 가지 않는 구문이 생겼어요. WHERE 1=1 바로 요놈! 오늘 공부해보도록 할게요. Chapter 1. WHERE 1=1이 뭐야?? 우선, WHERE는 조회하려는 데이터

hyjykelly.tistory.com

 

[MYSQL] WHERE 1=1 사용하는 이유?? 주의사항으로는??

안녕하세요, 오늘은 MYSQL 질의문에서 WHERE 1=1을 사용하는 이유에 대해서 알아보도록 하겠습니다. 다른 개발자가 개발한 프로젝트를 유지 보수하거나, 처음 개발자로 입문하여 선임들이 작성한

ssd0908.tistory.com

 

-- 쿼리 실행 시, test 테이블 전체 데이터를 select 하는 것과 동일한 결과. 
select *
from test
where 1 = 1 -- where 절 true

 


 

WITH절

이름을 가진 서브쿼리를 정의한 후 사용하는 구문으로, 쿼리의 전체적인 가독성을 높이고, 재사용 할 수 있게 함으로써 쿼리 성능을 높일 수 있다는 장점이 있다.

 

- 오라클 옵티마이저는 WITH절을 사용한 쿼리를 인라인 뷰나 임시 테이블로 여긴다.

계층형 쿼리를 구현할 수 있다. -> WITH 순환절

 

- VIEW와 WITH절의 공통점 : '임시 테이블을 만든다는 관점' 에서 쓰임새가 비슷

- 차이점

  • VIEW : 한 번 만들어놓으면 DROP 할 때까지 없어지지 않음
  • WITH절 : 한 번 실행 할 쿼리문 내에 정의되어 있을 경우, 그 쿼리문 안에서만 실행됨

WITH절 사용 이유

쿼리를 작성하다보면 같은 쿼리 구문을 반복해서 작성하거나, 서브쿼리를 사용하는 경우가 많다. 1~2번 반복은 괜찮지만 그 수가 많아질수록 가독성이 떨어지고, 재사용을 할 수 없어서 매번 같은 쿼리를 작성해줘야 한다. 이러한 문제점을 해소하기 위해 반복적인 사용을 가능하도록 제공하는 것이 바로 WITH 문이다.

기본적으로 WITH 문은 RDBMS, Oracle, MySQL, MS-SQL에서 지원하고 있다.

 

WITH절 문법

-- 단일 WITH절
WITH EXAMPLE AS
(
 SELECT 'WITH절' AS STR1
 FROM DUAL
)

-- 위에서 정의한 WITH절 사용
SELECT * 
FROM EXAMPLE

 

-- 다중 WITH절
WITH 별칭1 AS -- 첫 번째 WITH절
(
SELECT ~ -- 서브쿼리
FROM ~
),

별칭2 AS -- 두 번째 WITH절
(
SUB QUERY문 (SELECT절)
)

SELECT 컬럼1, 컬럼2 ... -- 메인쿼리
FROM 별칭1
	join 별칭2
    	on ~

 

WITH EXAMPLE1 AS 
(
SELECT  'EX1' A
FROM DUAL 
UNION ALL
SELECT 'EX2'
FROM DUAL
),

EXAMPLE2 AS 
(
SELECT 'EX3' A
FROM DUAL 
UNION ALL
SELECT A
FROM EXAMPLE1 --첫번째 WITH절 참조
)

SELECT *
FROM EXAMPLE2

 

💡 인라인 뷰(FROM절의 서브쿼리)와는 다르게, WITH절에서 사용한 서브쿼리의 칼럼을 다른 WITH문에서 참조가 가능하다. / WITH절 안에서 다른 WITH절을 참조하는 것도 가능하다. / 별칭으로 사용한 select절의 from절에 다른 select절의 별칭 참조가 가능하다.

 

 

 

💡 WITH절에 정의된 쿼리는 여러 번 사용할수록 효율이 증가한다.

WITH절에 정의된 내용을 한 번만 사용한다면 서브쿼리를 사용하는 것과 크게 성능차이가 나지 않기 때문이다. WITH절의 가장 큰 장점은 한번 WITH절의 내용을 한번에 올려놓고 계속 재사용한다는것에 큰 의미가 있기에, WITH절에 구문을 여러 번 참조하는 쿼리를 만들수록 그 효과가 배로 증가한다.