-
<TIL> 2024-01-05내일배움캠프(데이터 분석 부트캠프 1기)/TIL & WIL 2024. 1. 5. 23:19
- 오늘 학습한 것
- SQL 코드 테스트 주구장창 풀기
- SQL 관련 아티클 읽고 정리하기
오늘은 지난 주차 때 개인과제와 이번주 파이썬 강의 수강 및 과제로 인해 미뤄졌던 SQL 코드테스트를 풀었다.
며칠 동안 풀지 못하고 있었던 문제나 난이도가 어려워 보여서
우선 쉬운 거 먼저 풀자는 마음으로 미뤘던 문제들을 오늘 많이 풀 수 있었다.
며칠 동안 풀지 못했던 문제는 바로 아래의 Student and Examinations 문제였다.
https://leetcode.com/problems/students-and-examinations/description/
3개의 테이블을 연결해서 아래의 결과를 만들어야하는데 결과를 보면 각각의 학생들마다 과목 이름 3개가 다 포함되어서 출력되어야하고 시험을 치지 않은 과목의 경우에는 0으로 출력 되어야한다는 것인데
여기서 문제는 세 테이블 중에서 Examinations 테이블을 보면 해당하는 학생이 치지 않은 시험의 경우에는 조인을 했을 때 과목 명이 누락된다는 점이었다.
이 부분을 해결하는 방법은 CROSS JOIN(카테시안 곱)이었다.
CROSS JOIN을 하게 되면 조인을 하는 테이블에 존재하는 데이터를 각각 서로 연결하여 모든 가능한 조합을 생성해낸다. 따라서 위의 Students테이블에 있는 데이터와 Subject 테이블에 있는 과목명을 이어주게 되고
학생이 치지 않은 시험의 경우에는 조인을 했을 때 과목 명이 조인했을 때 누락되는 문제를 해결할 수 있었다.
with temp(student_id, student_name, subject_name) as ( select s.student_id, s.student_name, j.subject_name from Students s, Subjects j ), exam_summary(student_id, subject_name, attended_exams) as( select student_id, subject_name, count(student_id) from Examinations group by student_id, subject_name ) select t.student_id, t.student_name, t.subject_name, nvl(e.attended_exams, 0) as attended_exams from temp t left outer join exam_summary e on (t.student_id = e.student_id) and (t.subject_name = e.subject_name) order by t.student_id, t.subject_name;
작성된 코드는 위와 같다. 맨 위의 with절로 만든 임시 테이블 temp를 보면 from절에 조인 없이 2개의 테이블을 불러온 것을 볼 수 있는데 저렇게 작성하면 CROSS JOIN 코드를 작성하지 않아도 알아서 카테시안 곱이 일어나서 같은 결과를 얻을 수 있다.
이제와서 곰곰히 생각해보면 매우 간단하게 풀 수 있는 문제였는데 이 때 까지 문제를 깊게 생각하지 않고 SELECT 문부터 착착 적어내려가기 시작했기 때문에 막혀있었던게 아닌가 싶다.
앞으로 더 어려운 문제들을 마주하게 될텐데 어떻게 하면 SQL문을 잘 작성할 수 있는지 그 방법에 대해서 알아보고자 아티클을 검색하고 블로그에 정리하였다.
https://jinhyunbae.tistory.com/103
그래도 긍정적인 면은 확실히 지난 주차 개인과제를 풀면서 머리를 싸매고 SQL 문제를 풀어보려고 했던 경험들이
코딩테스트를 푸는데 도움이 많이 된 것 같다는 점이다.
앞으로도 꾸준히 SQL 코테 풀어서 엑셀보다 쉽고 편하게 술술 적을 수 있는 수준까지 노력해야겠다.
'내일배움캠프(데이터 분석 부트캠프 1기) > TIL & WIL' 카테고리의 다른 글
<TIL> 2024-01-08 (0) 2024.01.08 <WIL> 2024년 1월 1주차 회고 (0) 2024.01.05 <TIL> 2024-01-04 (2) 2024.01.04 <TIL> 2024-01-03 (1) 2024.01.03 <TIL> 2024-01-02 (1) 2024.01.02 - 오늘 학습한 것