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 '김%';
결론
내가 작성한 쿼리와 정답의 경우 문제에 대한 답으로는 둘 다 사용할 수 있다.
다만, 의도에 따라서 둘 중 취사 선택해서 사용면 되겠다.