[SQL] 프로그래머스 SQL > JOIN
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가 포함되어있는 것을 조회하면 된다.