공부/My SQL
WITH AS (CTE)
딸기버블티
2021. 3. 8. 22:52
CTE
CTE 란 Common Table Expression 이다.
CTE는 기존의 뷰, 파생 테이블, 임시 테이블 등으로 사용되던 것을 대신할 수 있으며 간결하게 보여질 수 있다.
CTE는 비재귀적 CTE와 재귀적 CTE 두 가지가 있다.
비재귀적 CTE
1
2
3
4
5
6
7
|
WITH CTE_테이블이름(열 이름)
AS
(
<쿼리문>
)
SELECT 열1, 열2 FROM CTE_테이블이름 ;
|
cs |
쿼리문에 대한 것을 CTE_테이블로 정의해놓고, SELECT 문에서 CTE_테이블을 활용한다.
1
2
3
|
SELECT userid AS '사용자', SUM(price*amount) AS '총구매액'
FROM buyTBL
GROYP BY userid;
|
cs |
이 쿼리의 조회 결과가 아래와 같고,
총구매액을 내림차순으로 정렬하고 싶을 때, 쿼리 뒤에 ORDER BY 를 붙이는 방법 대신, CTE 방법을 이용하면 다음과 같다.
1
2
3
4
5
6
7
|
WITH abc(userid , total)
AS
(
SELECT userid, SUM(price*amount)
FROM buytbl GROUP BY userid
)
SELECT * FROM abc ORDER BY total desc;
|
cs |
AS () 안에서 조회 한 buytbl 의 userid, SUM(price*amount) 가 각각
abc 테이블의 userid, total 열로 설정이 된다.
이때 주의할 점은 WITH ( 1, 2, 3... ) 의 열 개수와 AS ( SELECT 1, 2, 3... ) 의 열 개수가 같아야 한다.
이 쿼리의 조회 결과는 아래와 같다.
buytbl 을 ORDER BY 한 결과와 같다!
>>여러 개의 CTE 를 사용한 예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
WITH cte_userTBL(addr, maxHeight)
AS
(
SELECT addr, MAX(height)
FROM usertbl
GROUP BY addr
),
cte_addr(addr, height)
AS
(
SELECT addr, height
FROM usertbl
GROUP BY addr
)
SELECT AVG(A.maxHeight*1.0) AS '각 지역별 최고키의 평균' , B.addr FROM cte_userTBL A, cte_addr B;
|
cs |