[SQL] 프로그래머스 String, Date 문제

문제 출처. [프로그래머스] String, Date 문제

1. 루시와 엘라 찾기

문제

  • 동물 중 이름이 Lucy, Ella, Pickle, Rogan, Sabrina, Mitty인 동물의 아이디와 이름, 성별 및 중성화 여부를 조회

풀이

  • ("Lucy", "Ella", "Pickle", "Rogan", "Sabrina", "Mitty") 배열 내에 이름이 존재하는지 체크
SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE FROM ANIMAL_INS
WHERE NAME IN ("Lucy", "Ella", "Pickle", "Rogan", "Sabrina", "Mitty");

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

문제

  • 이름에 "EL"이 들어가는 개의 아이디와 이름 조회
  • 이름 순으로 정렬
  • 이름의 대소문자는 구분하지 않는다.

풀이

  • MySQL은 기본적으로 대소문자를 구분하지 않는다.
  • 따라서 "el", "El", "EL", "eL" 모두 같은 결과를 반환한다.
  • el이 포함하는 경우는 "%el%"이다.
    • %el%: el을 포함하는 모든 문자열
    • _el__: el이 두번째에 들어가있는 4글자 문자열
  • 주의할 것은 할머니의 "개"이므로 Dog도 체크해야한다.
  • =LIKE로 대체가능
SELECT ANIMAL_ID, NAME FROM ANIMAL_INS
WHERE ANIMAL_TYPE = "Dog" AND NAME LIKE "%eL%" 
ORDER BY NAME;

3. 중성화 여부 파악하기

문제

  • 중성화하면 O, 아니면 X로 출력

풀이

  • 중성화 여부는 IF()로 체크할 수 있다.
  • IF(조건식, 참일때값, 거짓일때값)
SELECT ANIMAL_ID, NAME,
IF(SEX_UPON_INTAKE LIKE "Intact%", "X", "O") AS "중성화"
FROM ANIMAL_INS ORDER BY ANIMAL_ID;
SELECT 
    ANIMAL_ID, 
    NAME,
    CASE WHEN 
        (SEX_UPON_INTAKE LIKE '%Neutered%') OR 
        (SEX_UPON_INTAKE LIKE '%Spayed%') 
    THEN 'O' 
    ELSE 'X' 
    END AS '중성화'
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
SELECT  ANIMAL_ID,
        NAME,
        IF(SEX_UPON_INTAKE REGEXP 'Neutered|Spayed', 'O' , 'X') AS 중성화
FROM    ANIMAL_INS

4. 오랜 기간 보호한 동물 (2)

문제

  • 보호 기간이 가장 길었던 동물 두 마리의 아이디와 이름을 조회
  • 보호 기간이 긴 순으로 조회

풀이

  • 두 테이블의 DATETIME을 비교하기 위해 ANIMAL_INS와 ANIMAL_OUTS를 INNER JOIN한다.
  • 입양일에서 보호 시작일을 뺀 기간 순으로 정렬 후 LIMIT 2로 두 마리 출력
  • 날짜를 빼는 것은 TIMESTAMPDIFF 또는 DATETIME 사용가능
  • 날짜간의 연산 자세히 알아보기
SELECT `IN`.ANIMAL_ID, `IN`.NAME FROM ANIMAL_INS AS `IN`
INNER JOIN ANIMAL_OUTS AS `OUT`
ON `IN`.ANIMAL_ID = `OUT`.ANIMAL_ID
ORDER BY TIMESTAMPDIFF(MINUTE, `IN`.DATETIME, `OUT`.DATETIME) DESC LIMIT 2;

5. DATETIME에서 DATE로 형변환

문제

  • 아이디, 이름, 들어온 날짜 조회
  • 아이디 순으로 정렬

풀이

SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME, "%Y-%m-%d") 
FROM ANIMAL_INS ORDER BY ANIMAL_ID;

좋은 웹페이지 즐겨찾기