** 1. 동물의 아이디와 이름 -> SELECT ANIMAL_INS.ANIMAL_ID, ANIMAL_INS.NAME

 

** 2. 병합을 위해, 조건에 있는 'ANIMAL_OUTS 테이블의 ANIMAL_ID ANIMAL_INS ANIMAL_ID의 외래 키입니다.'를 사용한다 -> FROM ANIMAL_INS LEFT JOIN ANIMAL_OUTS ON ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID

 

** 3. 입양일이 보호 시작일 보다 빠른 -> WHERE ANIMAL_INS.DATETIME > ANIMAL_OUTS.DATETIME

 

** 4. 보호 시작일이 빠른 순으로 조회 -> ORDER BY ANIMAL_INS

1
2
3
4
5
-- 있었는데요 없었습니다
SELECT I.ANIMAL_ID, I.NAME 
FROM ANIMAL_INS I LEFT JOIN ANIMAL_OUTS O ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE I.DATETIME > O.DATETIME 
ORDER BY I.DATETIME ASC
cs

입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문을 작성해주세요.

=> ANIMAL_OUTS 테이블과 ANIMAL_INS 테이블을 LEFT JOIN 한 다음 이 중에 IN테이블의 Name이 null인 값을 검색하면 된다.

 

조인을 하면 ANIMAL_INS의 유실된 내용이 null로 들어오기 때문에 where 조건문에 is null로 해결.

1
2
3
4
5
-- 없어진 기록 찾기
SELECT O.ANIMAL_ID, O.NAME
FROM ANIMAL_OUTS O LEFT JOIN ANIMAL_INS I ON O.ANIMAL_ID = I.ANIMAL_ID
WHERE I.ANIMAL_ID IS NULL
ORDER BY O.ANIMAL_ID
cs

IFNULL은 해당 필드의 값이 NULL일 때 다른 값으로 출력할 수 있도록 하는 함수이다.

==> SELECT IFNULL(필드명, "대체할값") FROM 테이블명;

 

-- NULL 처리하기 SELECT ANIMAL_TYPE, IFNULL(NAME, "No name") AS NAME, SEX_UPON_INTAKE FROM ANIMAL_INS ORDER BY ANIMAL_ID

is NOT NULL을 사용하면 된다.

1
2
-- 이름이 있는 동물의 아이디
SELECT ANIMAL_ID FROM ANIMAL_INS WHERE NAME IS NOT NULL
cs

1
2
-- 이름이 없는 동물의 아이디
SELECT ANIMAL_ID FROM ANIMAL_INS WHERE NAME IS NULL
cs

# 변수 선언을 통해 해결하는 방법

1
2
3
4
5
6
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 < 23
cs

 

hour(time) - 시간을 알려준다.(0 ~ 23) 

hour, WHERE을 활용하여 해결하면 되는 문제.

1
2
3
4
5
-- 입양 시각 구하기(1)
SELECT HOUR(DATETIME) AS HOUR , COUNT(DATETIME) AS COUNT
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME)>=9 AND HOUR(DATETIME)<=19
GROUP BY HOUR 
cs

# GROUP BY 절에서 조건을 주려면 WHERE가 아닌, HAVING 절을 사용해야 합니다. SELECT 실행 순서를 보면, WHERE 절이 GROUP BY 보다 먼저 실행되기 때문에, GROUP BY에 대응되는 HAVING절이 있습니다.

  •  
  • SELECT 수행 순서는 아래와 같습니다.
    1. FROM
    2. WHERE
    3. GROUP BY
    4. HAVING
    5. ORDER BY
    6. SELECT
    7. LIMIT

 

HAVING 은 GROUP BY 뒤에 작성하며, WHERE와 동일한 형식으로 조건절을 작성할 수 있습니다.

 

1
2
-- 동명 동물 수 찾기
SELECT NAME, COUNT(NAME) AS COUNT FROM ANIMAL_INS GROUP BY NAME HAVING COUNT(NAME) >= 2
cs

+ Recent posts