-
[SQL] Left Join (1)내일배움캠프/SQL 2024. 7. 4. 21:24
SQL에서 join은 여러 테이블을 결합해주는 역할을 합니다.
여러 테이블에서 일치하는 컬럼들을 찾아 그 칼럼에 공통으로 존재하는 행들만 결합하여 출력합니다.
select 컬럼1, 컬럼2...
from 테이블1 as a join 테이블2 as b
on a.공통컬럼=b.공통컬럼위와 같은 문법을 갖고 있습니다.
join 테이블1과 테이블2의 공통 칼럼에 있는 공통 값들의 행을 출력해줍니다.
select 컬럼1, 컬럼2...
from 테이블1 as 테이블명1
left join 테이블2 as 테이블명2
on a.공통컬럼=b.공통컬럼left join의 경우에는 공통칼럼에서 테이블1에만 있는 값의 행들만 출력해줍니다.
테이블2에 없는 행의 값은 NULL값이 출력됩니다.
Left Join
이번에는
문제를 풀며 살펴봅시다.
https://school.programmers.co.kr/learn/courses/30/lessons/59413
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
입양시각 구하기 요약하자면 보호소에서 어느 시간대에 가장 입양이 활발하게 일어나는지 알아보기 위해
시간대와 횟수를 추출하는 문제입니다.
정답: 왼쪽 이미지 문제 출제자는 왼쪽 이미지처럼 0시부터 23시까지 모든 시간대의 입양 횟수 출력을 원합니다.
하지만 아래 코드처럼 단순하게 시간과 횟수를 출력하려 하면 횟수가 0인 시간대는 아예 출력이 되지 않습니다.
select hour(datetime), count(*)
from animal_outs
group by 1
order by 1그렇기 때문에 0부터 23까지의 숫자가 담긴 열을 하나 만들어서 left join을 해줘야 합니다.
이걸 어떻게 만들어줘야 할까요...?
select hours, count(b.datetime)
from (select row_number() over() - 1 as hours
from animal_outs
limit 24) a left join animal_outs b on a.hours = hour(b.datetime)
group by 1
order by 1바로 row_number() 함수를 사용해서 각 행에 번호를 부여해줍니다.
그리고 0부터 23까지만 부여해주기 위해 마지막에 limit 24를 사용해줬습니다.
이제 이것을 animal_outs와 left join을 사용해주면
0부터 23까지 입양 횟수가 입력됩니다.
결과 하지만 여기서 animal_out에 없는 행의 값들이 왜 NULL이 아닌 0값이 나왔을까요?
바로 집계함수인 count가 null값을 무시하고 개수를 세기 때문에
0값이 나온 것입니다.
처음에 이 문제를 보고서
left join을 써야한다는 것을 당연하게 알았지만
0부터 23까지의 숫자를 어떻게 만들어줄 수 있는지 몰라서
많이 헤맸습니다.
다행히 구글링을 통해서
금방 row_number라는 함수를 알게되어서
문제를 풀 수 있었습니다..
다양한 문제를 접해보며
새로운 함수를 만나보기도 하고
알고 있던 함수를 어떻게 응용하는지 봐야
실력이 느는 것 같습니다..
실력 향상을 위해
앞으로도 꾸준히 공부하고 문제를 풀어봐야겠습니다...
'내일배움캠프 > SQL' 카테고리의 다른 글
[SQL] Left Join (2) (0) 2024.07.05 [SQL] 서브쿼리(Subquery)가 너무 어려워서 작성한 글 (1) 2024.07.01 [SQL] 식품분류별 가장 비싼 식품의 정보 조회하기 (0) 2024.06.27 [DBeaver 실습] SQL Lv3. 이용자의 포인트 조회하기 (0) 2024.06.12 [DBeaver 실습] SQL Lv2. 날짜별 획득포인트 조회하기 (1) 2024.06.11