01 없어진 기록 찾기
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;
INS에는 있고 OUTS에는 없는 데이터이기때문에 INS를 기준으로 LEFT JOIN 사용
02 있었는데요 없었습니다
SELECT I.ANIMAL_ID, I.NAME
FROM ANIMAL_INS I
INNER JOIN ANIMAL_OUTS O
ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE I.DATETIME > O.DATETIME
ORDER BY I.DATETIME;
DATETIME 자체로 비교 가능하다는 점 기억
+ 어차피 둘 다 기록을 갖고 있는 케이스라서 INNER JOIN 써도 무방하다
03 오랜 기간 보호한 동물(1)
SELECT I.NAME, I.DATETIME
FROM ANIMAL_INS I
LEFT JOIN ANIMAL_OUTS O
ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE O.ANIMAL_ID IS NULL
ORDER BY I.DATETIME
LIMIT 3;
INS에는 있고, OUTS에는 없는 경우이기때문에 LEFT JOIN 걸고, NULL조건으로 한 번 더 걸러주는 문제
04 보호소에서 중성화한 동물
다양한 풀이법이 있을 수 있는 문제
- 모든 케이스를 구하고, 값이 그 케이스 안에 있는지 확인
- LIKE를 활용해 겹치는 문자열이 있는지만 확인
- LIKE를 활용하되, 코드 길이를 좀 더 줄일 수 있는 (통과는 되지만, 정확한 코드라 하기엔 어려움)
코드 1
SELECT I.ANIMAL_ID, I.ANIMAL_TYPE, I.NAME
FROM ANIMAL_INS I
INNER JOIN ANIMAL_OUTS O
ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE I.SEX_UPON_INTAKE IN ('Intact Male','Intact Female')
AND O.SEX_UPON_OUTCOME IN
('Spayed Male','Spayed Female','Neutered Male','Neutered Female')
ORDER BY I.ANIMAL_ID;
코드 2
SELECT I.ANIMAL_ID, I.ANIMAL_TYPE, I.NAME
FROM ANIMAL_INS I
INNER JOIN ANIMAL_OUTS O
ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE I.SEX_UPON_INTAKE LIKE 'Intact%'
AND (O.SEX_UPON_OUTCOME LIKE 'Spayed%' OR O.SEX_UPON_OUTCOME LIKE 'Neutered%')
ORDER BY I.ANIMAL_ID;
코드 3 - (만약 Intact, Neutered, Spayed 말고 다른 상태가 존재한다면 답이 틀릴 수 있는 코드)
SELECT I.ANIMAL_ID, I.ANIMAL_TYPE, I.NAME
FROM ANIMAL_INS I
LEFT JOIN ANIMAL_OUTS O
ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE I.SEX_UPON_INTAKE LIKE "%Intact%"
AND O.SEX_UPON_OUTCOME NOT LIKE "%Intact%"
ORDER BY I.ANIMAL_ID;
'Problem Solving > Programmers' 카테고리의 다른 글
[ SQL 고득점 kit ] String, Date - mysql (0) | 2021.06.26 |
---|---|
[ SQL 고득점 kit ] IS NULL - mysql (0) | 2021.06.23 |
[ SQL 고득점 kit ] GROUP BY - mysql (0) | 2021.06.22 |
[ SQL 고득점 kit ] SUM, MAX, MIN - mysql (0) | 2021.06.22 |
[ SQL 고득점 kit ] SELECT - mysql (0) | 2021.06.21 |
댓글