关于面试总结3-SQL查询
前言
select top n 形式的语句可以获取查询的前几个记录,但是 mysql没有此语法,mysql用limit来实现相关功能。
LIMIT子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。
如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。
万年不变学生表
有2张表,学生表(student)基本信息如下
科目和分数表(grade)
查询前3名
列出数学成绩前3名的学生(要求显示字段:学号,姓名, 科目,成绩)
select * from grade where kemu = '数学' order by score desc limit 3
先通过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
查询第2-3名记录
limit后面如果只写一个整数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
备注:limit是按条数取的,名次一样的,也算一个记录。如果取第5-14的记录,那就是limit 4 10
查询第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 3, 10000
注意:有些资料上写的limit 3, -1 用-1代码最大值,这个是不对的,会报错,解决办法:随便写个非常大的整数
英语课程少于80分的人
统计英语课程少于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
统计每门课程不及格、一般、优秀
课程 | 不及格(<60) | 一般(60<= x <=80) | 优秀(>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
查找每科成绩前2名
查找每科成绩前2名,显示id, 姓名,科目,分数
先按科目和分数查询
SELECT t1.id, t1.kemu,t1.score FROM grade t1 ORDER BY t1.kemu,t1.score DESC
再查找每个每科前面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