본문 바로가기
Problem Solving/Programmers

[ SQL 고득점 kit ] JOIN - mysql

by IM조이 2021. 6. 25.

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 보호소에서 중성화한 동물

다양한 풀이법이 있을 수 있는 문제

  1. 모든 케이스를 구하고, 값이 그 케이스 안에 있는지 확인
  2. LIKE를 활용해 겹치는 문자열이 있는지만 확인
  3. 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;

댓글