Inflearn brand logo image

인프런 커뮤니티 질문&답변

dev.rudevico님의 프로필 이미지
dev.rudevico

작성한 질문수

김영한의 실전 데이터베이스 입문 - 모든 IT인을 위한 SQL 첫걸음(SQL부터 차근차근)

문제와 풀이

문제5번 - 함수 코드 중복 방지를 위한 방법 중 서브쿼리와 CTE의 차이

해결된 질문

작성

·

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를 고려하는 것이 좋습니다.

감사합니다.

dev.rudevico님의 프로필 이미지
dev.rudevico
질문자

그렇군요. 말씀하시는 바를 정확히 이해했습니다!

언제나 좋은 강의와 답변 감사드려요.

dev.rudevico님의 프로필 이미지
dev.rudevico

작성한 질문수

질문하기