博客
关于我
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/

你可能感兴趣的文章
Linux下的系统监控与性能调优:从入门到精通
查看>>
LiveGBS user/save 逻辑缺陷漏洞复现(CNVD-2023-72138)
查看>>
Mysql Can't connect to MySQL server
查看>>
MySQL InnoDB引擎的锁机制详解
查看>>
MySQL Xtrabackup 安装、备份、恢复
查看>>
mysql 优化器 key_mysql – 选择*和查询优化器
查看>>
MySQL 优化:Explain 执行计划详解
查看>>
mysql 修改默认字符集为utf8
查看>>
Mysql 共享锁
查看>>
mysql 写入慢优化
查看>>
mysql 创建表,不能包含关键字values 以及 表id自增问题
查看>>
mysql 判断表字段是否存在,然后修改
查看>>
MySQL 多表联合查询:UNION 和 JOIN 分析
查看>>
MySQL 大数据量快速插入方法和语句优化
查看>>
mysql 如何给SQL添加索引
查看>>
mysql 字段区分大小写
查看>>
mysql 字段类型类型
查看>>
MySQL 存储引擎
查看>>
mysql 更新子表_mysql 在update中实现子查询的方式
查看>>
mysql 自增id和UUID做主键性能分析,及最优方案
查看>>