본문 바로가기
컴퓨터관련/Oracle

[Oracle]With문 이용하여 가상테이블 생성 및 사용하기

by 빛과 어둠사이 2024. 3. 20.
728x90
반응형
SMALL

오늘은 오라클에서 with 문을 이용하여

가상테이블을 생성하고 사용하는 방법에 대해서 정리를 해보고자 합니다.

 

oracle에서는 with문을 이용해서

임시테이블을 생성하여 잠시 사용하고 버릴 수 있습니다.

오늘은 이 방법에 대해서 정리를 해보고자 합니다.

 

 

 

1. 설명

우선 with문이 무엇인지부터 간단히 정리를 해보도록 하겠습니다.

위에서 얘기한 것처럼 임시의 가상테이블을 생성하는 것입니다.

그래서 반복적으로 사용을 하게 되는 것입니다.

 

저희가 쉽게 쓸 때 서브쿼리를 통해서 데이터를 추출하고

그것을 join해서 쓰는 경우도 많이 있습니다.

그런데 이 결과를 여러번 호출해야 한다면??

그렇다면 그 때마다 서브쿼리를 작성해야 할까??

그럴 때 이렇게 with문을 이용해서 임시테이블을 생성하고

해당 임시테이블을 계속해서 사용해주시면 되십니다.

 

다만, 위에서 얘기한 것처럼 반복적으로 사용하면 좋은데

한번정도 사용한다면??

굳이 with로 임시테이블을 생성해서 써야 하나라는 의문도 들기는 합니다.

 

 

 

2. 단일 가상테이블

이번에는 사용방법에 대해서 정리를 해보고자 합니다.

우선 with문을 이용해서 하나의 가상테이블을 만들고 사용하는 방법에 대해서

정리를 해보고자 합니다.

 

with문을 사용하는 방법은 다음과 같습니다.

WITH 가상테이블명 AS (
select 문
)
SELECT * FROM 가상테이블명
;

 

위처럼 해주시면 되십니다.

select 결과를 가지고 가상테이블명이라는 테이블을 만들고

해당 테이블을 조회하는 것입니다.

 

실제 사용 예제를 확인해보도록 하겠습니다.

WITH tmp_a AS (
SELECT '홍길동' AS name , 20 AS age FROM dual
UNION ALL SELECT '홍길순' AS name , 21 AS age FROM dual
UNION ALL SELECT '김남길' AS name , 10 AS age FROM dual
UNION ALL SELECT '박신혜' AS name , 15 AS age FROM dual
UNION ALL SELECT '유재석' AS name , 40 AS age FROM dual
UNION ALL SELECT '강호동' AS name , 50 AS age FROM dual
UNION ALL SELECT '조세호' AS name , 33 AS age FROM dual
UNION ALL SELECT '김남주' AS name , 24 AS age FROM dual
UNION ALL SELECT '최민식' AS name , 44 AS age FROM dual
UNION ALL SELECT '안성기' AS name , 60 AS age FROM dual
)
SELECT * FROM tmp_a
;

 

위처럼 해주시면 되십니다.

여러 연예인 이름의 가상테이블을 생성하였습니다.

그리고 그냥 조회를 하는 것입니다.

 

 

 

위처럼 쿼리를 작성하였고,

실행을 하게 되면 결과는 아래처럼 나오게 됩니다.

 

위처럼 임시테이블의 데이터가 그대로 나와지는 것을 볼 수 있습니다.

 

 

이렇게 임시테이블로 만든 것도 테이블이기 때문에

where절을 설정할 수 있습니다.

age 값이 30 초과인 것들에 대해서만

데이터를 추출하도록 해보도록 하겠습니다.

 

WITH tmp_a AS (
SELECT '홍길동' AS name , 20 AS age FROM dual
UNION ALL SELECT '홍길순' AS name , 21 AS age FROM dual
UNION ALL SELECT '김남길' AS name , 10 AS age FROM dual
UNION ALL SELECT '박신혜' AS name , 15 AS age FROM dual
UNION ALL SELECT '유재석' AS name , 40 AS age FROM dual
UNION ALL SELECT '강호동' AS name , 50 AS age FROM dual
UNION ALL SELECT '조세호' AS name , 33 AS age FROM dual
UNION ALL SELECT '김남주' AS name , 24 AS age FROM dual
UNION ALL SELECT '최민식' AS name , 44 AS age FROM dual
UNION ALL SELECT '안성기' AS name , 60 AS age FROM dual
)
SELECT * FROM tmp_a
WHERE age > 30
;

 

위처럼 쿼리를 작성하였습니다.

더 위에서 작성한 쿼리에 where 절만 추가를 한 것입니다.

 

 

위철럼 쿼리를 작성하였고

실행을 하게 되면 결과는 아래처럼 나오게 됩니다.

 

위처럼 age값이 30 초과인 것들에 대해서만

나오는 것을 확인할 수 있습니다.

 

 

반응형

 

 

3. 다중 with

임시테이블을 위에서는 하나만 만들었습니다.

그런데 이러한 가상테이블을 2개, 3개도 만들 수 있습니다.

콤마로 구분을 해서 그냥 만들어주시면 되십니다.

 

WITH 임시테이블a AS (
selec 문
),
임시테이블b AS (
select
)
.....

 

위처럼 해주시면 되십니다.

...으로 생략을 하였는데 2개, 3개 더 만들 수도 있는 것입니다.

 

 

저는 2개만 만들어서 보는 쿼리를 작성해보도록 하겠습니다.

WITH tmp_a AS (
SELECT '홍길동' AS name , 20 AS age FROM dual
UNION ALL SELECT '홍길순' AS name , 21 AS age FROM dual
UNION ALL SELECT '김남길' AS name , 10 AS age FROM dual
UNION ALL SELECT '박신혜' AS name , 15 AS age FROM dual
UNION ALL SELECT '유재석' AS name , 40 AS age FROM dual
UNION ALL SELECT '강호동' AS name , 50 AS age FROM dual
UNION ALL SELECT '조세호' AS name , 33 AS age FROM dual
UNION ALL SELECT '김남주' AS name , 24 AS age FROM dual
UNION ALL SELECT '최민식' AS name , 44 AS age FROM dual
UNION ALL SELECT '안성기' AS name , 60 AS age FROM dual
),
tmp_b AS (
SELECT '홍길동' AS name ,  '서울 강남구'  AS addr FROM dual
UNION ALL SELECT '홍길순' AS name , '서울 서초구'  AS addr FROM dual
UNION ALL SELECT '김남길' AS name , '서울 마포구'  AS addr FROM dual
UNION ALL SELECT '박신혜' AS name , '서울 성북구'  AS addr FROM dual
UNION ALL SELECT '유재석' AS name , '서울 종로구'  AS addr FROM dual
UNION ALL SELECT '강호동' AS name , '서울 강서구'  AS addr FROM dual
UNION ALL SELECT '조세호' AS name , '서울 강동구'  AS addr FROM dual
UNION ALL SELECT '김남주' AS name , '서울 동대문구'  AS addr FROM dual
UNION ALL SELECT '최민식' AS name , '서울 강북구'  AS addr FROM dual
UNION ALL SELECT '안성기' AS name , '서울 관악구'  AS addr FROM dual
)
SELECT * FROM tmp_a a
INNER JOIN tmp_b b ON a.name = b.name
WHERE age > 30
;

 

위처럼 쿼리를 작성해보았습니다.

tmp_a라는 임시테이블과 tmp_b라는 임시 테이블 두개를 생성하였습니다.

그리고 이름을 기준으로 join 한 것입니다.

 

 

위처럼 쿼리를 작성하고 실행을 하게 되면

결과는 아래처럼 나오게 됩니다.

위처럼 age값이 30 초과인 데이터에 대해서

주소까지 같이 나오도록 하는 쿼리입니다.

이렇게 여러개의 임시테이블을 생성하고 조인해서 같이 사용할 수도 있습니다.

 

SMALL

 

 

 

오늘은 oracle에서 with문을 이용해서

임시테이블을 생성하고 사용하는 방법에 대해서 정리를 해보았습니다.

저는 개인적으로 서브쿼리보다 보기 좋아서 이렇게 쓰는 경우도 많이 있습니다.

그렇지만 서브쿼리랑 비교했을 때 IO차이나 그런 것은 크게 없습니다.

한번만 사용을 한다면요.

그래도 저처럼 사용할 수 있고,

동일 쿼리 결과를 여러번 호출하게 된다면 성능도 더 좋을 테니

알고 계시다가 사용을 해주시면 좋을 것 같습니다.

 

 

 

이상으로 오라클에서 wiht문 이용해서 임시테이블(가상테이블) 만들고 사용하는 방법이였습니다~

 

 

 

 

 

 

 

Do it! 오라클로 배우는 데이터베이스 입문:비전공자도 기초부터 확실하게!, 이지스퍼블리싱

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

728x90
반응형
LIST