一、SQL语句
1、SQL语句的分类
- DQL:数据查询语言—select
- DML:数据操作语言—insert/update/delete
- DDL:数据定义语言—create/drop/alter
- DCL:数据控制语言—start transaction/commit/rollback
2、Sql语句的执行顺序
- SQL 语句的执行顺序与编写顺序并不相同
- FROM、ON、JOIN、WHERE、GROUP BY、HAVING、SELECT、DISTINCT、ORDER BY、LIMIT
- 最终返回结果
3、Truncate与delete的区别
- Truncate不能加where条件,而delete可以
- Truncate更高效,不记录任何日志,整个表数据立即删除;delete则会为每行记录一条日志
- Truncate后,再插入数据,主键从1开始;Delete则从上次的断点开始
- Truncate不能回滚,delete可以
4、count(1)、count(*)和count(col)的区别
- count(1)和count(*)返回记录的行数,包括NULL的统计
- count(col)是不包括NULL的统计
5、char与varchar的区别
- 长度:char类型的长度是固定的,而varchar类型的长度是可变的。char类型的长度一旦定义,无论存储的数据有多少,都会占用固定长度的空间。当存储的数据长度小于定义长度时,char类型会在数据后面用空格填充至定义长度。而varchar类型则不同,它仅存储实际的数据长度,不会额外使用空间。
- 存储方式:char和varchar的存储方式也有所不同。在存储英文字符时,char类型占用1个字节,而varchar类型占用2个字节。对于汉字的存储,两种类型都是占用2个字节。
- 效率:char类型的存取速度要比varchar类型快得多。因为char类型的长度固定,程序在存储和查找时可以更加高效。然而,这种效率的提升是以空间为代价的,因为char类型会产生额外的隐藏空格。varchar类型虽然存取速度相对较慢,但可以节省空间,尤其是当存储的数据长度小于定义长度时。
- 场景:char适合用于存储长度固定且数据量不大的字符字段,例如身份证号、手机号等;而varchar则更适合用于存储长度可变、数据量较大的字符字段,例如文章内容、用户备注等。在实际应用中,应根据具体需求和场景选择合适的字符类型。
5、varchar(10)和varchar(20)的区别
- 存储hello所占空间一样
- 后者在排序时会消耗更多内存
6、什么是多表查询
- 内连接:驱动表中的记录在被驱动表中找不到匹配的记录,该记录不会加入到最后的结果集
- 外连接:驱动表中的记录即使在被驱动表中没有匹配的记录,也仍然需要加入到结果集
- 左连接:选取左侧的表为驱动表
- 右连接:选取右侧的表为驱动表
- 子查询
7、什么是SQL注入
- Sql字符串拼接存在漏洞
- 解决
8、为什么SQL 语句不要过多的join?
- 性能问题:每个join 操作都需要对两个或多个表进行连接操作,这个操作需要消耗大量的计算资源和时间,如果join 操作过多,会导致SQL 的执行效率降低,从而影响整个系统的性能。
- 可读性和维护性问题:join 操作会使SQL 语句变得复杂,难以理解和维护,特别是当join 操作涉及到多个表的时候,SQL 语句的复杂度会呈现指数级增长,给代码的可读性和可维护性带来挑战。
二、索引
1、索引的分类
- 主键索引:数据列不允许重复,不允许为NULL,一个表只能有一个主键
- 唯一索引:数据列不允许重复,允许为NULL 值,一个表允许多个列创建唯一索引
- 普通索引:基本的索引类型,没有唯一性的限制,允许为NULL 值。
- 覆盖索引:查询列要被所建的索引覆盖,不必读取数据行
- 联合索引:多列组成一个索引,用于组合搜索,效率大于索引合并
2、索引的类型
3、与B树、红黑树相比,B+树索引的优点
- 数据库文件很大,需要存储到磁盘,索引的结构要尽量减少查找过程
- 高度原因:B+树每个节点包含许多关键字,降低树的深度。任何关键字查找,都要从根节点到叶子节点,查询路径相同,每一个数据查询的效率相当。
- B树适合随机检索,而B+树适用于顺序检索和随机检索
- B