호기심 많은 분석가

[MySQL] 프로그래머스 Coding_Test / String, Date (1) 본문

Coding/Coding Test & Algorithm

[MySQL] 프로그래머스 Coding_Test / String, Date (1)

DA Hun 2021. 5. 7. 16:11

포스팅 개요

 SQL 문법과 익숙해지고자 프로그래머스의 SQL Coding Test 문제들을 풀어봄. 그중 String, Date 파트의 문제들을 기록해두었습니다. 그 전 문제들은 2021.05.07 - [Coding Test & Algorithm] - [MySQL] 프로그래머스 Coding_Test / JOIN (2) 포스팅에서 확인할 수 있습니다.


포스팅 본문

 아래의 문제들은 모두 동일한 TABLE을 기준으로 문제가 주어졌습니다.

TABLE 설명

TABLE


1. 루시와 엘라 찾기

 동물 보호소에 들어온 동물 중 이름이 Lucy, Ella, Pickle, Rogan, Sabrina, Mitty인 동물의 아이디와 이름, 성별 및 중성화 여부를 조회하는 SQL 문을 작성해주세요.

루시와 엘라 찾기

SELECT AI.ANIMAL_ID, AI.NAME, AI.SEX_UPON_INTAKE 
FROM ANIMAL_INS AS AI
WHERE AI.NAME IN ('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty')
ORDER BY AI.ANIMAL_ID

SELECT AI.ANIMAL_ID, AI.NAME, AI.SEX_UPON_INTAKE 
FROM ANIMAL_INS AS AI
WHERE AI.NAME REGEXP '^(Lucy|Ella|Pickle|Rogan|Sabrina|Mitty)$'
ORDER BY AI.ANIMAL_ID

 원래는 저번 파트 때 사용한 REGEXP 문법을 사용하여 해결했습니다. ^과 $로 예외상황이 발생하지 않게 방지하여주었습니다. 알아보니 다른 방법도 있어서 그 방법을 소개하고자 합니다. 

 

 IN 문법입니다. 위의 사용 예시만 봐도 느낌을 아시겠지만, [컬럼명] IN (EXP1, EXP2,...)로 사용하면 컬럼 중 EXP1, EXP2,.. 가 속해있는 컬럼만 반환해줍니다. 

 

 REGEXP의 경우 LIKE에 비해 보다 detail한 사용성을 가져다 주기 때문에 조금 더 섬세하게 다룰 필요가 있다고 합니다. 

그래서 이번 문제에서는 좀 더 가독성 있게 IN 문법을 사용하는 게 좋다고 하는데, 두 방법 다 사용해보시고 편한 방법을 채택하시면 될 것 같습니다. :)

  • 추가 정보 : IN 연산자는 WHERE 구문 내에서만 사용가능합니다.

2. 이름에 el이 들어가는 동물 찾기

 보호소에 돌아가신 할머니가 기르던 개를 찾는 사람이 찾아왔습니다. 이 사람이 말하길 할머니가 기르던 개는 이름에 'el'이 들어간다고 합니다. 동물 보호소에 들어온 동물 이름 중, 이름에 "EL"이 들어가는 개의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 이름 순으로 조회해주세요. 단, 이름의 대소문자는 구분하지 않습니다.

이름에 el이 들어가는 동물 찾기

SELECT ANIMAL_ID, NAME 
FROM ANIMAL_INS
WHERE ANIMAL_TYPE = 'Dog'
AND NAME LIKE '%el%'
ORDER BY NAME

 MySQL의 경우 LIKE 문법에서는 대소문자를 구분하지 않습니다. 따라서 TYPE이 'Dog' 중에서 NAME에 el을 포함하는 컬럼들을 출력해주면 됩니다.


3. 중성화 여부 파악하기

 보호소의 동물이 중성화되었는지 아닌지 파악하려 합니다. 중성화된 동물은 SEX_UPON_INTAKE 컬럼에 'Neutered' 또는 'Spayed'라는 단어가 들어있습니다. 동물의 아이디와 이름, 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요. 이때 중성화가 되어있다면 'O', 아니라면 'X'라고 표시해주세요.

중성화 여부 파악하기

SELECT ANIMAL_ID, NAME,
IF (SEX_UPON_INTAKE REGEXP '^Neutered|Spayed', 'O', 'X') AS '중성화'
FROM ANIMAL_INS
ORDER BY ANIMAL_ID

 이번 문제는 생각보다 시간이 많이 투자됐습니다. 원래는 IN 연산자가 WHERE 내에서만 사용가능하다는 걸 몰라서 시간이 꽤 소요됐고, 덕분에 새로운 지식을 얻었습니다. 

 

 조건을 만족시키기 위해 IF 문법을 사용했습니다. IF(조건문, '참일 때 값', '거짓일 때 값')으로 사용할 수 있고, SEX_UPON_INTAKE에 중성화 여부가 'Neutered' 또는 'Spayed'로 표현되므로 REGEXP의 앞부분에는 ^를 뒷부분에는 아무것도 사용하지 않았습니다. 

 

 그렇게 조건을 만족시키는 테이블을 완성시킨 뒤, ID별로 정렬하였습니다.


 마지막 파트답게 여러 개념들을 배우고 활용했습니다. 다음 포스팅 때 String, Date의 남은 2문제를 해결하며 마무리하겠습니다. 의문사항 있으시면 언제든 연락 주세요. 감사합니다. :)