본문 바로가기
[스파르타코딩클럽]데이터분석 과정/SQL

[SQL] CTE와 VIEW _ 가독성과 번거로움을 덜기 위한 방법

by doo_ 2024. 1. 5.

[ CTE : Common Table Expression ]

> 서브쿼리로 쓰이는 파생 테이블과 비슷한 개념으로 사용된다.

- CTE는 만들기 위한 권한이 필요없고, 하나의 쿼리문이 끝날 때까지만 지속되는 일회성 테이블이다.

> 주로 복잡한 쿼리문에서 코드의 가독성과 재사용성을 위해 파생테이블 대신 사용하기에 유용하다.

*참고_MySQL은 8.0 버전부터 지원

 

> CTE 활용 예시 _ WITH 테이블명 AS ( 쿼리문 )

WITH TABLE1 AS(
	SELECT ~~
    FROM ~~
    WHERE ~~
    ),
    TABLE2 AS(
    SLSECT ~~
    FROM ~~
    WEHER ~~
    )
SELECT T1.ID, T1.NAME, ~~
FROM TABLE1 T1
	JOIN TABLE2 T2
    ON T1.ID = T2.ID

 

> '주의할 점'은 CTE를 무분별하게 사용할 경우, Query Performance가 오히려 떨어질 수 있다.

- MySQL8에서는 CTE는 임시테이블을 만드는 것(Materialization)이기 때문이다.

- 그럴 땐 서브쿼리 형태로 사용하는 것이 좋다.

참고_ Oracle은 기본적으로 Materialization을 하지 않음.

 

[ VIEW ]

> 데이터베이스에 존재하는 일종의 가상 테이블을 말한다. 

- 실제 테이블처럼 행과 열을 가지고 있지만, 실제로 데이터를 저장하고 있지는 않는다.

- 다시 말해, 데이터를 보여주는 역할만 수행.

- 만들기 위한 권한이 필요하며 사전에 정의를 해야 한다.

> 여러 테이블을 들리면서 생기는 번거로움을 줄이거나 반복해서 쓰는 쿼리문을 재사용할 때 사용

- 즉 복잡한 쿼리를 단순화 시켜준다.

> 참고

- 한 번 정의된 뷰는 변경이 불가능하다.

- 삽입 삭제 갱신 작업에 많은 제한 사항을 가진다.

- 뷰는 자신만의 인덱스를 가질 수 없다.

 

> 뷰 활용 예시 _ CREATE VIEW viewName AS  ~ 쿼리문 ~

# 뷰 생성
CREATE VIEW viewNAME AS
	SELECT ~~
    FROM ~~
    WHERE ~~

# 뷰 수정    
ALTER VIEW viewNAME AS
	SELECT ~~
    FROM ~~
    WHERE ~~
    
# 뷰 삭제
DROP VIEW viewNAME