渐进式问题
有两个表:学生student(id,name,age,class_id)和班级class(id,name)。
口述查询语句:查询每个班级年龄最大的学生信息
要求:返回3列:班级名称,班里最大的学生年龄,年龄最大的学生的姓名,如果年龄最大的学生有多个,随机返回一个即可。
select max(student.name), class.name, age.max_age from student join class on student.class_id = class.id join (select class_id, max(age) as max_age from student group by class_id) as age on student.age = age.max_age and class.id = age.class_id group by class.name, age.max_age;
左连接,右连接和内连接的区别
- 连接分为内连接和外连接,外连接又分为左外连接和右外连接。比如表1 join 表2,在字段a上做关联,如果是左外连接,会把所有表1的记录查询出来,对应字段a的值,如果在表2中没有记录,表2相关字段会都是null;而如果是右外连接,会把表2的记录都查询出来,对应字段a的值,如果在表1中没有记录,表1相关字段会都是null;如果是内连接,会把这类只有一个表里有的记录过滤掉。
单纯的join关键字,是哪种连接方式
- 是内连接方式
口述查询语句:查询年龄大于15且姓李的学生
select * from student where age > 15 and name like '李%';
针对这个查询,如何给学生表加索引
- 增加索引 idx_age_name (age, name)
能不能把索引的两个字段换顺序?为什么?
- 不能换
- 按照索引查询时,遵循前缀匹配原则,查询语句中有对name字段的前缀匹配,如果把name字段放到第一位,则不能再按age走索引,只能查到name前缀是"李"的记录后遍历所有的记录。而如果把age放到第一位,则可以按索引直接找到age>15且name前缀是"李"的第一条记录,再顺序读取后续记录,直到第一个不符合条件的记录,即可返回,遍历的记录条数会更少。
如何看查询语句是否使用了索引?
- 使用explain关键字,可以看查询语句的执行过程
MySQL数据库,同一条查询语句,第一次执行较慢,第二次很快返回结果,可能的原因是什么?
- 可能是第二次查询时命中了查询缓存
- 如果开启了查询缓存,且在第一次查询后没有对查询相关表做任何修改操作,则第二次查询时会直接返回缓存的第一次查询的结果
- 只有在更新不频繁的场景才建议开启查询缓存,因为缓存查询结果会占用一定内存,且有性能损失,如果更新频繁,缓存往往不能命中,则会白白浪费内存和性能