프로그래머스에서 제공하는 SQL 문제 모음을 풀이하였습니다. 풀이한 고득점 SQL Kit 해답을 공유합니다.
파트 23. SELECT
-- ================= 파트 23. SELECT =================
-- ====================================================
-- 모든 레코드 조회하기
SELECT * from animal_ins order by animal_id;
-- 역순 정렬하기
SELECT name, datetime
from animal_ins
order by animal_id desc;
-- 아픈 동물 찾기
select animal_id, name
from animal_ins
where intake_condition = 'Sick'
order by animal_id;
-- 동물의 아이디와 이름
SELECT animal_id, name
from animal_ins
order by animal_id;
-- 어린 동물 찾기
SELECT animal_id, name
from animal_ins
where intake_condition != 'Aged'
order by animal_id;
-- *** 여러 기준으로 정렬하기
select animal_id, name, datetime
from animal_ins
order by name, datetime desc;
-- 상위 n개 레코드
SELECT name
from animal_ins
where datetime = (select min(datetime)
from animal_ins);
-- ** 다른 방법 limit
select name
from animal_ins
order by datetime
limit 1;
파트 24. SUM, MAX, MIN
-- ============== 파트 24. SUM, MAX, MIN ===========
-- ==================================================
-- 최댓값 구하기
select datetime as '시간'
from animal_ins
order by datetime desc
limit 1;
-- 최솟값 구하기
SELECT datetime as '시간'
from animal_ins
order by datetime
limit 1;
-- 동물 수 구하기
SELECT count(*) as count
from animal_ins;
-- 중복 제거하기
SELECT count(distinct name) as count
from animal_ins
where name is not null;
파트 25. GROUP BY
-- ============== 파트 25. GROUP BY ===============
-- ==================================================
-- 고양이와 개는 몇 마리 있을까
select animal_type, count(*)
from animal_ins
group by animal_type
order by animal_type;
-- ***동명 동물 수 찾기 (having**)
select name, count(name) as COUNT
from animal_ins
where name is not null
group by name
having count(name)>=2
order by name;
-- 입양 시각 구하기(1)
-- (** year(), month(), day(), hour(), minute(), second() )
SELECT hour(datetime),count(*)
from animal_outs
where hour(datetime) between 9 and 20
group by hour(datetime)
order by hour(datetime);
-- ** substring 방법
select substring(datetime,12,2) as hour, count(*) as count
from animal_outs
where substring(datetime,12,2) between '09' and '20'
group by substring(datetime,12,2)
order by substring(datetime,12,2);
-- 입양 시각 구하기(2)
-- *** with recursive
with recursive time as(
select 0 as h
union all
select h+1 from time where h<23)
select h as hour, count(animal_id) as count
from time left outer join animal_outs
on (h=hour(datetime))
group by h;
파트 26. IS NULL
-- ============== 파트 26. IS NULL ===============
-- ================================================
-- 이름이 없는 동물의 아이디
SELECT animal_id
from animal_ins
where name is null;
-- 이름이 있는 동물의 아이디
SELECT animal_id
from animal_ins
where name is not null
order by animal_id;
-- NULL 처리하기
-- (**ifnull)
SELECT animal_type, ifnull(name,'No name') as name, sex_upon_intake
from animal_ins
order by animal_id;
파트 27. JOIN
-- ============== 파트 27. JOIN ===============
-- ==============================================
-- 없어진 기록 찾기
-- (** right outer join은 오른쪽 테이블을 모두 로드하고, 왼쪽테이블을 가져다 붙인다. 왼쪽 테이블에서 가져올 값이 없는요소는 null로 둔다)
SELECT animal_outs.animal_id as animal_id, animal_outs.name as name
from animal_ins right join animal_outs
on animal_ins.animal_id = animal_outs.animal_id
where animal_ins.animal_id is null
-- 다른 방법 not in
select animal_outs.animal_id as animal_id, animal_outs.name as name
from animal_outs
where animal_outs.animal_id not in (select animal_ins.animal_id from animal_ins);
order by animal_ins.animal_id;
-- 있었는데요 없었습니다.
SELECT animal_ins.animal_id, animal_ins.name
from animal_ins, animal_outs
where animal_ins.animal_id = animal_outs.animal_id and animal_ins.datetime > animal_outs.datetime
order by animal_ins.datetime;
-- 오랜 기간 보호한 동물(1)
SELECT animal_ins.name, animal_ins.datetime
from animal_ins
where animal_ins.animal_id not in (select animal_outs.animal_id from animal_outs)
order by datetime
limit 3;
-- 다른방법 join
SELECT animal_ins.name, animal_ins.datetime
from animal_ins left outer join animal_outs
on animal_ins.animal_id = animal_outs.animal_id
where animal_outs.animal_id is null
order by animal_ins.datetime
limit 3;
-- 오랜 기간 보호한 동물(2)
SELECT i.animal_id, i.animal_type, i.name
from animal_ins i join animal_outs o
on i.animal_id = o.animal_id
where i.sex_upon_intake != o.sex_upon_outcome;
-- 보호소에서 중성화한 동물
SELECT animal_id, name, sex_upon_intake
from animal_ins
where name in ('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty');
파트 28. String, Date
-- ============== 파트 28. String, Date =============
-- ==================================================
-- 루시와 엘라 찾기
SELECT animal_id, name
from animal_ins
where name like '%el%' and animal_type = 'dog'
order by name;
-- 이름에 el이 들어가는 동물 찾기
SELECT animal_id, name
from animal_ins
where name like '%el%' and animal_type = 'dog'
order by name;
-- 중성화 여부 파악하기
-- (**like 따로 써줘야 하나봐)
SELECT animal_id, name, if(sex_upon_intake like 'Neutered%' or sex_upon_intake like 'Spayed%', 'O', 'X') as '중성화'
from animal_ins
order by animal_id;
-- 오랜 기간 보호한 동물
select m.animal_id, m.name
from ( select i.animal_id, i.name, o.datetime-i.datetime as term
from animal_ins i join animal_outs o
on i.animal_id = o.animal_id) m
order by m.term desc
limit 2;
-- 다른방법
select i.animal_id, i.name
from animal_ins i join animal_outs o
on i.animal_id = o.animal_id
order by o.datetime-i.datetime desc
limit 2;
-- DATETIME에서 DATE로 형 변환
SELECT animal_id, name, substring(datetime,1,10) as 날짜
from animal_ins
order by animal_id;
-- 다른방법
-- (**date_format)
SELECT animal_id, name, date_format(datetime, '%Y-%m-%d') as 날짜
from animal_ins
order by animal_id;
'Algorithm > Practice' 카테고리의 다른 글
프로그래머스 - 주식가격 (Python) (0) | 2021.03.30 |
---|---|
프로그래머스 - 다리를 지나는 트럭 (Python) (0) | 2021.03.30 |
백준 알고리즘 - 1339 단어 수학 (JAVA) (0) | 2020.11.29 |
백준 알고리즘 - 2309 일곱 난쟁이 (JAVA) (0) | 2020.11.29 |
프로그래머스 - 스택, 큐_탑 (JAVA) (0) | 2020.04.11 |