문제5번 - 함수 코드 중복 방지를 위한 방법 중 서브쿼리와 CTE의 차이
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)
[질문 내용]
질문이 서론과 본론으로 구분되어 있으며, 실제 질문 내용은 본론에 있습니다!
서론
안녕하세요 영한님.
문제5번에서는 SUBSTRING_INDEX(email, '@', 1) 함수를 user_id와 id_length에서 두 번 반복해서 사용하게 됩니다.
중복 문제를 개선하기 위해 초기에는 다음과 같이 CHAR_LEGNTH(user_id) AS id_length로 시도를 했으나 실패했습니다.
-- 에러 발생 코드
SELECT
email,
SUBSTRING_INDEX(email, '@', 1) AS user_id,
CHAR_LENGTH(SUBSTRING_INDEX(user_id) AS id_length
FROM
customers
;그 이유는 SELECT 절의 모든 표현식이 논리적으로 동시에 평가되기 때문이라고 판단했고, 이를 해결하기 위한 방법 중 서브쿼리와 CTE(Common Table Expression) 방식을 찾았고 이를 직접 적용해봤습니다.
-- sol1. 서브 쿼리
SELECT
email,
user_id,
CHAR_LENGTH(user_id) AS id_length
FROM
(SELECT
email,
SUBSTRING_INDEX(email, '@', 1) AS user_id
FROM
customers
) AS dt
;-- sol2. CTE
WITH email_parts AS (
SELECT
email,
SUBSTRING_INDEX(email, '@', 1) AS user_id
FROM
customers
)
SELECT
email,
user_id,
CHAR_LENGTH(user_id) AS id_length
FROM
email_parts;
본론
이 과정에서 "서브 쿼리와 CTE의 성능 차이가 있는가?"에 대한 의문이 들어서 리서치를 했으나 제 수준이 부족한 탓인지 이에 대한 명확한 답변을 찾지 못했는데요(현재 '상황에 따라 다르다' 수준으로만 이해한 상태입니다).
혹시 실무에서는 서브 쿼리와 CTE 중 (성능, 가독성, 개발팀 관례 등의 이유로 인해) 무엇을 선호하는지 의견을 들을 수 있을까 싶어 질문 남깁니다!
혹시 다음 강의에서 다루는/다룰 내용이라면 제가 추후에 해당 강의를 들을 때 학습하도록 하겠습니다!
Answer 1
1
안녕하세요. dev.rudevico님
사실상 문법의 차이이기 때문에 성능은 비슷하다고 보시면 되고, 가독성 및 편의성은 CTE가 좋습니다.
다만 CTE가 MySQL에는 8버전부터 비교적 늦게 들어왔고, 서브 쿼리에 익숙한 개발자 분들이 많아서 서브 쿼리가 아직은 더 많이 사용됩니다.
실무에서 권장드리는 방법은 간단한 경우 서브쿼리를, 복잡하고 읽기 어려운 경우 CTE를 고려하는 것이 좋습니다.
감사합니다.
교재 p.31 실행순서 오류?
0
108
2
sql서버가 켜지면 다시 꺼짐
0
108
2
INSERT INTO 관련 질문
0
86
1
MySQL 설치 질문 드립니다.
0
144
2
mysql화면 오류
0
90
1
NOT NULL과 DEFAULT 조건의 사용법
0
105
1
mysql 버전
0
94
1
정말 별 거 아니긴 한데요
0
135
2
논리적 실행 순서에서 SELECT 설명 질문
0
87
2
primary key는 테이블 당 하나만 존재할 수 있다?
0
109
1
노트앱 어떤 거 쓰시나요?
0
145
1
drop과 truncate
0
87
1
db 공부관련 질문
0
128
2
GROUP BY 에서 ORDER BY 를 사용했을 때 오류
0
114
1
오타 제보
0
82
1
7.SQL - 집계와 그룹핑 : 문제와 풀이에서 2번문제
0
67
1
GROUP BY 강의 중 ORDER BY에 관한 질문
0
91
1
order 테이블 생성이 안되네요
0
121
4
ifnull()과 default 차이
0
95
1
help me 도와주세요 MySQL 설치 pls 급해요
0
149
2
DB 설계편 예상 출시일
0
154
2
강의 내용
0
106
1
오류 원인
1
101
3
개발자 취준
0
244
2

