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;