[SQL] WITH절 정리
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절에 구문을 여러 번 참조하는 쿼리를 만들수록 그 효과가 배로 증가한다.