# 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');
17) 이름이 없는 동물의 아이디
동물 보호소에 들어온 동물 중, 이름이 없는 채로 들어온 동물의 ID를 조회(ID는 오름차순 정렬)
SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NULL
ORDER BY ANIMAL_ID ASC;
18) NULL 처리하기
동물의 생물 종, 이름, 성별 및 중성화 여부를 아이디 순으로 조회(이름이 없는 동물의 이름은 "No name"으로 표시)
SELECT ANIMAL_TYPE, IFNULL(NAME, 'No name'), SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC;
19) 없어진 기록 찾기
입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회
SELECT ANIMAL_OUTS.ANIMAL_ID, ANIMAL_OUTS.NAME
FROM ANIMAL_OUTS
LEFT JOIN ANIMAL_INS ON ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID
WHERE ANIMAL_INS.ANIMAL_ID IS NULL
ORDER BY ANIMAL_ID ASC;
20) 있었는데요 없었습니다
보호 시작일보다 입양일이 더 빠른 동물의 아이디와 이름을 조회(보호 시작일이 빠른 순으로 조회)
SELECT ANIMAL_INS.ANIMAL_ID, ANIMAL_INS.NAME
FROM ANIMAL_INS
LEFT JOIN ANIMAL_OUTS ON ANIMAL_OUTS.ANIMAL_ID = ANIMAL_INS.ANIMAL_ID
WHERE (ANIMAL_INS.DATETIME - ANIMAL_OUTS.DATETIME) > 0
ORDER BY ANIMAL_INS.DATETIME ASC;
21) 오랜 기간 보호한 동물(1)
아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일을 조회(보호 시작일 순으로 조회)
SELECT ANIMAL_INS.NAME, ANIMAL_INS.DATETIME
FROM ANIMAL_INS
LEFT JOIN ANIMAL_OUTS ON ANIMAL_OUTS.ANIMAL_ID = ANIMAL_INS.ANIMAL_ID
WHERE ANIMAL_OUTS.ANIMAL_ID IS NULL
ORDER BY ANIMAL_INS.DATETIME ASC
LIMIT 3;
22) 보호소에서 중성화한 동물
보호소에 들어올 당시에는 중성화1되지 않았지만, 보호소를 나갈 당시에는 중성화된 동물의 아이디와 생물 종, 이름을 조회(아이디 순으로 조회)
SELECT ANIMAL_INS.ANIMAL_ID, ANIMAL_INS.ANIMAL_TYPE, ANIMAL_INS.NAME
FROM ANIMAL_INS
JOIN ANIMAL_OUTS ON ANIMAL_OUTS.ANIMAL_ID = ANIMAL_INS.ANIMAL_ID
WHERE ANIMAL_INS.SEX_UPON_INTAKE LIKE '%Intact%'
AND (ANIMAL_OUTS.SEX_UPON_OUTCOME LIKE '%Spayed%' OR ANIMAL_OUTS.SEX_UPON_OUTCOME LIKE '%Neutered%')
ORDER BY ANIMAL_INS.ANIMAL_ID ASC;
23) 루시와 엘라 찾기
동물 보호소에 들어온 동물 중 이름이 Lucy, Ella, Pickle, Rogan, Sabrina, Mitty인 동물의 아이디와 이름, 성별 및 중성화 여부를 조회(아이디 순으로 조회)
SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME IN ("Lucy", "Ella", "Pickle", "Rogan", "Sabrina", "Mitty")
ORDER BY ANIMAL_ID ASC;
24) 이름에 el이 들어가는 동물 찾기
동물 보호소에 들어온 동물 이름 중, 이름에 "EL"이 들어가는 개의 아이디와 이름을 조회(이름 순으로 조회, 이름의 대소문자는 구분하지 않음)
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE NAME LIKE '%el%'
AND ANIMAL_TYPE LIKE 'Dog'
ORDER BY NAME ASC;
25) 중성화 여부 파악하기
동물의 아이디와 이름, 중성화 여부를 아이디 순으로 조회(중성화가 되어있다면 'O', 아니라면 'X'라고 표시)
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 ASC;
26) 오랜 기간 보호한 동물(2)
입양을 간 동물 중, 보호 기간이 가장 길었던 동물 두 마리의 아이디와 이름을 조회(보호 기간이 긴 순으로 조회)
SELECT ANIMAL_OUTS.ANIMAL_ID, ANIMAL_OUTS.NAME
FROM ANIMAL_OUTS
LEFT JOIN ANIMAL_INS ON ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID
ORDER BY ANIMAL_OUTS.DATETIME - ANIMAL_INS.DATETIME DESC
LIMIT 2;
27) DATETIME에서 DATE로 형 변환
ANIMAL_INS 테이블에 등록된 모든 레코드에 대해, 각 동물의 아이디와 이름, 들어온 날짜1를 조회(아이디 순으로 조회)
SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME, "%Y-%m-%d") AS "날짜"
FROM ANIMAL_INS
ORDER BY ANIMAL_ID ASC;
우유와 요거트가 담긴 장바구니
데이터 분석 팀에서는 우유(Milk)와 요거트(Yogurt)를 동시에 구입한 장바구니가 있는지 알아보려 합니다. 우유와 요거트를 동시에 구입한 장바구니의 아이디를 조회(장바구니의 아이디 순으로 조회)
SELECT CART_ID
FROM CART_PRODUCTS
WHERE CART_ID IN(
SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME = "Yogurt") AND NAME = "Milk"
ORDER BY CART_ID ASC;
헤비 유저가 소유한 장소
이 서비스에서는 공간을 둘 이상 등록한 사람을 "헤비 유저"라고 부릅니다. 헤비 유저가 등록한 공간의 정보를 아이디 순으로 조회
SELECT ID, NAME, HOST_ID
FROM PLACES
WHERE HOST_ID IN (
SELECT HOST_ID
FROM PLACES
GROUP BY HOST_ID
HAVING COUNT(HOST_ID) > 1
)
ORDER BY ID ASC;