Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

집 짓는 개발블로그

[프로그래머스] 이름에 el이 들어가는 동물 찾기 (MySQL) - LIKE, INSTR, LOCATE 본문

MySQL

[프로그래머스] 이름에 el이 들어가는 동물 찾기 (MySQL) - LIKE, INSTR, LOCATE

취준er 2024. 7. 5. 03:56

 

https://school.programmers.co.kr/learn/courses/30/lessons/59047

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 요약: 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

 

MySQL :: MySQL 8.4 Reference Manual :: B.3.4.1 Case Sensitivity in String Searches

B.3.4.1 Case Sensitivity in String Searches For nonbinary strings (CHAR, VARCHAR, TEXT), string searches use the collation of the comparison operands. For binary strings (BINARY, VARBINARY, BLOB), comparisons use the numeric values of the bytes in the ope

dev.mysql.com

 

CHAR, VARCHAR, TEXT와 같은 nonbinary string들은 비교 연산에서 case-sensitive하지 않다고 한다.

BINARY, VARBINARY, BLOB는 case-sensitive라는데, 일단 코딩테스트에서는 거의 볼 수 없는 타입들이니 넘어간다.

 

이 문제에서 사용한 NAME은 VARCHAR인 것을 확인할 수 있다. 따라서 대소문자 구분이 없고, 그래서 'EL' 기준으로 쿼리를 짰는데도 다음과 같이 'El', 'el' 등이 포함된 문자열들이 모두 결과로 나오는 것을 확인할 수 있다.

정답 쿼리를 실행한 결과 테이블