해결된 질문
작성
·
40
·
수정됨
0
[질문 템플릿]
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 중 (성능, 가독성, 개발팀 관례 등의 이유로 인해) 무엇을 선호하는지 의견을 들을 수 있을까 싶어 질문 남깁니다!
혹시 다음 강의에서 다루는/다룰 내용이라면 제가 추후에 해당 강의를 들을 때 학습하도록 하겠습니다!
답변 1
1
안녕하세요. dev.rudevico님
사실상 문법의 차이이기 때문에 성능은 비슷하다고 보시면 되고, 가독성 및 편의성은 CTE가 좋습니다.
다만 CTE가 MySQL에는 8버전부터 비교적 늦게 들어왔고, 서브 쿼리에 익숙한 개발자 분들이 많아서 서브 쿼리가 아직은 더 많이 사용됩니다.
실무에서 권장드리는 방법은 간단한 경우 서브쿼리를, 복잡하고 읽기 어려운 경우 CTE를 고려하는 것이 좋습니다.
감사합니다.
그렇군요. 말씀하시는 바를 정확히 이해했습니다!
언제나 좋은 강의와 답변 감사드려요.