프로그래머스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
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
'코딩 테스트' 카테고리의 다른 글
SQL코딩테스트 모든 문제 풀이 완료 (0) | 2021.05.06 |
---|---|
[Programmers] SQL코딩테스트8 | 우유와 요거트가 담긴 장바구니 (0) | 2021.05.06 |
[Programmers] SQL코딩테스트7 | 헤비유저가 소유한 장소 (0) | 2021.05.06 |
[Programmers] SQL코딩테스트5 | JOIN (0) | 2021.04.06 |
[Programmers] SQL코딩테스트4 | IS NULL (0) | 2021.04.05 |
[Programmers] SQL코딩테스트3 | GROUP BY (0) | 2021.04.05 |