CTE와 Subquery

Suhyeon Lee·2024년 10월 2일
0

CTE(Common Table Expressions)

  • CTE는 일시적인 결과 세트를 정의하고 이를 나중에 쿼리에서 참조할 수 있게 하는 방법
  • 쿼리의 가독성을 높이고 복잡한 쿼리를 단순화하는 데 사용
/*1개의 임시테이블*/
WITH 임시테이블명 AS (
	SUBQUERY문(SELECT)
)
SELECT 컬럼, [컬럼, ...]
FROM 임시테이블명

/*2개 이상의 임시테이블*/
WITH
	임시테이블명1 AS (
		SUBQUERY문(SELECT)
	)
	, 임시테이블명2 AS (
		SUBQUERY문(SELECT)
	)
SELECT 컬럼, [컬럼, ...]
FROM 임시테이블명
  • WITH절을 사용하여 작성하면 임시 테이블을 재사용할 수 있어 조건절의 조정이 수월함

서브쿼리(Subqueries)

  • 하나의 쿼리 안에 포함된 또 다른 쿼리
  • 주로 WHERE절, SELECT절, 또는 FROM절에서 사용되어 메인 쿼리의 데이터를 필터링하거나 변형
    • WHERE절, HAVING절 → 중첩 서브 쿼리(Nested Subquery)
    • SELECT절 → 스칼라 서브쿼리(Scalar Subquery)
    • SELECT절 → 인라인 뷰 서브쿼리(Inline View Subquery)

CTE와 서브쿼리의 차이점

  • 가독성
    • CTE는 복잡한 쿼리를 여러 부분으로 나누어 가독성을 높임
    • 서브쿼리는 종종 쿼리 안에 중첩되어 가독성이 떨어질 수 있음
  • 재사용성
    • CTE는 동일한 쿼리 내에서 여러 번 재사용될 수 있지만, 서브쿼리는 각기 별도로 실행
  • 성능
    • CTE와 서브쿼리의 성능 차이는 데이터베이스 시스템과 쿼리의 복잡도에 따라 달라질 수 있음
    • 일반적으로 CTE는 재귀적 쿼리에 유리

“재귀적 쿼리”란 쿼리가 자기 자신을 참조하여 반복적으로 데이터를 처리하는 쿼리를 의미합니다. 재귀적 쿼리는 트리 구조 또는 계층적 데이터를 처리할 때 유용합니다.

WITH절과 Subquery

WITH 임시테이블명 AS (
	SUBQUERY문(SELECT)
)
SELECT *
FROM 임시테이블명

# 아래 서브쿼리와 동일
SELECT a.*
FROM (
	SUBQUERY문(SELECT)
	) a
  • WITH절로 사용한 임시 테이블은 해당 SQL 내에서 재사용이 가능함
    • 한 번만 사용하는 SQL문에서는 굳이 WITH절을 사용할 필요가 없지만, 재사용이 필요한 상황에서는 WITH절을 사용하는 게 개발자 입장에서는 편리
  • 하지만 WITH절이나 Subquery는 VIEW라는 임시 저장을 만드는 행위이기 때문에 SQL문 작성에 좋은 습관은 아니라고 함 → JOIN으로 작성하는 게 RDBMS(관계형 데이터베이스 관리 시스템) 자원 사용 입장에서는 더 효율적임
  • CTE를 사용하면 각 부분을 분리하여 쿼리를 단계별로 이해하고 디버깅하기 쉬움
  • 서브쿼리는 직관적이고 간단하게 필요한 조건을 충족시키는 데이터를 찾는 데 유용
  • 서브쿼리의 사용이 더 효율적인 경우
    • 특정 제품의 평균 판매량을 구하고, 그 평균 판매량보다 높은 판매량을 가진 제품들을 찾는 쿼리
      • 특정 조건을 만족하는 데이터를 필터링하여 그 결과를 바탕으로 추가적인 계산을 할 때 서브쿼리는 CTE보다 더 효율적

추가: SELECT a.*로 적어야 하는 이유

  • 별표(*)만 써도 웬만한 DB에서는 무방
  • 실무에서는 Subquery만으로 완성된 Query보다는 Subquery에 추가로 JOIN하여 정보를 추출하는 경우가 발생할 수 있는데 이 때 단순 별표로 작성하면 필요하지 않은 정보가 포함되어 표시될 수 있음
  • 개인적으로 결과를 보는 경우라면 상관없지만, 다른 사람에게 데이터를 전달하고자 한다면 이러한 정보를 정제해서 보여줘야 함 → 이미 Subquery에서 정제한 테이블은 a.*로 전체를 보여주고 그 외 추가로 JOIN된 부분은 보여주고 싶은 Column만 지정하여 사용하는 방식을 권장
profile
2 B R 0 2 B

0개의 댓글