MySQL + SQL · Lesson 121
Student Marksheet Database Project
Project
Marksheet database exam marks store करके result बनाता है — total, percentage, grade और rank। यह school database का केंद्रित version है, marks और results पर केंद्रित। मुख्य विचार marks को अलग table में, प्रति subject एक row store करना है।
💡 प्रति student प्रति subject एक row → student से GROUP BY → total, percentage, grade, rank।
Tables design करना
- students — id, name, roll_no।
- subjects — id, subject_name, max_marks।
- marks — id, student_id (FK), subject_id (FK), marks_obtained।
Marks students को subjects से जोड़ते हैं। subjects पर max_marks रखना percentage सही गणना करने देता है भले subjects अलग totals में से हों।
Schema बनाना
CREATE TABLE students (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
roll_no INT UNIQUE
);
CREATE TABLE subjects (
id INT PRIMARY KEY AUTO_INCREMENT,
subject_name VARCHAR(30),
max_marks INT DEFAULT 100
);
CREATE TABLE marks (
id INT PRIMARY KEY AUTO_INCREMENT,
student_id INT, subject_id INT, marks_obtained INT,
FOREIGN KEY (student_id) REFERENCES students(id),
FOREIGN KEY (subject_id) REFERENCES subjects(id)
);
Sample data
INSERT INTO students (name, roll_no) VALUES ('Aman', 1), ('Diya', 2);
INSERT INTO subjects (subject_name, max_marks) VALUES ('Math', 100), ('Science', 100);
INSERT INTO marks (student_id, subject_id, marks_obtained) VALUES
(1, 1, 88), (1, 2, 76), (2, 1, 95), (2, 2, 90);
Result query
SELECT s.name,
SUM(m.marks_obtained) AS total,
ROUND(AVG(m.marks_obtained), 2) AS percentage,
CASE
WHEN AVG(m.marks_obtained) >= 90 THEN 'A'
WHEN AVG(m.marks_obtained) >= 75 THEN 'B'
WHEN AVG(m.marks_obtained) >= 33 THEN 'C'
ELSE 'F'
END AS grade,
CASE WHEN MIN(m.marks_obtained) >= 33 THEN 'Pass' ELSE 'Fail' END AS result
FROM students s
JOIN marks m ON m.student_id = s.id
GROUP BY s.id, s.name;
+------+-------+------------+-------+--------+
| name | total | percentage | grade | result |
+------+-------+------------+-------+--------+
| Aman | 164 | 82.00 | B | Pass |
| Diya | 185 | 92.50 | A | Pass |
+------+-------+------------+-------+--------+
Students rank करना
SELECT s.name, SUM(m.marks_obtained) AS total,
RANK() OVER (ORDER BY SUM(m.marks_obtained) DESC) AS rank_no
FROM students s
JOIN marks m ON m.student_id = s.id
GROUP BY s.id, s.name;
MySQL 8.0+ में, RANK() हर student को total marks से class position देता है। पुराने versions पर, ORDER BY total DESC इस्तेमाल कीजिए।
आम गलतियाँ
- प्रति subject एक column। इसके बजाय लचीलेपन को marks table इस्तेमाल कीजिए।
- max_marks अनदेखा करना। Percentage को maximum चाहिए, ख़ासकर अगर यह बदले।
- Pass जाँच से पहले grading। एक failed subject को result fail करना चाहिए।
- JOIN भूलना। अकेले marks में student names नहीं होते।
सारांश
- Marksheet database students, subjects और marks table इस्तेमाल करता है।
- Marks प्रति student प्रति subject एक row store कीजिए।
- Total (SUM), percentage (AVG) और grade (CASE) निकालिए।
- Pass/fail को MIN(marks) से जाँचिए।
- ORDER BY total या RANK() (MySQL 8.0+) से rank कीजिए।
आगे, query बनाइए report card query में, या पूरा school database।
अक्सर पूछे जाने वाले प्रश्न (FAQ)
MySQL में marksheet database कैसे design करूँ?
एक students table, एक subjects table, और एक marks table बनाइए जो उन्हें student_id और subject_id व marks से जोड़े। यह normalized design आपको सरल aggregate queries से प्रति student total, percentage और grade निकालने देता है।
Marksheet database से result कैसे निकालूँ?
Marks को students से join कीजिए, student से GROUP BY कीजिए, और total को SUM(marks) व percentage को AVG(marks) इस्तेमाल कीजिए। Average पर CASE grade देता है, और MIN(marks) pass या fail जाँचता है।
Marksheet database में exams या terms कैसे जोड़ूँ?
Marks table में exam_id (या term) column जोड़िए, एक exams table reference करते हुए। फिर आप कई exams को marks store कर सकते हैं और term-wise marksheets बनाने को exam से filter या group कर सकते हैं।
Students को उनके result से कैसे rank करूँ?
Total marks descending से order कीजिए, या MySQL 8.0+ में RANK() OVER (ORDER BY SUM(marks) DESC) इस्तेमाल कीजिए। यह हर student को उनके total के आधार पर position देता है, जो उनका class rank है।
Marks अलग table में क्यों store करूँ?
प्रति student प्रति subject एक row store करना (प्रति subject एक column के बजाय) design लचीला रखता है: आप table बदले बिना subjects जोड़ सकते हैं, और GROUP BY से आसानी से total, average और grade कर सकते हैं।
💻 लाइव कोड एडिटर
इस पेज के प्रोग्राम यहीं तैयार हैं — चलाएँ, बदलें और सीखें। कुछ भी इंस्टॉल किए बिना।
OneCompiler द्वारा संचालित। कोड एडिटर में अपने आप आ जाता है — Run दबाकर आउटपुट देखें। अगर एडिटर न खुले तो नए टैब में खोलें.
