WITH절은 오라클9 이후 버전부터 사용이 가능하며 이름이 부여된 서브쿼리
라고 생각할 수 있다.
임시테이블을 만든다는 관점에서 본다면 VIEW와 쓰임새가 비슷한데 차이점이 있다면 VIEW는 한번 만들어놓으면 DROP할때까지 없어지지 않지만, WITH절 같은 경우 한번 실행할 쿼리문 내에 정의되어 있을 경우 그 쿼리문 안에서만 실행된다.
WITH절은 복잡한 SQL에서 동일 블록에 대해 반복적으로 SQL문을 사용하는 경우 그 블록에 이름을 부여하여 재사용 할 수 있게 함으로서 쿼리 성능을 높일 수 있는데 WITH절을 이용하여 미리 이름을 부여해서 Query Block
을 만들 수 있다. 자주 실행되는 경우 한번만 Parsing되고 Plan 계획이 수립되므로 쿼리의 성능향상에 도움이 된다.
WITH EXAMPLE AS
(
SELECT 'WITH절' AS STR1
FROM DUAL
)
SELECT * FROM EXAMPLE
EXAMPLE이라는 가상의 테이블(쿼리 블록)을 WITH절로 만든다.
그리고 이 가상의 테이블 EXAMPLE에서 필요한 값을 조회한다.
WITH EXAMPLE1 AS ( --첫번째 WITH문
SELECT 'EX1' A FROM DUAL
UNION ALL
SELECT 'EX2' FROM DUAL
),
EXAMPLE2 AS ( --두번째 WITH문
SELECT 'EX3' A FROM DUAL
UNION ALL
SELECT A FROM EXAMPLE1 --첫번째 WITH문 참조
)
SELECT * FROM EXAMPLE2
한 쿼리문안에 WITH절을 여러개 쓰는것도 가능하며 WITH절안에서 다른 WITH절을 참조하는것도 가능하다. WITH 절에 여러 개의 임시 테이블을 만들고 싶을 때는 쉼표(", ")를 찍고 이어서 선언하면 된다.
JOIN
: 어떤 키가 되는 값으로 join 해서 서로 다른 테이블을 연결하고 컬럼을 확장UNION
: 서로 다른 테이블들의 row를 하나로 합쳐서 보여준다. 로우를 확장UNION ALL
: 두 테이블의 ROW들을 단순히 합쳐서 보여준다.UNION
: 값이 중복되는 ROW들은 제거하고 보여준다.