GROUPBY
고양이와 개는 몇마리 있을까
select animal_type, count(*) as "count"
from animal_ins
group by animal_type
order by animal_type;
동명 동물 수 찾기
select name, count(*) as "count"
from animal_ins
group by name
having name is not null and count(*) >=2
order by name;
입양 시각 구하기 1
select hour(datetime) as "hour", count(*) as "count"
from animal_outs
group by hour(datetime)
having hour >= 9 and hour < 20
order by hour(datetime);
입양 시각 구하기 2
set @hour_list = -1;
select (@hour_list := @hour_list + 1) as "hour",
(select count(*) from animal_outs where hour(datetime) = @hour_list ) as "count"
from animal_outs
where @hour_list <=22
order by hour;
JOIN
보호소에서 중성화한 동물
SELECT INS.ANIMAL_ID, INS.ANIMAL_TYPE, INS.NAME
FROM ANIMAL_INS AS INS
LEFT OUTER JOIN ANIMAL_OUTS AS OUTS
ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
-- INS가 Intact였다가 OUT에선 Intact가 아닌 동물 추출
WHERE INS.SEX_UPON_INTAKE LIKE ("Intact%") AND OUTS.SEX_UPON_OUTCOME NOT LIKE ("Intact%")
-- WHERE INS.SEX_UPON_INTAKE != OUTS.SEX_UPON_OUTCOME
-- ANIMAL_ID 별로 정렬
ORDER BY INS.ANIMAL_ID;
없어진 기록 찾기
SELECT OUTS.ANIMAL_ID, OUTS.NAME -- OUTS의 ANIMAL_ID, NAME 조회
FROM ANIMAL_OUTS AS OUTS
LEFT OUTER JOIN ANIMAL_INS AS INS
ON OUTS.ANIMAL_ID = INS.ANIMAL_ID
WHERE INS.ANIMAL_ID IS NULL; -- INS.ANIMAL_ID가 NULL인 경우 제외
오랜 기간 보호한 동물 1
-- 전체 동물 중 입양된 동물은 OUTS에만 기록돼 있음.
SELECT INS.NAME, INS.DATETIME
FROM ANIMAL_INS AS INS
LEFT OUTER JOIN ANIMAL_OUTS AS OUTS
ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
WHERE OUTS.ANIMAL_ID IS NULL
ORDER BY INS.DATETIME
LIMIT 3; -- 3마리 제한. LIMIT 0, 3와 LIMIT 3 OFFSET 0와 동일
있었는데요 없었습니다
SELECT INS.ANIMAL_ID, INS.NAME -- 아이디, 이름 조회
FROM ANIMAL_INS AS INS
INNER JOIN ANIMAL_OUTS AS OUTS
ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
WHERE INS.DATETIME > OUTS.DATETIME -- 만약 입양 시간보다 보호소 도착 시간이 더 빠른 경우
ORDER BY INS.DATETIME ; -- 이때 정렬은 보호소 도착 시간에 따라서
NULL
NULL 처리하기
SELECT ANIMAL_TYPE, IF(ISNULL(NAME),"No name", NAME) AS NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;
이름이 없는 동물의 아이디
SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NULL
ORDER BY ANIMAL_ID;
이름이 있는 동물의 아이디
SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
ORDER BY ANIMAL_ID;
SELECT
동물의 아이디와 이름
SELECT animal_id, name
from animal_ins
order by animal_id;
모든 레코드 조회하기
select *
from animal_ins
order by animal_id;
상위 N개 레코드
select name
from animal_ins
order by datetime
limit 1;
아픈 동물 찾기
select animal_id, name
from animal_ins
where intake_condition = "sick"
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 asc, datetime desc;
역순 정렬하기
SELECT name, datetime
from animal_ins
order by animal_id desc;
STRING/DATE
DATETIME에서 DATE로 형변환
SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME, "%Y-%m-%d") AS "날짜" -- DATE_FORMAT 함수
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;
루시와 엘라 찾기
SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME IN ("Lucy", "Ella", "Pickle", "Rogan", "Sabrina", "Mitty"); -- IN에 여러 조건 넣을 수 있음.
오랜 기간 보호한 동물
SELECT OUTS.ANIMAL_ID, OUTS.NAME -- ID, 이름 조회
FROM ANIMAL_OUTS AS OUTS
INNER JOIN ANIMAL_INS AS INS -- 둘다 있는 경우만 조회하므로 INNER JOIN
ON OUTS.ANIMAL_ID = INS.ANIMAL_ID
ORDER BY (OUTS.DATETIME - INS.DATETIME) DESC -- 내림차순으로
LIMIT 2; -- 2개만
이름에 EL이 들어가는 동물 찾기
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE ANIMAL_TYPE = "Dog" AND NAME LIKE ("%EL%") -- %를 양쪽에 다 적용 가능.
ORDER BY NAME;
중성화 여부 파악하기
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;
SUM/MAX/MIN
동물 수 구하기
select count(*) as "count"
from animal_ins;
중복 제거하기
select count(distinct(name)) as "count"
from animal_ins
where name is not null;
최댓값 구하기
select max(datetime) as "시간"
from animal_ins;
최솟값 구하기
select min(datetime) as "시간"
from animal_ins;