Knowledge Guide
HomeDatabasesSQL Practice Problems

Students and Examinations

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
Image

Output

Image
Image

Try It Yourself

java
-- TODO: Write your user queries here

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 | +------------+--------------+--------------+-----------------+
🤖 Don't fully get this? Learn it with Claude

Stuck on Students and Examinations? Open Claude, copy a block below, and it'll teach you this exact concept — visually and interactively.

🎨 Explain it visually

Build the mental picture, not memorization.

I just read a lesson on **Students and Examinations** (Databases) and want to truly understand it. Explain Students and Examinations from first principles using ONE vivid real-world analogy and a visual mental model — draw it as ASCII art or a clear step-by-step diagram — with a concrete example using real numbers. Then ask me one question to check I got the mental picture, and wait for my reply. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
🤔 Walk me through it (interactive)

Socratic — adapts to where you're stuck.

Teach me **Students and Examinations** interactively. Ask me ONE guiding question at a time, wait for my answer, and adapt to my confusion — build the idea with me step by step instead of explaining it all at once. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
🧪 Quiz me & fix my gaps

Active recall exposes what you missed.

Quiz me on **Students and Examinations** with 5 questions, easy to tricky, ONE at a time. Tell me if each answer is right; at the end, explain clearly what I got wrong and why. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
🧠 Make it stick

Intuition + hook + flashcards for long-term memory.

Help me remember **Students and Examinations** for the long term: give the one-sentence intuition, a memorable hook/mnemonic, a tiny worked example, and 3 active-recall flashcards (Q -> A). If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.

📝 My notes