本文共 3192 字,大约阅读时间需要 10 分钟。
本文将通过多个实际案例,介绍如何利用数据库查询解决常见问题,并展示如何优化查询性能。
直接在数据库中手动添加测试数据是最直接的方法。可以通过SQL语句或数据库管理工具完成操作。
SELECT t1.sid, AVG(t2.number) FROM student t1 LEFT JOIN score t2 ON t1.sid = t2.student_id GROUP BY t1.sid WHERE AVG(t2.number) > 60;
该查询通过左连接student
和score
表,获取每位学生的学号及其平均成绩,并筛选出平均成绩大于60分的学生。
SELECT t1.sid, t1.sname, t2.temp1, t3.temp2 FROM student t1, (SELECT student_id, COUNT(sid) temp1 FROM score GROUP BY student_id) t2, (SELECT student_id, SUM(number) temp2 FROM score GROUP BY student_id) t3 WHERE t1.sid = t2.student_id AND t1.sid = t3.student_id;
该查询通过子查询分别统计每位学生的选课数量和总成绩,并与主表进行关联,最后返回所有学生的详细信息。
SELECT COUNT(tid) FROM teacher WHERE tname LIKE '李%';
通过LIKE
运算符匹配姓“李”的老师,并统计总数。
SELECT t1.`sid`, t1.`sname` FROM student t1 WHERE t1.`sid` NOT IN (SELECT student_id FROM score WHERE course_id IN (SELECT t2.cid FROM teacher t1 LEFT JOIN course t2 ON t1.`tid` = t2.`teacher_id` WHERE t1.tname = '叶平' ORDER BY t2.`cid`));
该查询通过子查询确定“叶平”老师授课的课程ID,进一步筛选出未选这些课程的学生。
# 方法1SELECT t1.`student_id`, t2.`sname` FROM score t1 LEFT JOIN student t2 ON t1.`student_id` = t2.`sid` WHERE course_id = 1UNION ALLSELECT t1.`student_id`, t2.`sname` FROM score t1 LEFT JOIN student t2 ON t1.`student_id` = t2.`sid` WHERE course_id = 2;# 方法2SELECT t1.sid, t1.sname FROM (SELECT t1.`student_id`, t2.`sname` FROM score t1 LEFT JOIN student t2 ON t1.`student_id` = t2.`sid` WHERE course_id = 1UNION ALLSELECT t1.`student_id`, t2.`sname` FROM score t1 LEFT JOIN student t2 ON t1.`student_id` = t2.`sid` WHERE course_id = 2) t1 GROUP BY t1.sid HAVING COUNT(*) > 1;
通过UNION ALL
操作分别处理两门课程的成绩,最后筛选出同时学过两门课程的学生。
SELECT t1.`student_id`, t2.`sname` FROM score t1 LEFT JOIN student t2 ON t1.`student_id` = t2.`sid` WHERE t1.`course_id` IN (SELECT t2.cid FROM teacher t1 LEFT JOIN course t2 ON t1.`tid` = t2.`teacher_id` WHERE t1.tname = '叶平' ORDER BY t2.`cid`);
通过子查询获取“叶平”老师授课的课程ID,最后筛选出学过这些课程的学生。
# 子句1SELECT number FROM score WHERE course_id = 2;# 子句2SELECT number FROM score t1 WHERE t1.`course_id` = 1;# 总语句SELECT t3.`sid`, t3.`sname` FROM (SELECT student_id, number FROM score WHERE course_id = 2) t1, (SELECT student_id, number FROM score WHERE course_id = 1) t2, student t3WHERE t1.student_id = t3.sid AND t2.student_id = t3.sid AND t1.number < t2.number;
通过比较两门课程的成绩,筛选出成绩低于第一门课程的学生。
# 方法1SELECT DISTINCT t1.student_id, t2.`sname` FROM score t1 LEFT JOIN student t2 ON t1.`student_id` = t2.`sid` WHERE t1.number < 60;# 方法2SELECT t1.sid, t1.sname FROM student t1, (SELECT student_id FROM score WHERE number < 60 GROUP BY student_id) t2WHERE t1.sid = t2.student_id;
通过两种方法分别实现,第一种方法直接筛选成绩,第二种方法通过子查询统计成绩。
# 总语句SELECT sid, sname FROM student WHERE sid NOT IN (SELECT student_id FROM score GROUP BY student_id HAVING COUNT(course_id) = (SELECT COUNT(cid) FROM course));# 子句:学全了的学生编号SELECT student_id FROM score GROUP BY student_id HAVING COUNT(course_id) = (SELECT COUNT(cid) FROM course);# 子句:课程的总数SELECT COUNT(cid) FROM course;
通过统计学生未完成课程的数量,筛选出没有学全所有课的学生。
转载地址:http://cebfk.baihongyu.com/