1. left join、right join、inner join(左连接,右连接,内连接)
- left join 指的是返回左表中的所有记录以及右表中符合匹配条件的记录,右表记录不足的地方显示为 null。
- right join 指的是返回右表中的所有记录以及左表中符合匹配条件的记录,左表记录不足的地方显示为 null。
- inner join 并不以谁为基准,它只显示符合匹配条件的记录。
- 比如 select * from A left join B on A.aID = B.bID
2. sql语句中where和having 的区别
- where是一个约束声明,在数据分组前进行过滤,过滤的是行。where子句出现在group by 之前,而且不能包含聚集函数,因为where执行顺序先于聚集函数。
- having是一个过滤声明,在数据分组后进行过滤,过滤的是分组。having子句出现在group by 之后,而且可以包含聚集函数。
- where和having 可以同时存在一个SQL语句中。
3. group by 和 order by 的区别
- order by 用于对查询结果的排序。默认为升序。group by 指根据一定的规则进行分组,将一个数据集划分成若干个小的区域,然后针对这些小区域进行数据处理。
- order by 是按字段进行排序,后面必须列出排序的字段名,可以是多个字段名。group by是按字段分类 ,必须有“聚合函数”来配合才能使用,使用时至少需要一个分组标志字段。
4. join
from A join B;
指的是将 A 集合与 B 集合相乘得到的笛卡尔积。
一个SQL优化方案是:当两张表的数据量都很大时,如果采用 join 进行连接查询,比如 from A join B; 就会产生一个数据量非常大的笛卡尔积表,增加了内存开销。而由于 on 语句在 join 语句之前执行,所以可以优化为 from A join B on xxx,也就是先判断是否符合 on 后面的条件,再决定是否执行 join。
5. count(*)、count(column)
- count(*):对表中行的数目进行计数,不管表列中包含的是不是空值
- count(column):对特定列中具有值的行进行计数,忽略空值
6. limit
- limit p, 1 :返回第 p + 1 条数据
- limit p, 2 :返回第 p + 1 条数据和第 p + 2 条数据
- limt 1 offset p :返回第 p + 1 条数据
- limit 2 offset p :返回第 p + 1 条数据和第 p + 2 条数据
7. 怎么删除表的前10000行?
在一个连接中循环执行20次 delete from table limit 500
8. varchar 和 char 的区别
- varchar 用于存储可变长的字符串,它比定长的 char 要更省空间,因为只使用了必要的空间。
- char 用于存储定长的字符串,如果输入的字符数小于指定长度,就会自动补上空值;如果大于指定长度,Mysql就会报错。
9. alter table 很慢怎么办?
在一台不提供服务的机器上执行 alter table 操作,然后和提供服务器的主库进行切换。
10. union 和 union all 的区别
- union all:对两个结果集直接进行并集操作,记录可能有重复,不会进行排序。
- union:对两个结果集进行并集操作,会进行去重,记录不会重复,按字段的默认规则排序。
- 因此,从效率上说,UNION ALL 要比 UNION 更快。
11. 数据库连表查询都有哪些?
内连接:只有两个元素表相匹配的才能在结果集中显示。
外连接: 左外连接:左边为驱动表,驱动表的数据全部显示,匹配表的不匹配的不会显示。
右外连接:右边为驱动表,驱动表的数据全部显示,匹配表的不匹配的不会显示。
全外连接:返回左表和右表中的所有行。当某行在另一表中没有匹配行,则另一表中的列返回空值
交叉连接: 笛卡尔效应,显示的结果是链接表数的乘积。
1. 为什么不能使用UUID作为主键来建立索引
如果使用UUID作为主键,由于UUID是无序的,所以所以建立索引会花费很长时间;由于主键字段很长,所以索引占用空间也比较大;另外页分裂和碎片会比较多。
因为插入行时,每一行的主键值不一定比之前插入的大,所以不一定是把新行插入到索引的最后,而是需要为新的行寻找合适的位置,通常是已有数据的中间位置。可能会有频繁地页分裂操作,数据会碎片化。
2. MySQL执行一个查询的过程?
- 客户端发送一条查询给服务器。
- 服务器先查询缓存,如果命中了缓存,则立刻返回缓存中的结果。
- 如果缓存中没有找到,则进行SQL解析、预处理,再由优化器生成对应的执行计划。
- MySQL根据优化器生成的执行计划,调用存储引擎的API来执行查询。
- 最后将结果返回给客户端。
3. 数据库中悲观锁和乐观锁的实现
- 悲观锁,就是对数据的冲突采取一种悲观的态度,也就是说假设数据肯定会冲突,所以在数据开始读取的时候就把数据锁定住。实现:依靠数据库的锁机制实现
- 乐观锁,认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让用户返回错误的信息。
实现:大多数基于数据版本(Version)记录机制实现
具体可通过给表加一个版本号或时间戳字段实现,当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加一。当我们提交更新的时候,判断当前版本信息与第一次取出来的版本值大小,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数据,拒绝更新,让用户重新操作。
1. 为什么要建索引?什么样的字段需要建索引,建索引的时候一般考虑什么?
2. 怎么解决分库分表?
3. 数据库调优了解么
4. MySQL执行计划
5. 为什么推荐自增id,有什么优点
6. 索引最左匹配
7. mysql建立索引的原则
8. 什么条件不能命中索引
9. sql很慢,怎么排查?
10. 数据库的自增主键的优缺点?
11. 数据库和缓存的一致性问题
12. 数据库分库后,如何生成全局唯一的ID
13. Mysql怎么产生死锁
14. mysql如何确定sql走哪个索引,mysql sql语句执行时是否使用索引检查方法
15. 什么时候用/不用索引,索引的类别
16. MySQL索引优化 MySQL索引如何选择
17. 覆盖索引?
18. 如何高效地使用索引?
- 索引列不能是表达式的一部分,也不能是函数的参数。
- 使用前缀索引。如果要索引很长的字符列,会让索引变得很大并且慢,这时可以以列开始的部分字符索引,这样可以大大节约索引空间,从而提高索引效率。