面试相关总结(MySql)
1、 查询语法与执行顺序
1.1 查询语法顺序
- Select
- From
- Left JOIN
- ON
- Where
- Group by
- Having
- Order by
- Limit
VT表示虚拟表,Mysql每一次操作会产生一个结果集,如上的sql执行顺序如下:
1) From:将最近的两张表进行笛卡尔积 ——VT1
2) ON:将VT1安装条件进行筛选——VT2
3) LEFT JOIN: 保留左表的记录——VT3
4) WHERE: 过滤VT3中的记录——VT4
5) GROUP BY:对VT4的记录进行分组——VT5
6) HAVING: 对VT5中的记录进行过滤——VT6
7) SELECT:对VT6中的记录选取指定的列——VT7
8) ORDER BY: 对VT7的记录进行排序——VT8
9) LIMIT: 对排序之后的值进行分页——VT9
1.2 面试遇到的一些sql
stu(Sno,Sname,Sex,Age,Native) 分别表示:学号、姓名、性别、年龄、籍贯
teacher(Tno,Tname,Post,Sex,Age) 分别表示:编号、姓名、职称、性别、年龄
course(Cno,Cname, Tno,Period) 分别表示:课号、课程名、教师编号、时段
grade(Sno,Cno,Grade) 分别表示:学号、课号、分数
1) 查询班级里选课数量大于3且至少有一门课的成绩大于80分的人数。
Select count(a.SNo)
From stu a, grade b
Where
a.Sno = b.Sno
and
max(b.Grade > 80)
Group by b.Sno
Having count(b.Sno) > 3
2)在3月20号这一天的订单业务中,提交订单时间和结算订单时间低于1分钟的订单。
Select product.*
From product
Where
data(add_time) == '2021-03-20'
and
TimeStampDiff(SECOND, create_time, end_time)
ps: 关于这方面时间的函数还是不太熟,具体函数使用查看这边
2、索引相关(Innodb)
2.1 基本概念
索引的所用与目录相似,旨在帮助快速查询到结果。
大致可分为聚集索引,非聚集索引,联合索引,哈希索引,全文索引。
2.2 索引实现原理
2.1 聚集索引和非聚集索引
非聚集索引的实现结构是B树,非聚集索引的实现结构是B+树,两个结构的区别是B+树仅叶子节点保存数据,B树叶子节点与非叶子节点均保存数据。
B+Tree对比BTree的优点:
1、磁盘读写代价更低
一般来说B+Tree比BTree更适合实现外存的索引结构,因为存储引擎的设计专家巧妙的利用了外存(磁盘)的存储结构,即磁盘的最小存储单位是扇区(sector),而操作系统的块(block)通常是整数倍的sector,操作系统以页(page)为单位管理内存,一页(page)通常默认为4K,数据库的页通常设置为操作系统页的整数倍,因此索引结构的节点被设计为一个页的大小,然后利用外存的“预读取”原则,每次读取的时候,把整个节点的数据读取到内存中,然后在内存中查找,已知内存的读取速度是外存读取I/O速度的几百倍,那么提升查找速度的关键就在于尽可能少的磁盘I/O,那么可以知道,每个节点中的key个数越多,那么树的高度越小,需要I/O的次数越少,因此一般来说B+Tree比BTree更快,因为B+Tree的非叶节点中不存储data,就可以存储更多的key。
2、查询速度更稳定
由于B+Tree非叶子节点不存储数据(data),因此所有的数据都要查询至叶子节点,而叶子节点的高度都是相同的,因此所有数据的查询速度都是一样的。
特别推荐这一篇博客。
3、事务相关
3.1 什么事务?
事务是用来保证数据库的完整性,一批sql命令,要么全部执行要么全不执行。