집 짓는 개발블로그
[프로그래머스] 이름에 el이 들어가는 동물 찾기 (MySQL) - LIKE, INSTR, LOCATE 본문
https://school.programmers.co.kr/learn/courses/30/lessons/59047
문제 요약: SQL에서 문자열 처리를 묻는 문제. 'EL'이라는 특정 문자열을 포함하는 데이터를 WHERE에서 필터링해야 한다.
포인트: LIKE, INSTR, LOCATE, ORDER BY, MySQL의 문자열 검색 시 대소문자 구분 여부
정답 1
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE NAME LIKE '%EL%' AND ANIMAL_TYPE = 'Dog'
ORDER BY NAME ASC;
먼저 LIKE를 사용해서 풀었다.
사용할 수 있는 와일드카드는 %와 _ 가 있는데, %는 문자 여러 개를 한 번에 표현할 수 있고, 심지어는 문자가 없어도 된다.
_는 문자 딱 한 개를 표현한다.
정답 2
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INSTR(NAME, 'EL') != 0 AND ANIMAL_TYPE = 'Dog'
ORDER BY NAME ASC;
INSTR(전체 문자열, 찾고 있는 특정 문자열) 을 사용해도 된다.
찾고 있는 특정 문자열의 위치를 반환한다. 찾을 수 없으면 0을 반환한다.
🔥 주의점: MySQL에서 첫 번째 위치는 1이다. 프로그래밍 언어에서처럼 0이 아님. 0이 반환되면 첫 번째에 있구나~ 가 아니고, 찾을 수 없단 것!
정답 3
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE LOCATE('EL', NAME) != 0 AND ANIMAL_TYPE = 'Dog'
ORDER BY NAME ASC;
LOCATE(찾고 있는 특정 문자열, 전체 문자열) 을 사용하는 방법도 있다.
주의점은 INSTR와 동일하게, 찾지 못하면 0을 반환하고 첫 번째에 있다면 1을 반환한다.
🔥 주의점: INSTR와 LOCATE는 괄호 안에 들어가는 파라미터의 순서가 반대다.
꼭 이런 게 나중에 헷갈린다. 나는 그냥 INSTR은 전체 문자열 입장에서 안에 이거 있니? 하면서 뭘 찾아보는 느낌이고, LOCATE는 찾는 문자열 입장에서 우리집주소가 어딜까..? 이런 느낌이라고 생각하면서 각각의 첫 번째 파라미터를 외웠다.
추가적으로, MySQL의 ORDER BY는 기본적으로 대소문자를 구분하지 않고 정렬한다는 것을 이 문제를 풀면서 배웠다.
대소문자를 구분해서 정렬하려면 별도 조치가 필요하다.
그런데 문제에서
처음에는 el을 찾으려고 하다가 왜 갑자기 EL이 포함된 문자열을 찾으라고 말을 바꿨을까?
혹시 대소문자 구분이 없는 것일까? 의문이 들었다.
궁금증 해겨을 위해 MySQL 공식문서를 살펴봤다.
https://dev.mysql.com/doc/refman/8.4/en/case-sensitivity.html
CHAR, VARCHAR, TEXT와 같은 nonbinary string들은 비교 연산에서 case-sensitive하지 않다고 한다.
BINARY, VARBINARY, BLOB는 case-sensitive라는데, 일단 코딩테스트에서는 거의 볼 수 없는 타입들이니 넘어간다.
이 문제에서 사용한 NAME은 VARCHAR인 것을 확인할 수 있다. 따라서 대소문자 구분이 없고, 그래서 'EL' 기준으로 쿼리를 짰는데도 다음과 같이 'El', 'el' 등이 포함된 문자열들이 모두 결과로 나오는 것을 확인할 수 있다.
'MySQL' 카테고리의 다른 글
[프로그래머스] 입양 시각 구하기(2) (MySQL) - WITH RECURSIVE CTE (0) | 2024.07.05 |
---|---|
[프로그래머스] 특정 세대의 대장균 찾기 (MySQL) (0) | 2024.07.05 |
[프로그래머스] 특정 물고기를 잡은 총 수 구하기 (MySQL) (0) | 2024.06.27 |
(MySQL) Alias 그리고 따옴표(' ', " ") (1) | 2024.06.27 |
MySQL DATE_FORMAT 정리 (0) | 2024.06.27 |