깡뇽

[프로그래머스] SQL High Score Kit - JOIN 본문

Computer Language/SQL

[프로그래머스] SQL High Score Kit - JOIN

깡뇽 2022. 3. 3. 00:36
반응형

여러 테이블을 연결해서 데이터를 추출하고자 한다면 JOIN을 사용해야 한다.

레코드를 조합하는 방식에 따라 아래와 같이 구분된다.

☆ INNER JOIN : ON 절의 만족하는 데이터만 추출

LEFT JOIN : 첫 번째 테이블이 기준이 되어 두 번째 테이블을 조합(ON 절의 조건에 만족하지 않으면 첫 번째 테이블의 필드 값은 그대로 가져오지만 해당 레코드의 두 번째 필드 값은 모두 NULL로 표시)

RIGHT JOIN : 두 번째 테이블이 기준이 되어 첫 번째 테이블을 조합(ON 절의 조건에 만족하지 않으면 두 번째 테이블의 필드 값은 그대로 가져오지만 해당 레코드의 첫 번째 필드 값은 모두 NULL로 표시) 

 

 

없어진 기록 찾기

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

ANIMAL_OUTS에 ANIMAL_INS를 조합하는데 각 테이블의 ANIMAL_ID가 같으면 ANIMAL_OUTS의 필드값을 가져오고 그렇지 않다면 NULL로 표시한다. 정보가 유실되면 ANIMAL_ID가 같지 못하므로 NULL이 되므로 ANIMAL_INS의 ANIMAL_ID가 NULL인 데이터를 유실된 것으로 간주하여 추출한다.

A LEFT JOIN B : A에 B를 조합하는 경우, A만 가지는 정보

 

있었는데요 없었습니다

SELECT OUTS.ANIMAL_ID, OUTS.NAME FROM ANIMAL_OUTS AS OUTS 
INNER JOIN ANIMAL_INS AS INS ON OUTS.ANIMAL_ID = INS.ANIMAL_ID 
WHERE OUTS.DATETIME < INS.DATETIME 
ORDER BY INS.DATETIME;

ANIMAL_OUTS 테이블에 ANIMAL_INS 테이블 레코드를 조합하는데 ANIMAL_ID를 동일한 경우 즉, ANIMAL_OUTS와 ANIMAL_INS 테이블에 동일하게 정보가 존재하는 동물들만을 고려한다. 이때 보호 시작 일(INS.DATETIME)이 입양일(OUTS.DATETIME)보다 빨라야(<)하는데 그 반대로 잘못 입력된 경우를 추출해야 하므로 WHERE 절은 OUTS.DATETIME이 INS.DATETIME보다 작다는 것이 조건이 된다. 

A INNER JOIN B : A에 B를 조합하는 경우, A와 B가 동시에 갖는 정보 (교집합)

 

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

SELECT INS.NAME, INS.DATETIME FROM ANIMAL_OUTS AS OUTS 
RIGHT JOIN ANIMAL_INS AS INS 
ON OUTS.ANIMAL_ID = INS.ANIMAL_ID 
WHERE OUTS.ANIMAL_ID IS NULL 
ORDER BY INS.DATETIME 
LIMIT 3;

ANIMAL_OUTS 테이블과 ANIMAL_INS 테이블을 조합하는데 입양을 가지 못한 동물의 ANIMAL_ID는 ANIMAL_INS에는 보호 시작일 정보와 함께 있지만 ANIMAL_OUTS에는 없을 것이다. 그러므로 ANIMAL_OUTS의 ANIMAL_ID가 NULL이 되어 ANIMAL_INS에만 있는 동물의 이름(INS.NAME)과 보호 시작일(INS.DATETIME)을 추출한다. 주의할 점은 보호 시작일이 오래된 동물 중 3마리를 추출해야하므로 LIMIT을 활용한다.

A RIGHT JOIN B : A에 B를 조합하는 경우, B만 가지는 정보

LIMIT 숫자 :  자료 개수를 제한

 

 

보호소에서 중성화한 동물

SELECT OUTS.ANIMAL_ID, OUTS.ANIMAL_TYPE, OUTS.NAME FROM ANIMAL_OUTS AS OUTS 
INNER JOIN ANIMAL_INS AS INS 
ON OUTS.ANIMAL_ID = INS.ANIMAL_ID 
WHERE INS.SEX_UPON_INTAKE != OUTS.SEX_UPON_OUTCOME;

ANIMAL_OUTS에 ANIMAL_INS를 조합하는데 두 테이블 모두에 ANIMAL_ID가 존재하는 정보들 중에서 보호소에 들어올 당시에는 중성화가 되지 않았는데 보호소를 나갈 때는 중성화된 동물 즉, INS.SEX_UPON_INTAKE와 OUTS.SEX_UPON_OUTCME이 같지 않은 정보만을 추출한다.

 

반응형