언어 공부/SQL

[SQL] 프로그래머스 SQL > JOIN

수기 2022. 4. 5. 12:26

https://programmers.co.kr/learn/courses/30/parts/17046

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

LEFT JOIN (= LEFT OUTER JOIN) 과 같음

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

➡️ A값만 구하고 싶을 때는 WHERE B.Key IS NULL; 추가

 

RIGHT JOIN (= RIGHT OUTER JOIN) 과 같음

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

➡️ B값만 구하고 싶을 때는 WHERE A.Key IS NULL; 추가

 

INNER JOIN

➡️ A와 B의 교집합 리턴

 

FULL OUTER JOIN

➡️ A와 B의 합집합(전체) 리턴

➡️ 교집합을 제외하고 싶은 경우 WHERE A.key IS NULL OR B.key IS NULL; 추가

 


JOIN > 없어진 기록 찾기

01. LEFT JOIN

SELECT OUTS.ANIMAL_ID, OUTS.NAME 
FROM ANIMAL_OUTS OUTS LEFT OUTER JOIN  ANIMAL_INS INS 
ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
WHERE INS.ANIMAL_ID IS NULL
ORDER BY ANIMAL_ID

02. RIGHT JOIN (LEFT와 RIGHT와 ANIMAL_INS ANIMAL_OUTS 자리만 바뀜)

SELECT OUTS.ANIMAL_ID, OUTS.NAME 
FROM ANIMAL_INS INS RIGHT OUTER JOIN ANIMAL_OUTS OUTS
ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
WHERE INS.ANIMAL_ID IS NULL
ORDER BY ANIMAL_ID

 

JOIN > 있었는데요 없었습니다

SELECT INS.ANIMAL_ID, INS.NAME 
FROM ANIMAL_INS INS LEFT OUTER JOIN ANIMAL_OUTS OUTS
ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
WHERE INS.DATETIME > OUTS.DATETIME
ORDER BY INS.DATETIME

 

JOIN > 오랜 기간 보호한 동물

MYSQL

SELECT INS.NAME, INS.DATETIME
FROM ANIMAL_INS INS LEFT OUTER JOIN ANIMAL_OUTS OUTS
ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
WHERE OUTS.ANIMAL_ID IS NULL
ORDER BY DATETIME ASC
LIMIT 3

ANIMAL_INS는 보호소 정보가 담긴 테이블,

ANIMAL_OUTS는 입양 정보가 담긴 테이블

아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리 

이므로 OUTS 테이블에 없는 (NULL)인 것을 조회,

DATETIME이 가장 작은 (오래된, 예전 날짜) 순대로 3번째까지 조회

 

Oracle 

SELECT * FROM(
SELECT INS.NAME, INS.DATETIME
FROM ANIMAL_INS INS LEFT OUTER JOIN ANIMAL_OUTS OUTS
ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
WHERE OUTS.ANIMAL_ID IS NULL
ORDER BY INS.DATETIME )
WHERE ROWNUM <= 3

MYSQL로 구현한 것을 괄호로 묶고,SELECT* FROM (... ) 으로 표현 후 LIMIT가 아닌 WHERE ROWNUM <= 3으로 표현함.

 

 

JOIN > 보호소에서 중성화한 동물

SELECT INS.ANIMAL_ID, INS.ANIMAL_TYPE, INS.NAME
FROM ANIMAL_INS INS LEFT OUTER JOIN ANIMAL_OUTS OUTS
ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
WHERE INS.SEX_UPON_INTAKE LIKE '%Intact%' AND (OUTS.SEX_UPON_OUTCOME LIKE '%Spayed%' OR OUTS.SEX_UPON_OUTCOME LIKE '%Neutered%') 
ORDER BY INS.ANIMAL_ID

LEFT JOIN과 RIGHT JOIN, INNER JOIN 등 의 결과값이 같음.

ANIMAL_INS는 보호소 정보가 담긴 테이블,

ANIMAL_OUTS는 입양 정보가 담긴 테이블

보호소에서는 중성화가 되지 않았지만, 입양 된 후 (보호소에서 나간 후) 중성화가 된 동물 조회

중성화가 되지 않았으면 Intact가 포함, 중성화가 되었으면 Spayed나 Neutered 단어가 포함됨.

 

✨ INS.SEX_UPON_INTAKE 에서 Intact가 포함되어있으면서, 

OUTS.SEX_UPON_OUTCOME 에서 Spayed 또는 Neutered가 포함되어있는 것을 조회하면 된다.