오랜기간 보호한 동물(1)
ANIMAL_INS
와 ANIMAL_OUTS
를 LEFT JOIN
시켜 NULL값을 가진 행만 찾아낸다.
SELECT A.NAME, A.DATETIME
FROM ANIMAL_INS A
LEFT JOIN ANIMAL_OUTS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE B.ANIMAL_ID IS NULL
ORDER BY A.DATETIME
LIMIT 3
;
오랜기간 보호한 동물(2)
가장 보호기간이 길다는 것은 나간날짜-들어온날짜가 가장 크다는 것을 의미한다.
SELECT INS.ANIMAL_ID, INS.NAME
FROM ANIMAL_INS INS
JOIN ANIMAL_OUTS OUTS
ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
ORDER BY (OUTS.DATETIME-INS.DATETIME) DESC
LIMIT 2
;
보호소에서 중성화한 동물
SELECT A.ANIMAL_ID, A.ANIMAL_TYPE, A.NAME
FROM ANIMAL_INS A
JOIN ANIMAL_OUTS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE A.SEX_UPON_INTAKE LIKE 'Intact%' AND (B.SEX_UPON_OUTCOME LIKE 'Spayed%' OR B.SEX_UPON_OUTCOME LIKE 'Neutered%')
ORDER BY A.ANIMAL_ID;
WHERE 조건을 A와 B의 중성화 데이터가 다른 것으로 주어, 중성화된 동물 데이터를 찾아내었다. 두 테이블의 값이 다르다는 것은, 들어올때는 중성화가 되어있지 않았지만 나갈때에는 중성화가 되었다는 것을 의미한다. (이미 중성화가 된 채로 들어왔다면 나갈때에도 중성화가 되어있으므로 변하지 않음)
SELECT A.ANIMAL_ID, A.ANIMAL_TYPE, A.NAME
FROM ANIMAL_INS A
JOIN ANIMAL_OUTS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE A.SEX_UPON_INTAKE != B.SEX_UPON_OUTCOME
ORDER BY A.ANIMAL_ID;
있었는데요 없었습니다
보호 시작일(ANIMAL_INS.DATETIME)보다 입양일(ANIMAL_OUTS.DATETIME)이 더 빠른(더 오래된) 동물의 데이터를 조회해야한다.
어떤 날짜를 크기비교하면, 1970년 1월 1일부터 해당 날짜까지의 차를 밀리세컨드로 구한 값을 비교한다. 따라서 ANIMAL_INS.DATETIME>ANIMAL_OUTS.DATETIME
은 ANIMAL_INS.DATETIME
이 더 최근 날짜이므로, getTime
을 했을때 더 값이 크다는 것을 의미한다.
SELECT A.ANIMAL_ID, A.NAME
FROM ANIMAL_INS A
JOIN ANIMAL_OUTS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE A.DATETIME>B.DATETIME
ORDER BY A.DATETIME
;
없어진 기록 찾기
- Left Join, Right Join
- https://programmers.co.kr/learn/courses/30/lessons/59042
Left Join과 Right Join은 기능이 동일하므로, 테이블 작성 순서만 변경해주면 된다.
A LEFT JOIN B === B RIGHT JOIN A
//Left Join
SELECT OUTS.ANIMAL_ID, OUTS.NAME
FROM ANIMAL_OUTS OUTS
LEFT JOIN ANIMAL_INS INS
ON OUTS.ANIMAL_ID = INS.ANIMAL_ID
WHERE INS.ANIMAL_ID IS NULL
ORDER BY OUTS.ANIMAL_ID;
//Right Join
SELECT OUTS.ANIMAL_ID, OUTS.NAME
FROM ANIMAL_INS INS
RIGHT JOIN ANIMAL_OUTS OUTS
ON OUTS.ANIMAL_ID = INS.ANIMAL_ID
WHERE INS.ANIMAL_ID IS NULL
ORDER BY OUTS.ANIMAL_ID;
헤비 유저가 소유한 장소
SELECT *
FROM PLACES
WHERE HOST_ID IN (
SELECT HOST_ID
FROM PLACES
GROUP BY HOST_ID
HAVING COUNT(HOST_ID) > 1
)
ORDER BY ID
;
SELECT * FROM PLACES P1
WHERE EXISTS (
SELECT 1 FROM PLACES P2
WHERE P1.HOST_ID = P2.HOST_ID
GROUP BY HOST_ID
HAVING COUNT(ID) > 1
)
ORDER BY ID
;
EXISTS
IN
WHERE name IN (null, 'hello')
인 경우를 풀어쓰면 다음과 같다. WHERE name = null OR name = 'hello'
null값은 IS NULL
로 비교되어야하는데 등호로 비교되고 있으므로 false가 나오게 되어 name='hello'
인 것들로만 필터링된다. NOT IN의 경우도 마찬가지이다. WHERE name NOT IN (null, 'hello')
를 풀어쓰면 WHERE name != null AND name !='hello'
이다. null값은 IS NOT NULL
로 비교되어야하므로 false를 반환하여 empty row를 반환한다.