1.
students
2. marks
✅ Step 1: Create the Tables
-- Create the 'students' table
CREATE TABLE students (
student_id INT PRIMARY KEY,
name VARCHAR(50),
class VARCHAR(10)
);
-- Create the 'marks' table
CREATE TABLE marks (
mark_id INT PRIMARY KEY,
student_id INT,
subject VARCHAR(50),
marks INT,
FOREIGN KEY (student_id) REFERENCES students(student_id)
);
✅ Step 2: Insert Sample Data
sql
-- Insert data into 'students'
INSERT INTO students VALUES (1, 'Alice', '9A');
INSERT INTO students VALUES (2, 'Bob', '9A');
INSERT INTO students VALUES (3, 'Charlie', '9B');
-- Insert data into 'marks'
INSERT INTO marks VALUES (101, 1, 'Math', 85);
INSERT INTO marks VALUES (102, 1, 'English', 78);
INSERT INTO marks VALUES (103, 2, 'Math', 92);
INSERT INTO marks VALUES (104, 3, 'English', 88);
✅ Step 3: Queries Using Both Tables
🔸 1. Get all students with their marks
SELECT students.name, students.class, marks.subject, marks.marks
FROM students
INNER JOIN marks ON students.student_id = marks.student_id;
🔸 2. Get total marks of each student
SELECT students.name, SUM(marks.marks) AS total_marks
FROM students
JOIN marks ON students.student_id = marks.student_id
GROUP BY students.name;
🔸 3. Get students who scored more than 80 in any subject
SELECT students.name, marks.subject, marks.marks
FROM students
JOIN marks ON students.student_id = marks.student_id
WHERE marks.marks > 80;
🔸 4. List students who didn’t appear for Math
SELECT name
FROM students
WHERE student_id NOT IN (
SELECT student_id FROM marks WHERE subject = 'Math'
);
5. Show average marks per subject
SELECT subject, AVG(marks) AS average_marks
FROM marks
GROUP BY subject;
🔸 6. Show student names who scored below 80 in any subject
SELECT students.name, marks.subject, marks.marks
FROM students
JOIN marks ON students.student_id = marks.student_id
WHERE marks.marks < 80;
🔸 7. Display all students, even if they don’t have any marks yet
(LEFT JOIN)
SELECT students.name, marks.subject, marks.marks
FROM students
LEFT JOIN marks ON students.student_id = marks.student_id;
🔸 8. Display only those students who don’t have any marks
ql
SELECT students.name
FROM students
LEFT JOIN marks ON students.student_id = marks.student_id
WHERE marks.mark_id IS NULL;
🔸 9. Rank students by their total marks (DESC order)
(Using ORDER BY and GROUP BY)
SELECT students.name, SUM(marks.marks) AS total
FROM students
JOIN marks ON students.student_id = marks.student_id
GROUP BY students.name
ORDER BY total DESC;
🔸 10. Count how many subjects each student appeared in
SELECT students.name, COUNT(marks.subject) AS subject_count
FROM students
JOIN marks ON students.student_id = marks.student_id
GROUP BY students.name;
🔸 11. Get subject-wise highest marks and the student(s) who got it
SELECT m.subject, s.name, m.marks
FROM marks m
JOIN students s ON m.student_id = s.student_id
WHERE (m.subject, m.marks) IN (
SELECT subject, MAX(marks)
FROM marks
GROUP BY subject
);
🔸 12. Use CASE to assign grades based on marks
SELECT s.name, m.subject, m.marks,
CASE
WHEN m.marks >= 90 THEN 'A+'
WHEN m.marks >= 75 THEN 'A'
WHEN m.marks >= 60 THEN 'B'
ELSE 'C'
END AS grade
FROM students s
JOIN marks m ON s.student_id = m.student_id;
🔸 13. Assign Remarks Based on Marks
sql
CopyEdit
SELECT s.name, m.subject, m.marks,
CASE
WHEN m.marks >= 90 THEN 'Excellent'
WHEN m.marks >= 75 THEN 'Very Good'
WHEN m.marks >= 60 THEN 'Good'
WHEN m.marks >= 40 THEN 'Needs Improvement'
ELSE 'Fail'
END AS remarks
FROM students s
JOIN marks m ON s.student_id = m.student_id;
🔸 14. Pass or Fail Status
SELECT s.name, m.subject, m.marks,
CASE
WHEN m.marks >= 40 THEN 'Pass'
ELSE 'Fail'
END AS result
FROM students s
JOIN marks m ON s.student_id = m.student_id;
🔸 15. Add Grade Category and Result Together
SELECT s.name, m.subject, m.marks,
CASE
WHEN m.marks >= 90 THEN 'A+ - Pass'
WHEN m.marks >= 75 THEN 'A - Pass'
WHEN m.marks >= 60 THEN 'B - Pass'
WHEN m.marks >= 40 THEN 'C - Pass'
ELSE 'F - Fail'
END AS grade_result
FROM students s
JOIN marks m ON s.student_id = m.student_id;
🔸 16. Classify Subjects as 'Core' or 'Elective'
Assume:
Core subjects: Math, English
Elective subjects: Others
SELECT s.name, m.subject, m.marks,
CASE
WHEN m.subject IN ('Math', 'English') THEN 'Core'
ELSE 'Elective'
END AS subject_type
FROM students s
JOIN marks m ON s.student_id = m.student_id;
🔸 17. Combine Grade, Remarks, and Subject Type
SELECT s.name, m.subject, m.marks,
CASE
WHEN m.marks >= 90 THEN 'A+'
WHEN m.marks >= 75 THEN 'A'
WHEN m.marks >= 60 THEN 'B'
WHEN m.marks >= 40 THEN 'C'
ELSE 'F'
END AS grade,
CASE
WHEN m.subject IN ('Math', 'English') THEN 'Core'
ELSE 'Elective'
END AS subject_category
FROM students s
JOIN marks m ON s.student_id = m.student_id;
🔸 18. Identify Topper Students in Each Subject (Using Subquery + CASE)
SELECT s.name, m.subject, m.marks,
CASE
WHEN m.marks = (
SELECT MAX(m2.marks)
FROM marks m2
WHERE m2.subject = m.subject
)
THEN 'Topper'
ELSE 'Normal'
END AS performance
FROM students s
JOIN marks m ON s.student_id = m.student_id;
19. Give Bonus Marks Based on Performance
SELECT s.name, m.subject, m.marks,
CASE
WHEN m.marks >= 90 THEN m.marks + 5
WHEN m.marks >= 75 THEN m.marks + 3
ELSE m.marks
END AS adjusted_marks
FROM students s
JOIN marks m ON s.student_id = m.student_id;
🔸 20. Categorize Students Based on Total Marks
SELECT s.name,
SUM(m.marks) AS total_marks,
CASE
WHEN SUM(m.marks) >= 250 THEN 'Outstanding'
WHEN SUM(m.marks) >= 200 THEN 'Good'
WHEN SUM(m.marks) >= 150 THEN 'Average'
ELSE 'Needs Improvement'
END AS category
FROM students s
JOIN marks m ON s.student_id = m.student_id
GROUP BY s.name;
🔸 21. Identify Failing Subjects for Each Student
SELECT s.name, m.subject, m.marks,
CASE
WHEN m.marks < 40 THEN 'Failing'
ELSE 'Pass'
END AS status
FROM students s
JOIN marks m ON s.student_id = m.student_id;
🔸 22. Assign Letter Grades Based on Subject-Wise Performance
SELECT s.name, m.subject, m.marks,
CASE
WHEN m.marks BETWEEN 90 AND 100 THEN 'A'
WHEN m.marks BETWEEN 75 AND 89 THEN 'B'
WHEN m.marks BETWEEN 60 AND 74 THEN 'C'
WHEN m.marks BETWEEN 40 AND 59 THEN 'D'
ELSE 'F'
END AS letter_grade
FROM students s
JOIN marks m ON s.student_id = m.student_id;
🔸 23. Give Feedback Based on Marks and Subject
SELECT s.name, m.subject, m.marks,
CASE
WHEN m.subject = 'Math' AND m.marks < 50 THEN 'Needs more practice'
WHEN m.subject = 'English' AND m.marks < 50 THEN 'Improve grammar'
ELSE 'Satisfactory'
END AS feedback
FROM students s
JOIN marks m ON s.student_id = m.student_id;
🔸 24. Mark Attendance Status Based on Marks (Assumption)
(If marks are NULL, assume student was absent)
SELECT s.name, m.subject,
CASE
WHEN m.marks IS NULL THEN 'Absent'
ELSE 'Present'
END AS attendance_status
FROM students s
LEFT JOIN marks m ON s.student_id = m.student_id;
🔸 25. Give Scholarships Based on Total Marks
SELECT s.name, SUM(m.marks) AS total_marks,
CASE
WHEN SUM(m.marks) >= 270 THEN 'Full Scholarship'
WHEN SUM(m.marks) >= 220 THEN 'Half Scholarship'
ELSE 'No Scholarship'
END AS scholarship_status
FROM students s
JOIN marks m ON s.student_id = m.student_id
GROUP BY s.name;