Grokking SQL for Tech Interviews
Ask Author
Back to course home

0% completed

Vote For New Content
12. Students and Examinations
Table of Contents

Contents are not accessible

Contents are not accessible

Contents are not accessible

Contents are not accessible

Contents are not accessible

Problem

Table: Students

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| student_id    | int     |
| student_name  | varchar |
+---------------+---------+
student_id is the primary key (column with unique values) for this table.
Each row of this table contains the ID and the name of one student in the school.

Table: Subjects

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| subject_name | varchar |
+--------------+---------+
subject_name is the primary key (column with unique values) for this table.
Each row of this table contains the name of one subject in the school.

Table: Examinations

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| student_id   | int     |
| subject_name | varchar |
+--------------+---------+
There is no primary key (column with unique values) for this table. It may contain duplicates.
Each student from the Students table takes every course from the Subjects table.
Each row of this table indicates that a student with ID student_id attended the exam of subject_name.

Problem Definition

Write a solution to find the number of times each student attended each exam.

Return the result table ordered by student_id and subject_name.

Example

Image

Output

Image

Try It Yourself

MYSQL
MYSQL

. . . .

Solution

To solve this problem, the approach involves using SQL queries to retrieve and process information from the given tables—Students, Subjects, and Examinations. The objective is to find the number of times each student attended each exam.

The initial step is to perform a CROSS JOIN between the Students and Subjects tables. This operation generates a combination of all students and subjects, ensuring that each student is paired with every subject. The result of this join is then further combined with the Examinations table using a LEFT JOIN. The LEFT JOIN ensures that all combinations from the previous step are retained, even if there are no matching entries in the Examinations table.

The COUNT function is applied to calculate the number of times each student attended each exam. The GROUP BY clause is utilized to group the results by student_id, student_name, and subject_name, allowing the counting operation to be performed on each unique combination.

The final step involves ordering the result table by student_id and subject_name, as specified in the problem statement. This is achieved using the ORDER BY clause.

SELECT s.student_id, s.student_name, sub.subject_name, Count(e.student_id) AS attended_exams FROM Students s CROSS JOIN Subjects sub LEFT JOIN Examinations 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;

Let's break down the query step by step:

Step 1: Cross Join Students and Subjects

We start by performing a cross join between the Students and Subjects tables to generate a combination of all students and all subjects.

SELECT s.student_id, s.student_name, sub.subject_name FROM students s CROSS JOIN subjects sub;

Output After Step 1:

+------------+--------------+--------------+ | student_id | student_name | subject_name | +------------+--------------+--------------+ | 1 | Alice | Math | | 1 | Alice | Physics | | 1 | Alice | Programming | | 2 | Bob | Math | | 2 | Bob | Physics | | 2 | Bob | Programming | | 6 | Alex | Math | | 6 | Alex | Physics | | 6 | Alex | Programming | | 13 | John | Math | | 13 | John | Physics | | 13 | John | Programming | +------------+--------------+--------------+

Step 2: Left Join with Examinations

We perform a left join with the Examinations table to find out which students attended which exams. The GROUP BY clause is used to group data based on the student_id, s.student_name, and sub.subject_name raws.

SELECT s.student_id, s.student_name, sub.subject_name, Count(e.student_id) AS attended_exams FROM students s CROSS JOIN subjects sub LEFT JOIN examinations 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;

Output After Step 2:

+------------+--------------+--------------+-----------------+ | student_id | student_name | subject_name | attended_exams | +------------+--------------+--------------+-----------------+ | 1 | Alice | Math | 3 | | 1 | Alice | Physics | 2 | | 1 | Alice | Programming | 1 | | 2 | Bob | Math | 1 | | 2 | Bob | Physics | 0 | | 2 | Bob | Programming | 1 | | 6 | Alex | Math | 0 | | 6 | Alex | Physics | 0 | | 6 | Alex | Programming | 0 | | 13 | John | Math | 1 | | 13 | John | Physics | 1 | | 13 | John | Programming | 1 | +------------+--------------+--------------+-----------------+

Step 3: Order by student_id and subject_name

Finally, we order the result table by student_id and subject_name as specified in the problem.

SELECT student_id, student_name, subject_name, attended_exams FROM ( -- Step 2 output goes here ) ORDER BY student_id, subject_name;

Final Output:

+------------+--------------+--------------+-----------------+ | student_id | student_name | subject_name | attended_exams | +------------+--------------+--------------+-----------------+ | 1 | Alice | Math | 3 | | 1 | Alice | Physics | 2 | | 1 | Alice | Programming | 1 | | 2 | Bob | Math | 1 | | 2 | Bob | Physics | 0 | | 2 | Bob | Programming | 1 | | 6 | Alex | Math | 0 | | 6 | Alex | Physics | 0 | | 6 | Alex | Programming | 0 | | 13 | John | Math | 1 | | 13 | John | Physics | 1 | | 13 | John | Programming | 1 | +------------+--------------+--------------+-----------------+

.....

.....

.....

Like the course? Get enrolled and start learning!

Table of Contents

Contents are not accessible

Contents are not accessible

Contents are not accessible

Contents are not accessible

Contents are not accessible