面试题目1:查询分页
# 1.根据总数分页
# 假设每页3条,获取总的页数
select ceil(count(*) / 3) from tb_lemon_grade;
# offset = (pagenumber - 1) * rows
select * from tb_lemon_grade limit 0, 3;
select * from tb_lemon_grade limit 3, 3;
select * from tb_lemon_grade limit 6, 3;
select * from tb_lemon_grade limit 9, 3;
理解:
使用关键字limit,第一个参数是表示偏移量(offset 可选参数),第二个参数表示去处数据条数(rows)
分页算法:limit offset = (pagenumber - 1) * rows, rows 某页数据查询,方便随便跳到某页
实际情况为了缓解数据库压力实现假分页,即一次查询所有数据存在缓存(内存或redis),在页面显示做分页。
参考 https://blog.51cto.com/u_10984944/2507478
面试题目2:查每个班每科最高分数
show databases;
use interview;
CREATE TABLE tb_lemon_grade (
id INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
student_name VARCHAR(20) DEFAULT NULL,
Linux int(3) DEFAULT 0,
MySQL int(3) DEFAULT 0,
Java int(3) DEFAULT 0,
class_name VARCHAR(20) DEFAULT NULL);
INSERT INTO tb_lemon_grade (student_name, Linux, MySQL,Java,class_name) VALUES
("刘一", 80, 60,70,'18期'),
("陈二", 70, 90,80,'18期'),
("张三", 90, 80,70,'18期'),
("李四", 60, 80,70,'19期'),
("王五", 60, 70,90,'19期'),
("赵六", 70, 80,60,'19期'),
("孙七", 100,70,80,'20期'),
("周八", 70, 80,90,'20期'),
("吴九", 80, 70,90,'21期'),
("郑十", 90, 70,60,'21期');
select tb.class_name, max(tb.Linux) as Linux, max(Mysql) as Mysql, max(Java) as Java from tb_lemon_grade tb group by tb.class_name;
查询结果:
理解:
- 构造好表结构,将每科放在一个表内(实际情况科目数量是固定不常变动) 使用
- group by关键字,使用该关键字查询的字段必须是group by的字段或使用内置方法的字段
参考:http://testingpai.com/article/1595507154488