프로그래머스 SQL 고득점 Kit 코드 총정리 (MySQL) : JOIN
JOIN
JOIN은 여러 테이블을 하나로 합칠 때 사용한다.
없어진 기록 찾기 (Level 3)
SELECT ANIMAL_ID, NAME
FROM ANIMAL_OUTS
WHERE ANIMAL_ID NOT IN (SELECT ANIMAL_ID FROM ANIMAL_INS)
JOIN을 사용하지 않고 서브쿼리를 사용해 쉽게 해결했다.
있었는데요 없었습니다 (Level 3)
SELECT ANIMAL_ID, I.NAME
FROM ANIMAL_INS I JOIN ANIMAL_OUTS O USING (ANIMAL_ID)
WHERE O.DATETIME < I.DATETIME
ORDER BY I.DATETIME
두 테이블 간 같은 컬럼이 있고 둘이 의미하는 바가 같고 그걸 기준으로 합치고 싶다면 USING을 사용하면 된다. 반드시 컬럼명은 괄호 안에 써야 한다.
ON I.ANIMAL_ID = O.ANIMAL_ID
대신 USING (ANIMAL_ID)
를 사용하는 것이고 둘은 똑같이 동작한다.
USING을 사용하는 편이 더 가독성이 좋다.
오랜 기간 보호한 동물(1) (Level 3)
SELECT I.NAME, I.DATETIME
FROM ANIMAL_INS I LEFT OUTER JOIN ANIMAL_OUTS O USING (ANIMAL_ID)
WHERE O.DATETIME IS NULL
ORDER BY I.DATETIME ASC
LIMIT 3
OUTER JOIN은 데이터의 소실 없이 테이블을 합치는 방법이다. 기본적으로는 매칭 안되는 튜플은 제거하는데 아우터 조인은 제거 대신에 데이터가 없는 튜플을 살리고 없는 곳에는 NULL을 대입한다. LEFT면 데이터를 버리지 않을 테이블이 왼쪽 테이블이고,RIGHT면 오른쪽이 기준이 되는 것이다.
이 문제는 입양을 못 간 동물을 구하는 문제였기 때문에 보호소에 들어온 동물 정보를 담은 ANIMAL_INS에만 해당 동물에 대한 정보가 있고 입양 보낸 동물 정보를 담은 ANIMAL_OUTS에는 정보가 없는 동물을 구하는 문제였다. 그냥 JOIN을 하게되면 USING (ANIMAL_ID)
에 의해서 양 테이블 둘 다 같은 ANIMAL_ID가 없는 튜플은 JOIN 연산 시 버려진다. 하지만 OUTER JOIN을 사용하게 되면 버려지지 않고 데이터가 없는 부분에 NULL을 채워 넣는 것이다.
보호소에서 중성화한 동물 (Level 4)
SELECT O.ANIMAL_ID, O.ANIMAL_TYPE, O.NAME
FROM ANIMAL_INS I JOIN ANIMAL_OUTS O USING (ANIMAL_ID)
WHERE I.SEX_UPON_INTAKE LIKE 'Intact%' AND (O.SEX_UPON_OUTCOME LIKE 'Spayed%' or O.SEX_UPON_OUTCOME LIKE 'Neutered%')
이 문제는 스트링(문자열) 연산을 알면 쉽게 풀리는 문제다. LIKE 다음에 찾고자 하는 문자열 패턴을 적으면 된다.
% 기호는 아무 부분 문자열에 대입된다. 길이가 0인 문자열도 포함이다.
_ 는 아무 한 글자에 대입 된다.
패턴은 case sensitive하니 주의하자!