📚문제
📝풀이
# Write your MySQL query statement below
SELECT s.student_id
, s.student_name
, j.subject_name
,COUNT(e.student_id) AS attended_exams
FROM Students s
INNER JOIN Subjects j
LEFT JOIN Examinations e ON s.student_id = e.student_id
AND j.subject_name = e.subject_name
GROUP BY s.student_id,s.student_name,j.subject_name
ORDER BY s.student_id,j.subject_name
테이블 3개를 어떻게 조인해주어야하는지 고민을 많이했다
Examination테이블에 기본키와 외래키가 있으니
나머지 테이블을 Inner Join,Left join...해주어봤는데
문제 예시처럼 나오지가 않았다
그래서 참고한 방법 중 핵심은
1. CROSS JOIN(=교차 결합)
모든 id,이름,과목 각각에 대해서 전개하려면
Students 테이블과 Subjects 테이블을
곱집합 형태처럼 교차결합(Cross Join) 해주어야한다
두 테이블을 그냥 JOIN(=Inner JOIN)해주면
결합조건이 따로 없기 때문에 교차결합(Cross Join)한 것과 같은 결과값을 반환한다
이후에는 시험을 보지 않더라도 ID가 나와야하므로
Students 테이블을 기준으로 LEFT JOIN 해주면 된다
그리고 한 가지 유의할 점은 결합조건에서
subject_name 컬럼이 동일하다는 조건을 부여해야한다
그렇지 않으면
id 기준으로 LEFT Join해주었기 때문에
이런식으로 student_id, subject_name에 대해
해당 id가 본 시험 과목이름이 다 출력된다
그리고 직접적으로 JOIN해주는 테이블끼리가 아니더라도 결합조건을 걸어줄 수 있다는 것을 알았다
2. COUNT(열 이름)
이건 개인적으로 헷갈리지 않고 다시 리마인드하기 위해서 적어봤다
만약 해당 학생이 시험을 보지 않았다면 어떻게 카운트를 해주지 ? 에 대해서
CASE 문을 사용해봤다
COUNT(CASE WHEN e.student_id IS NOT NULL THEN 1 ELSE 0 END ) AS attended_exam
근데 이렇게 해주면 0도 카운트로 세서 시험을 보지 않은 경우도 1이 되버린다
그래서 간단하게
COUNT(e.studetnt_id)
해주게 되면 NULL값은 포함하지 않고 계산하기 때문에
0이 나오게된다