WITH절과 CTE

윤재열·2022년 1월 30일
0

Mysql

목록 보기
4/8

WITH절은 CTE를 표현하기 위한 구문입니다.

  • CTE는 기존의 뷰, 파생 테이블, 임시테이블 등으로 사용되던 것을 대신할 수 있습니다.
  • 더 간결한 식으로 보여지는 장점이 있습니다.
  • CTE는 크게 비재귀적 CTE, 재귀적 CTE 두 가지가 있습니다.

비재귀적 CTE

비재귀적 CTE는 말 그대로 재귀적이지 않은 CTE입니다.

  • 단순한 형태이며, 복잡한 쿼리문장을 단순화 시키는데에 적합하게 사용될 수 있습니다. 우선 비재귀적 CTE의 형식을 살펴봅니다.
WITH CTE_테이블이름(열 이름)
AS
(
	<쿼리문>
)
SELECT 열 이름 FROM CTE_테이블이름 ;
  • 위의 CTE형식만 보면 생소하게 보이지만 , 위쪽을 떼버리고 SELECT 문만 생각해도 됩니다.
  • 그런데 이 테이블은 기존에는 실제 DB에 있는 테이블을 사용했지만, CTE는 바로 위의 WITH절에서 정의한 CTE_테이블 이름을 사용하는 것만 다릅니다.
  • 즉, WITH CTE_테이블이름(열 이름)AS..형식의 테이블이 하나 더 있다고 생각하면 됩니다.
  • 쉽게 이해하기 위해서 앞에서 했었던 buyTbl에서 총 구매액을 구하는것을 다시 살펴봅니다.
USe sqldb;
SELECT userID'사용자', SUM(price*amount)'총구매액' FROM buyTbl GROUP BY userID;

  • 위의 결과를 총 구매액이 많은 사용자 순서로 정렬하고 싶다고 하면 어떻게 해야 할까?
    -물론, 앞의 쿼리에 이어서 ORDER BY문을 첨가해도 됩니다.
  • 하지만 그럴 경우에는 SQL문이 더욱 복잡해 보일 수도 있으므로 다르게 생각해 봅니다.
    -위의 쿼리의 결과가 바로 abc라는 이름의 테이블이라고 생가하면 어떨까요?
SELECT * FROM abc ORDER BY 총구매액 DESC
  • 쿼리는 이렇게 간단해 집니다.
  • 이것이 CTE의 장점중 하나입니다.구문을 단순화시켜 준다.
  • 지금까지 공부한 실질적인 쿼리문은 다음과 같이 작성하면 됩니다.

  • 아직 이해가 잘 가질 않습니다. 다른 예로 하나 더 연습해보자.

    회원테이블(userTbl)에서 각 지역별로 가장 큰 키를 1명씩 뽑은 후에, 그사람들 키의 평균을 내보자. (만약, 전체의 평균이라면 AVG(height)만 사용하면 되지만, 각 지역별로 가장 큰 키의 1명을 우선 뽑아야 하므로 이야기가 복잡해집니다.) 이럴 때 CTE를 유용하게 사용할 수 있습니다.

    1. "각 지역별로 가장 큰 키"를 뽑는 쿼리는 다음과 같습니다.
SELECT addr, MAX(height) FROM userTbl GROUP By addr
    1. 위 쿼리를 WITH구문으로 묶는다.
WITH CTE_userTbl(addr, maxHeight)
AS
(SELECT addr, MAX(height) FROM userTbl GROUP BY addr)
  • 3."키의 평균을 구하는 쿼리를 작성한다."
SELECT AVG() FROM CTE_테이블이름
    1. (2)번과 (3)번 쿼리를 합친다.이 예에서는 키의 평균을 실수로 만들기 위해서 키에 1.0을 곱해서 실수로 변환했다.
WITH CTE_userTbl(addr, maxHeight)
AS
	(SELECT addr, MAX(height) FROM userTbl GROUP BY addr)
SELECT AVG(maxHeight*1.0) AS '각 지역별 최고키의 평균' FROM cte_userTbl;    

profile
블로그 이전합니다! https://jyyoun1022.tistory.com/

0개의 댓글