博客
关于我
mysql复杂查询,优质题目
阅读量:791 次
发布时间:2023-02-12

本文共 3192 字,大约阅读时间需要 10 分钟。

表结构与查询优化实例

本文将通过多个实际案例,介绍如何利用数据库查询解决常见问题,并展示如何优化查询性能。

1. 自行添加测试数据

直接在数据库中手动添加测试数据是最直接的方法。可以通过SQL语句或数据库管理工具完成操作。

2. 查询平均成绩大于60分的同学的学号和平均成绩

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;

该查询通过左连接studentscore表,获取每位学生的学号及其平均成绩,并筛选出平均成绩大于60分的学生。

3. 查询所有同学的学号、姓名、选课数、总成绩

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;

该查询通过子查询分别统计每位学生的选课数量和总成绩,并与主表进行关联,最后返回所有学生的详细信息。

4. 查询姓“李”的老师的个数

SELECT COUNT(tid) FROM teacher WHERE tname LIKE '李%';

通过LIKE运算符匹配姓“李”的老师,并统计总数。

5. 查询没学过“叶平”老师课的同学的学号、姓名

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,进一步筛选出未选这些课程的学生。

6. 查询学过“001”并且也学过编号“002”课程的同学的学号、姓名

# 方法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操作分别处理两门课程的成绩,最后筛选出同时学过两门课程的学生。

7. 查询学过“叶平”老师所教的所有课的同学的学号、姓名

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,最后筛选出学过这些课程的学生。

8. 查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名

# 子句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;

通过比较两门课程的成绩,筛选出成绩低于第一门课程的学生。

9. 查询有课程成绩小于60分的同学的学号、姓名

# 方法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;

通过两种方法分别实现,第一种方法直接筛选成绩,第二种方法通过子查询统计成绩。

10. 查询没有学全所有课的同学的学号、姓名

# 总语句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/

你可能感兴趣的文章
MySQL基础day07_mysql集群实例-MySQL 5.6
查看>>
Mysql基础命令 —— 数据库、数据表操作
查看>>
Mysql基础命令 —— 系统操作命令
查看>>
MySQL基础学习总结
查看>>
mysql基础教程三 —常见函数
查看>>
mysql基础教程二
查看>>
mysql基础教程四 --连接查询
查看>>
MySQL基础知识:创建MySQL数据库和表
查看>>
MySQL基础系列—SQL分类之一
查看>>
MySQL处理千万级数据分页查询的优化方案
查看>>
mysql备份
查看>>
mysql备份与恢复
查看>>
mysql备份工具xtrabackup
查看>>
mysql备份恢复出错_尝试备份/恢复mysql数据库时出错
查看>>
mysql复制内容到一张新表
查看>>
mysql复制表结构和数据
查看>>
mysql复杂查询,优质题目
查看>>
MySQL外键约束
查看>>
MySQL多表关联on和where速度对比实测谁更快
查看>>
MySQL多表左右连接查询
查看>>