SQL고득점 - IS NULL

2020-04-05

위 문제는 프로그래머스 사이트의 IS NULL 문제에 관한 설명입니다.


LEFT JOIN

A, B 테이블 중에

A값의 전체와, A의 KEY 값과 B KEY 값이 같은 결과를 리턴

WHERE B.KEY is NULL을 사용한다면 A와 B가 겹치는 부분은 제외한 순수 A 부분만을 리턴

RIGHT JOIN

A, B 테이블 중에

B값의 전체와, A의 KEY 값과 B KEY 값이 같은 결과를 리턴

WHERE A.KEY is NULL을 사용한다면 A와 B가 겹치는 부분은 제외한 순수 A 부분만을 리턴

INNDER JOIN

A, B 테이블 중에

A의 KEY 값과 B의 KEY 값이 같은 결과를 리턴

FULLOUTER JOIN

A, B테이블에 있는 모든 값들을 리턴

WHERE A.KEY is NULL 또는 WHERE B.KEY is NULL을 사용한다면
A와 B가 겹치는 부분은 제외한 순수 A와 순수 B의 합으로 리턴

문제

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다.

ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME,

SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다.

ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는

각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다.

ANIMAL_OUTS 테이블의 ANIMAL_ID는 ANIMAL_INS의 ANIMAL_ID의 외래 키입니다.

없어진 기록 찾기

천재지변으로 인해 일부 데이터가 유실되었습니다.

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

SELECT A.ANIMAL_ID, A.NAME
FROM ANIMAL_OUTS A LEFT JOIN ANIMAL_INS B ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE B.ANIMAL_ID IS NULL;

ANIMAL_OUTS 테이블(A)를 ANIMAL_INS테이블 (B)와 LEFT JOIN을 합니다.

여기서 A와 B에 있는 ID가 같은 동물을 선정하는데

B 테이블에 있는 값을 제외한 순수 A에 대한 값에서 ID와 이름을 출력하고자 했습니다.

있었는데요 없었습니다

관리자의 실수로 일부 동물의 입양일이 잘못 입력되었습니다.

보호 시작일보다 입양일이 더 빠른 동물의 아이디와 이름을 조회하는 SQL문을 작성해주세요.

이때 결과는 보호 시작일이 빠른 순으로 조회해야합니다.

SELECT A.ANIMAL_ID, A.NAME
FROM ANIMAL_INS A, ANIMAL_OUTS B
WHERE A.DATETIME > B.DATETIME
AND A.ANIMAL_ID = B.ANIMAL_ID
ORDER BY A.DATETIME;

ANIMAL_INS테이블(A)를 ANIMAL_OUTS테이블 (B)에서 보호 시작일보다 입양일이 더 빠르다는 조건을 위해

WHERE 조건문을 사용했고, ID값이 같아야합니다.

보호 시작일이 빠른 순으로 조회해야하기에 ORDER BY를 사용합니다.

오랜 기간 보호한 동물(1)

아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요.

이때 결과는 보호 시작일 순으로 조회해야 합니다.

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;

ANIMAL_OUTS 테이블(A)를 ANIMAL_INS테이블 (B)와 LEFT JOIN을 합니다.

그리고 ID 값이 같은지 판단하면서 B의 값을 제거(입양을 간 동물을 제거하기 위해)합니다.

보호시작일 순으로 정렬하고 LIMIT를 3으로 둬서 3마리를 리턴합니다.

보호소에서 중성화한 동물

보호소에서 중성화 수술을 거친 동물 정보를 알아보려 합니다.

보호소에 들어올 당시에는 중성화되지 않았지만, 보호소를 나갈 당시에는 중성화된 동물의 아이디와 생물 종,

이름을 조회하는 아이디 순으로 조회하는 SQL 문을 작성해주세요.

SELECT B.ANIMAL_ID, B.ANIMAL_TYPE, B.NAME
 FROM ANIMAL_INS A
 RIGHT JOIN ANIMAL_OUTS B 
 ON A.ANIMAL_ID = B.ANIMAL_ID
 WHERE A.SEX_UPON_INTAKE <> B.SEX_UPON_OUTCOME
 ORDER BY ANIMAL_ID;

RIGHT JOIN을 사용했습니다.(다양하게 시도하기 위해서)

A.SEX_UPON_INTAKE <> B.SEX_UPON_OUTCOME는 서로 값이 다른지 확인하기 위해서입니다.

다르다면 중성화 되지 않았다가 중성화가 되었다는 것으로 볼 수 있습니다.

SELECT A.ANIMAL_ID, A.ANIMAL_TYPE, A.NAME 
FROM ANIMAL_INS A, ANIMAL_OUTS B 
WHERE A.ANIMAL_ID = B.ANIMAL_ID 
AND A.SEX_UPON_INTAKE LIKE 'Intact%' 
AND ( B.SEX_UPON_OUTCOME 
LIKE 'Spayed Female' OR B.SEX_UPON_OUTCOME 
LIKE 'Neutered Male' ) 
ORDER BY A.ANIMAL_ID

출처: https://murra.tistory.com/142 [Murra Blog]

다른 분이 풀어낸 문제입니다.

LIKE ‘% - %’는 문자열에 ‘ - ‘이 포함되어 있는지 확인합니다.

프로그래머스 SQL 고득점 중 가장 어려웠습니다.

이제 단계는 1단계 남았습니다. 끝까지 가 봅시다.

프로그래머스 - JOIN