- 각 학생별로 참여한 시험의 수를 출력하라
- student_id와 subject_name 기준으로 정렬하라
- 단 모든 학생과 모든 과목을 출력해야 한다.
=> 참여하지 않은 시험과목도 출력해야한다
=> 이를 위해 학생 과 과목 테이블의 모든 경우의 수 출력을 위해 , CROSS JOIN수행
=> 각 학생별 참여한 시험의 개수를 찾기위해,examtation테이블과 LEFT JOIN수행
SELECT s.student_id
,s.student_name
,sub.subject_name
,COUNT(e.student_id) AS attended_exams
FROM Students AS s
CROSS JOIN Subjects AS sub
LEFT JOIN Examinations AS e
ON s.student_id=e.student_id
AND sub.subject_name=e.subject_name
GROUP BY s.student_id,s.student_name,sub.subject_name
ORDER BY s.student_id, sub.subject_name
SUBQUERY
와 COALESCE
이용하기
SELECT s.student_id
, s.student_name
, sub.subject_name
, COALESCE(e.attended_exams, 0) AS attended_exams
FROM Students s
CROSS JOIN Subjects sub
LEFT JOIN (
SELECT student_id, subject_name, COUNT(*) AS attended_exams
FROM Examinations
GROUP BY student_id, subject_name
) AS e
ON s.student_id = e.student_id
AND sub.subject_name = e.subject_name
ORDER BY s.student_id, sub.subject_name;
-- COALESCE 함수는 입력 값이 'NULL'인경우 ' '로 대체하는 역할을 한다.
IFNULL(e.attended_exams, 0) AS attended_exams
=COALESCE(e.attended_exams,0) AS attended_exams
/* CROSS 조인
한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인시키는 기능
상호 조인 결과의 전체 행 개수는 두 테이블의 각 행의 개수를 곱한 수
카티션 곱(CARTESIAN PRODUCT)이라고도 한다.
*/
SELECT *
FROM <첫 번째 테이블>
CROSS JOIN <두 번째 테이블>