일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- CleanCode
- DFS
- 알고리즘
- html
- 구현
- 프로그래머스
- 다이나믹 프로그래밍
- 정렬
- 클린코드
- 순환
- 자바
- Color
- Spring
- 검색트리
- SWEA
- Kotlin
- front-end
- 코딩테스트
- SQL
- BFS
- Web
- javascript
- algorithm
- DP
- CSS
- codecademy
- java
- android
- 해슁
- inflearn
- Today
- Total
깡뇽
[프로그래머스] SQL High Score Kit - JOIN 본문
여러 테이블을 연결해서 데이터를 추출하고자 한다면 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이 같지 않은 정보만을 추출한다.
'Computer Language > SQL' 카테고리의 다른 글
[프로그래머스] SQL High Score Kit - SELECT (1) (1) | 2023.10.20 |
---|---|
[프로그래머스] SQL High Score Kit - String, Data (0) | 2022.03.03 |
[프로그래머스] SQL High Score Kit - IS NULL (0) | 2022.03.02 |
[프로그래머스] SQL High Score Kit - GROUP BY (0) | 2022.03.02 |
[프로그래머스] SQL High Score Kit - SUM, MAX, MIN (0) | 2022.02.28 |