# SQL문
CREATE DATABASE `ANIMAL`;
USE `ANIMAL`;
CREATE TABLE `ANIMAL_INS` (`ANIMAL_ID` varchar(20) NOT NULL, `ANIMAL_TYPE` varchar(20) NOT NULL, `DATETIME` datetime NOT NULL, `INTAKE_CONDITION` varchar(20) NOT NULL, `NAME` varchar(20) NULL, `SEX_UPON_INTAKE` varchar(20) NOT NULL);
INSERT INTO `ANIMAL_INS` VALUES ('A349996', 'Cat', '2018-01-22 14:32:00', 'Normal', 'Sugar', 'Neutered Male');
INSERT INTO `ANIMAL_INS` VALUES ('A350276', 'Cat', '2017-08-13 13:50:00', 'Normal', 'Jewel', 'Spayed Female');
INSERT INTO `ANIMAL_INS` VALUES ('A350375', 'Cat', '2017-03-06 15:01:00', 'Normal', 'Meo', 'Neutered Male');
INSERT INTO `ANIMAL_INS` VALUES ('A352555', 'Dog', '2014-08-08 04:20:00', 'Normal', 'Harley', 'Spayed Female');
1) 모든 레코드 조회하기
동물 보호소에 들어온 모든 동물의 정보를 ANIMAL_ID순으로 조회
SELECT *
FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC;
2) 역순 정렬하기
동물 보호소에 들어온 모든 동물의 이름과 보호 시작일을 ANIMAL_ID 역순으로 조회
SELECT NAME, DATETIME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID DESC;
3) 아픈 동물 찾기
동물 보호소에 들어온 동물 중 아픈 동물1의 아이디와 이름을 아이디 순으로 조회
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
ORDER INTAKE_CONDITION LIKE '%Sick%';
4) 어린 동물 찾기
동물 보호소에 들어온 동물 중 젊은 동물1의 아이디와 이름을 아이디 순으로 조회
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION !='Aged'
ORDER BY ANIMAL_ID;
5) 동물의 아이디와 이름
동물 보호소에 들어온 모든 동물의 아이디와 이름을 ANIMAL_ID순으로 조회
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;
6) 여러 기준으로 정렬하기
동물 보호소에 들어온 모든 동물의 아이디와 이름, 보호 시작일을 이름 순으로 조회(단, 이름이 같은 동물 중에서는 보호를 나중에 시작한 동물을 먼저 보여줘야 함)
SELECT ANIMAL_ID, NAME, DATETIME
FROM ANIMAL_INS
ORDER BY NAME ASC, DATETIME DESC;
7) 상위 n개 레코드
동물 보호소에 가장 먼저 들어온 동물의 이름을 조회
SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME ASC
LIMIT 1;
8) 최댓값 구하기
가장 최근에 들어온 동물은 언제 들어왔는지 조회
SELECT DATETIME AS '시간'
FROM ANIMAL_INS
ORDER BY DATETIME DESC
LIMIT 1;
9) 최솟값 구하기
동물 보호소에 가장 먼저 들어온 동물은 언제 들어왔는지 조회
SELECT DATETIME AS '시간'
FROM ANIMAL_INS
ORDER BY DATETIME ASC
LIMIT 1;
10) 동물 수 구하기
동물 보호소에 동물이 몇 마리 들어왔는지 조회
SELECT COUNT(ANIMAL_ID) AS 'count'
FROM ANIMAL_INS;
11) 중복 제거하기
동물 보호소에 들어온 동물의 이름은 몇 개인지 조회(이름이 NULL인 경우는 집계하지 않으며 중복되는 이름은 한번만 계산)
SELECT COUNT(DISTINCT NAME) AS 'COUNT'
FROM ANIMAL_INS;
12) 고양이와 개는 몇 마리 있을까
동물 보호소에 들어온 동물 중 고양이와 개가 각각 몇 마리인지 조회(고양이를 개보다 먼저 조회)
SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE)
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE ASC;
13) 고양이와 개는 몇 마리 있을까
동물 보호소에 들어온 동물 중 고양이와 개가 각각 몇 마리인지 조회(고양이를 개보다 먼저 조회)
SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE)
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE ASC;
14) 동명 동물 수 찾기
동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회(이름이 없는 동물은 집계에서 제외하며, 결과는 이름 순으로 조회)
SELECT NAME, COUNT(NAME) AS 'COUNT'
FROM ANIMAL_INS
GROUP BY NAME
HAVING COUNT(NAME) >=2
ORDER BY NAME ASC;
15) 입양 시각 구하기(1)
보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회(시간대 순으로 정렬)
SELECT HOUR(DATETIME) AS 'HOUR', COUNT(ANIMAL_ID) AS 'COUNT'
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) BETWEEN 9 AND 20
GROUP BY HOUR(DATETIME)
ORDER BY HOUR(DATETIME) ASC;
16) 입양 시각 구하기(2)
보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회(시간대 순으로 정렬)
WITH RECURSIVE TIME AS(
SELECT 0 AS HOUR
UNION ALL
SELECT HOUR+1
FROM TIME
WHERE HOUR < 23)
SELECT HOUR, COUNT(HOUR(DATETIME)) AS 'COUNT'
FROM TIME
LEFT OUTER JOIN ANIMAL_OUTS ON (HOUR = HOUR(DATETIME))
GROUP BY HOUR;