본문 바로가기
코딩 테스트

[Programmers] SQL코딩테스트6 | String,Date

by 카프리썬_ 2021. 4. 7.
728x90
728x90

프로그래머스SQL 뽀개기!! 일주일동안 매일 하나의 유형 다 뽀개기! 챌린지!

아래의 문제는 프로그래머스 SQL코득점 Kit 내용이며 코드는 직접 푼 내용입니다.

 


1.루시와 엘라 찾기

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

이떄 결과는 아이디순으로 정렬 

SELECT animal_id, name, sex_upon_intake
from animal_ins
where name like 'Lucy'
or name like 'Ella'
or name like 'Pickle'
or name like 'Rogan'
or name like 'Sabrina'
or name like 'Mitty'
order by animal_id
다른풀이

생각해보니 IN을 쓰면 되자나? OR이랑 같은 의미인데 OR로 쓰면 길어져서 IN권장 

select animal_id, name, sex_upon_intake
from animal_ins
where name in ('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty')
order by animal_id

IN연산자, OR연산자 참고

 

 

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

동물 보호소에 들어온 동물 이름 중, 이름에 "EL"이 들어가는 개의 아이디와 이름을 조회

이때 결과는 이름 순으로 조회 (단 대소문자 구분하지 않음)

SELECT animal_id, name 
from animal_ins
where name like '%el%' and animal_type = 'dog'
order by name

연산자 와일드카드패턴 

%: 모든문자 , _ : 한글자 

앞뒤에 무슨글자가 오던지 '야호'가 들어가도록 검색 : %야호%

맨앞 한글자 뒤에  '짠'으로 끝나도록 검색 : _짠

'와우'라고 시작하는 글자를 검색 : 와우%

'짜잔 그래도 가진 글자를 검색 : 짜잔

 

3. 중성화여부 파악하기

동물의 아이디와 이름, 중성화 여부를 아이디 순으로 조회

이때 중성화가 되어있다면 'O', 아니라면 'X'라고 표시

중성화된 동물은 SEX_UPON_INTAKE 컬럼에 'Neutered' 또는 'Spayed'라는 단어가 들어있습니다. 

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

새로운 컬럼을 정의하기때문에 case~when~then~else end문

case when 조건절 then A, else 아니면 B다  END AS "컬럼명"

 

다른풀이
SELECT ANIMAL_ID,NAME,IF(SEX_UPON_INTAKE LIKE 'Intact%','X','O') AS '중성화'
FROM ANIMAL_INS 
ORDER BY ANIMAL_ID
  • IF(조건, 조건일때결과, 조건아닐때결과)

IFNULL처럼 IF도 그냥 쓸 수 있구나

 

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

입양을 간 동물 중, 보호 기간이 가장 길었던 동물 두 마리의 아이디와 이름을 조회

이때 결과는 보호 기간이 긴 순으로 조회

SELECT animal_ins.animal_id,animal_ins.name
from animal_ins inner join animal_outs
on animal_ins.animal_id = animal_outs.animal_id
order by animal_outs.datetime-animal_ins.datetime desc
limit 2

보호기간 = 입양일(animal_outs.datetime) - 보호시작일(animal_ins.datetime)

각각 테이블의 컬럼이 필요하니까 우선조인.

 

대신 이렇게 보호기간을 구하면 날짜형식이 아니라 숫자형식이 된다.

그래서 얼마나 차이나는지를 볼 땐 DATEDIFF 사용하기도 한다.

다른풀이 
 SELECT ANIMAL_INS.ANIMAL_ID,ANIMAL_INS.NAME
 FROM ANIMAL_INS INNER JOIN ANIMAL_OUTS
 ON ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID
 ORDER BY DATEDIFF(ANIMAL_OUTS.DATETIME,ANIMAL_INS.DATETIME) DESC
 LIMIT 2 
  • DATEDIFF(비교날짜1,비교날짜2) = '일'기준 차이

실제로 DATEDIFF와 DATETIME을 뺀 값의 결과를 보면 이렇다. 

뺀 값은 실제 시간상으로 그러니까 시분초까지 계산해서 얼마나 차이나는지에 대한 결과이고, 

DATEDIFF는 일수로 얼마나 차이나는지를 알 수 있다. 

10월 18일과 10월 14일의 차이는 4로 DATEDIFF의 결과4

또한 11월 20일 17:04와 11월 20일 13:09의 차이는 시분초 단위니까 뺄셈의 결과가 있지만, 

DATEDIFF의 일기준 차이는 없기 때문에 결과 0

 

5.datetime에서 date로 형변환

ANIMAL_INS 테이블에 등록된 모든 레코드에 대해, 각 동물의 아이디와 이름, 들어온 날짜를 조회

즉, 날짜를 시각(시-분-초)을 제외한 날짜(년-월-일)만 보여주세요

이때 결과는 아이디 순으로 조회

select animal_id,name,date_format(datetime,"%Y-%m-%d")
from animal_ins 
order by animal_id
  • 날짜형변환 : date_format(컬럼명, 표기식)

표기식 : yyyy,mm,dd 가 아니라 하나씩 y,m,d

다 소문자일떄 년/월/시
다 소문자일때 y,m,d
다 대문자일때 Y,M,D

728x90
반응형