Sparta/SQL-Practice

[MySQL][Practice] Lv1. 데이터 속 김서방 찾기

syuare 2025. 4. 11. 22:37

Table - users > 스파르타 코딩클럽에 가입한 유저들의 정보를 날짜별로 기록한 테이블

  • user_id: 익명화된 유저들의 아이디(varchar255)
  • created_at: 아이디 생성 날짜(timestamp)
  • updated_at: 정보 업데이트 날짜(timestamp)
  • name: 익명화된 유저들의 이름(varchar255)
  • email: 이메일(varchar255)

Q) name_cnt > “김”씨 성을 가지고 있는 교육생의 수

select count(distinct user_id) name_cnt -- distinct를 통해 중복 제거
from users
where name like '김%'

 

더보기

정답

SELECT count(distinct(user_id)) as name_cnt
FROM 
    users
where substr(name,1,1) = '김'

LIKE 연산자 vs SUBSTR 함수


문자열 비교 방식의 차이:

  • LIKE 연산자:
    • name like '김%'는 name 컬럼의 값이 '김'으로 시작하는 모든 문자열의 패턴을 찾는 방식인 패턴 매칭 방식
    • 조건이 간단할 경우에도 뒤에 오는 모든 문자열(0개 이상의 문자)을 포함하는지를 검사한다.
  • SUBSTR 함수와 등호 비교:
    • substr(name,1,1) = '김'은 name 문자열에서 첫 번째 문자만 추출하여 그 값이 정확히 '김'과 일치하는지를 비교

두 방법 모두 이름의 첫 글자가 '김'인지를 체크하는 데는 크게 문제가 없다.

다만, SUBSTR 방식을 사용하면 문자열의 해당 자리만 정확히 비교하게 될 수는 있다.


성능 관점

컬럼의 인덱스 유무에 따라 성능적인 차이가 발생할 수 있다.

 

*name 컬럼에 인덱스가 있을 경우

  • 패턴이 고정된 LIKE 연산자가 인덱스를 효과적으로 사용할 수 있음 -> 빠른 검색이 가능
  • substr은 함수 적용으로 인해 인덱스 사용이 제한될 수 있음
    • 인덱스 사용이 제한될 경우 대용량 데이터에서 성능차이가 나타날 수 있음 
      • DB 엔진은 보통 전체 테이블 스캔을 함 → 성능 저하 발생할 수 있음

(예시) 인덱스 생성

CREATE INDEX idx_users_name ON users(name);

 

위와 같이 인덱스가 생성된 후 아래의 쿼리를 사용하면 인덱스를 활용하여 빠르게 실행될 수 있음

SELECT count(distinct user_id) as name_cnt 
FROM users
WHERE name LIKE '김%';

결론

내가 작성한 쿼리와 정답의 경우 문제에 대한 답으로는 둘 다 사용할 수 있다.

다만, 의도에 따라서 둘 중 취사 선택해서 사용면 되겠다.