VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
mysql -u root -p sakila로 클라이언트를 여세요.
CTE의 동작 방식
CTE_NAME을 중간 결과의 이름으로, COLUMN_LIST를 원하는 열로, TABLE_NAME을 안쪽 쿼리가 읽는 테이블로 바꾸세요. 그러면 주 쿼리는 CTE_NAME을 테이블인 것처럼 읽습니다.
CTE는 1개의 문장 동안 유지됩니다. 저장되지 않고, 다음 쿼리는 그것에 대해 아무것도 모릅니다.
예제
- 이름 붙인 단계 하나
FROM에서 꺼내어 이름을 붙였습니다.
- 각각 앞 단계 위에 쌓은 여러 단계
CTE는 쉼표로 구분하고, 뒤의 CTE는 앞의 CTE를 읽을 수 있습니다. 이것은 파생 테이블이 자신을 반복하지 않고는 할 수 없는 일입니다.
busiest가 counts를 읽고, 주 쿼리가 둘 다를 읽습니다. 파생 테이블로 쓰면 세는 쿼리가 두 번 나타날 것입니다.
CTE가 주고 파생 테이블은 주지 않는 것
행은 어느 쪽이든 같습니다. 2가지가 다릅니다:- CTE는 이름을 가지므로, 3단계 쿼리가 위에서 아래로 읽힙니다.
counts와busiest는 다음 독자에게 각 조각이 무엇을 위한 것인지 말해 줍니다. - CTE는 같은 문장 안에서 두 번 이상 이름으로 부를 수 있습니다. 파생 테이블은 다시 써 내야 합니다.
요약
- 쿼리를 읽는 쿼리보다 앞에서 그 쿼리에 이름을 붙이려면
WITH name AS (...)를 사용하세요. - 여러 CTE는 쉼표로 구분하고, 뒤의 CTE가 앞의 CTE를 읽게 하세요.
- CTE는 1개의 문장 동안만 유지된다고 예상하세요.
- 쿼리에 여러 단계가 있거나 서브쿼리를 반복할 때는 CTE를 쓰세요.
함께 보기
- 파생 테이블 — 같은 아이디어를 인라인으로
- 재귀 CTE — 자기 자신을 읽는 CTE
- GROUP BY — 안쪽 단계가 보통 하는 일
- MySQL CTE가 파생 테이블을 이기는 때 — 옵티마이저가 그것들을 다루는 방법