企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## 前言 select top n 形式的语句可以获取查询的前几个记录,但是 mysql没有此语法,mysql用limit来实现相关功能。 LIMIT子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。 如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。 * 1.列出数学成绩前3名的学生(要求显示字段:学号,姓名, 科目,成绩) * 2.查询数学成绩第2和第3名的学生 * 3.查询第3名到后面所有的学生数学成绩 * 4.统计英语课程少于80分的,显示 学号id, 姓名,科目,分数 * 5.查找每科成绩前2名,显示id, 姓名,科目,分数 <br /> ## **万年不变学生表** 有2张表,学生表(student)基本信息如下 ![](https://img.kancloud.cn/7b/dd/7bddde959bbe4616f75b522ca88d2ace_519x280.png) 科目和分数表(grade) ![](https://img.kancloud.cn/6e/7d/6e7d27edc175fd7abf3b34189226262b_521x340.png) <br /> ### **查询前3名** 1.列出数学成绩前3名的学生(要求显示字段:学号,姓名, 科目,成绩) ~~~ select * from grade where kemu = '数学' order by score desc limit 3 ~~~ ![](https://img.kancloud.cn/ed/42/ed42872319ad4db144c4db730abda37c_280x126.png) 先通过limit取出前三条记录,再结合student表查询 ~~~ select a.id, a.name, b.kemu, b.score from student a, grade b where a.id = b.id and kemu = '数学' order by score desc limit 3 ~~~ ![](https://img.kancloud.cn/89/7d/897d62d933ea9f8aeca76b986616df2a_286x132.png) <br /> ### **查询第2-3名记录** 2.查询数学成绩第2和第3名的学生 imit后面如果只写一个整数n,那就是查询的前n条记录;如果后面带2个整数n 和 m,那么第一个数n就是查询出来队列的起点(从0开始),第二个是m是统计的总数目 第2-3条记录,那么起点就是1, 第2-3名有2条记录,那么第二个参数就是2 ~~~ select a.id, a.name, b.kemu, b.score from student a, grade b where a.id = b.id and kemu = '数学' order by score desc limit 1, 2 ~~~ ![](https://img.kancloud.cn/44/85/4485803c14c31bc57cd06eb3342d0db6_308x110.png) 备注:limit是按条数取的,名次一样的,也算一个记录。如果取第5-14的记录,那就是limit 4 10 <br /> ### **查询第3到后面所有的** 3.查询第3名到后面所有的学生数学成绩 ~~~ select a.id, a.name, b.kemu, b.score from student a, grade b where a.id = b.id and kemu = '数学' order by score desc limit 2, 10000 ~~~ **注意:有些资料上写的limit 2, -1 用-1代码最大值,这个是不对的,会报错,解决办法:随便写个非常大的整数** ![](https://img.kancloud.cn/aa/3a/aa3abd1335c91b6404692a1481af8900_302x117.png) <br /> ### **英语课程少于80分的人** 4.统计英语课程少于80分的,显示 学号id, 姓名,科目,分数 ~~~ SELECT a.id, a.name, b.kemu, b.score FROM student a, grade b WHERE a.id = b.id AND b.kemu = '英语' AND b.score < 80 ~~~ ![](https://img.kancloud.cn/1f/a4/1fa4a475d227f3b91fd063e8160ab146_582x287.png) <br /> ### **统计每门课程不及格、一般、优秀** | 课程 | 不及格(80) | | --- | --- | ~~~ SELECT b.kemu, (SELECT COUNT(*) FROM grade WHERE score < 60 and kemu = b.kemu) as 不及格, (SELECT COUNT(*) FROM grade WHERE score between 60 and 80 and kemu = b.kemu) as 一般, (SELECT COUNT(*) FROM grade WHERE score > 80 and kemu = b.kemu) as 优秀 FROM grade b GROUP BY kemu ~~~ ![](https://img.kancloud.cn/5d/9a/5d9a9ed9341e9e3fde09c73c8704779b_775x291.png) <br /> ### **查找每科成绩前2名** 5.查找每科成绩前2名,显示id, 姓名,科目,分数 先按科目和分数查询 ~~~ SELECT t1.id, t1.kemu,t1.score FROM grade t1 ORDER BY t1.kemu,t1.score DESC ~~~ ![](https://img.kancloud.cn/66/99/6699c5598b15434a8b30ba39c9246477_668x396.png) 再查找每个每科前面2名 ~~~ SELECT t1.id, a.name, t1.kemu,t1.score FROM grade t1, student a WHERE (SELECT count(*) FROM grade t2 WHERE t1.kemu=t2.kemu AND t2.score>=t1.score )<=2 and a.id = t1.id ORDER BY t1.kemu,t1.score DESC ~~~ ![](https://img.kancloud.cn/40/cc/40cc9803aed482ed2793621ffceb4172_648x375.png) 如果第二名有重复的,也能一起查找出来 ~~~ SELECT t1.id, a.name, t1.kemu,t1.score FROM grade t1, student a WHERE (SELECT count(*) FROM grade t2 WHERE t1.kemu=t2.kemu AND t2.score>t1.score )<2 and a.id = t1.id ORDER BY t1.kemu,t1.score DESC ~~~