inflearn logo
강의

Course

Instructor

Young-han Kim's Introduction to Practical Databases - SQL First Steps for All IT Professionals (Step-by-Step from SQL)

Problems and Solutions

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

Resolved

120

devrudevico

44 asked

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 중 (성능, 가독성, 개발팀 관례 등의 이유로 인해) 무엇을 선호하는지 의견을 들을 수 있을까 싶어 질문 남깁니다!

혹시 다음 강의에서 다루는/다룰 내용이라면 제가 추후에 해당 강의를 들을 때 학습하도록 하겠습니다!

sql mysql dbms/rdbms SQLD

Answer 1

1

yh

안녕하세요. dev.rudevico님

사실상 문법의 차이이기 때문에 성능은 비슷하다고 보시면 되고, 가독성 및 편의성은 CTE가 좋습니다.

다만 CTE가 MySQL에는 8버전부터 비교적 늦게 들어왔고, 서브 쿼리에 익숙한 개발자 분들이 많아서 서브 쿼리가 아직은 더 많이 사용됩니다.

실무에서 권장드리는 방법은 간단한 경우 서브쿼리를, 복잡하고 읽기 어려운 경우 CTE를 고려하는 것이 좋습니다.

감사합니다.

1

devrudevico

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

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

교재 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