본문 바로가기

Algorithm/Practice

프로그래머스 - 고득점 SQL Kit

프로그래머스에서 제공하는 SQL 문제 모음을 풀이하였습니다. 풀이한 고득점 SQL Kit 해답을 공유합니다.

 

코딩테스트 연습

기초부터 차근차근, 직접 코드를 작성해 보세요.

programmers.co.kr

 

 파트 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;