프로그래머스
1. SELECT
1) 모든 레코드 조회하기
SELECT * from ANIMAL_INS
order by ANIMAL_ID;
2) 역순 정렬하기
SELECT NAME, DATETIME from ANIMAL_INS
order by ANIMAL_ID desc
3) 아픈 동물 찾기
-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME
from ANIMAL_INS
where INTAKE_CONDITION = "Sick"
order by ANIMAL_ID;
4) 어린 동물 찾기
-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME
from ANIMAL_INS
where INTAKE_CONDITION != "Aged"
order by ANIMAL_ID;
5) 동물의 아이디와 이름
-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME
from ANIMAL_INS
order by ANIMAL_ID;
6) 여러 기준으로 정렬하기
-- 코드를 입력하세요
SELECT ANIMAL_ID, NAME, DATETIME
from ANIMAL_INS
order by NAME, DATETIME desc;
7) 상위 n개 레코드
-- 코드를 입력하세요
SELECT NAME
From ANIMAL_INS
ORDER BY DATETIME
LIMIT 1
-- ORACLE
/*
SELECT NAME
FROM (SELECT * FROM ANIMAL_INS ORDER BY DATETIME)
WHERE rownum = 1;
*/
2. SUM, MAX, MIN
1) 최댓값 구하기
SELECT MAX(DATETIME)
from ANIMAL_INS;
2) 최솟값 구하기
SELECT MIN(DATETIME)
from ANIMAL_INS;
3) 동물 수 구하기
SELECT COUNT(ANIMAL_ID)
from ANIMAL_INS;
4) 중복 제거하기
SELECT COUNT(DISTINCT NAME)
from ANIMAL_INS
where NAME != "NULL";
3. GROUP BY
1) 고양이와 개는 몇 마리 있을까
SELECT ANIMAL_TYPE, count(ANIMAL_TYPE)
from ANIMAL_INS
group by ANIMAL_TYPE
order by ANIMAL_TYPE;
2) 동명 동물 수 찾기
SELECT NAME, count(NAME)
from ANIMAL_INS
where NAME is not null
group by NAME
having count(NAME) >= 2
order by NAME;
3) 입양 시각 구하기(1)
SELECT hour(DATETIME) HOUR, count(DATETIME) COUNT
from ANIMAL_OUTS
group by hour(DATETIME)
having HOUR >= 9 and HOUR < 20
order by hour(DATETIME);
4) 입양 시각 구하기(2)
set @hour = -1;
SELECT (@hour := @hour + 1) as HOUR,
(select count(*) from ANIMAL_OUTS where @hour = hour(DATETIME))
from ANIMAL_OUTS
where @hour < 23;
4. IS NULL
1) 이름이 없는 동물의 아이디
SELECT ANIMAL_ID
from ANIMAL_INS
where NAME is null
order by ANIMAL_ID;
2) 이름이 있는 동물의 아이디
SELECT ANIMAL_ID
from ANIMAL_INS
where NAME is not null
order by ANIMAL_ID;
3) NULL 처리하기
SELECT ANIMAL_TYPE, ifnull(NAME, 'No name') as NAME, SEX_UPON_INTAKE
from ANIMAL_INS
order by ANIMAL_ID;
5. JOIN
1) 없어진 기록 찾기
SELECT B.ANIMAL_ID, B.NAME
from ANIMAL_INS A right join ANIMAL_OUTS B on A.ANIMAL_ID = B.ANIMAL_ID
where A.ANIMAL_ID is null;
2) 있었는데요 없었습니다
SELECT A.ANIMAL_ID, A.NAME
from ANIMAL_INS A join ANIMAL_OUTS B
where A.ANIMAL_ID = B.ANIMAL_ID and B.DATETIME <= A.DATETIME
order by A.DATETIME
3) 오랜 기간 보호한 동물(1)
SELECT A.NAME, A.DATETIME
from ANIMAL_INS A left join ANIMAL_OUTS B on A.ANIMAL_ID = B.ANIMAL_ID
where B.ANIMAL_ID is null
order by A.DATETIME
limit 3;
4) 보호소에서 중성화한 동물
SELECT A.ANIMAL_ID, A.ANIMAL_TYPE, A.NAME
from ANIMAL_INS A join ANIMAL_OUTS B on A.ANIMAL_ID = B.ANIMAL_ID
where A.SEX_UPON_INTAKE != B.SEX_UPON_OUTCOME
order by A.ANIMAL_ID;
6. String, Date
1) 루시와 엘라 찾기
SELECT distinct ANIMAL_ID, NAME, SEX_UPON_INTAKE
from ANIMAL_INS
where NAME in ("Lucy", "Ella", "Pickle", "Rogan", "Sabrina", "Mitty")
order by ANIMAL_ID;
2) 이름에 el이 들어가는 동물 찾기
SELECT ANIMAL_ID, NAME
from ANIMAL_INS
where NAME like "%el%" and ANIMAL_TYPE = "Dog"
order by NAME;
3) 중성화 여부 파악하기
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;
4) 오랜 기간 보호한 동물(2)
SELECT A.ANIMAL_ID, A.NAME
from ANIMAL_INS A, ANIMAL_OUTS B
where A.ANIMAL_ID = B.ANIMAL_ID
order by B.DATETIME - A.DATETIME desc
limit 2;
5) DATETIME에서 DATE로 형 변환
SELECT ANIMAL_ID, NAME, date_format(DATETIME, '%Y-%m-%d') as 날짜
from ANIMAL_INS
order by ANIMAL_ID;