10 sql语句

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执行一个查询的过程?
  1. 客户端发送一条查询给服务器。
  2. 服务器先查询缓存,如果命中了缓存,则立刻返回缓存中的结果。
  3. 如果缓存中没有找到,则进行SQL解析、预处理,再由优化器生成对应的执行计划。
  4. MySQL根据优化器生成的执行计划,调用存储引擎的API来执行查询。
  5. 最后将结果返回给客户端。
3. 数据库中悲观锁和乐观锁的实现
  • 悲观锁,就是对数据的冲突采取一种悲观的态度,也就是说假设数据肯定会冲突,所以在数据开始读取的时候就把数据锁定住。实现:依靠数据库的锁机制实现
  • 乐观锁,认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让用户返回错误的信息。
    实现:大多数基于数据版本(Version)记录机制实现
    具体可通过给表加一个版本号或时间戳字段实现,当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加一。当我们提交更新的时候,判断当前版本信息与第一次取出来的版本值大小,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数据,拒绝更新,让用户重新操作。
1. 为什么要建索引?什么样的字段需要建索引,建索引的时候一般考虑什么?
2. 怎么解决分库分表?
3. 数据库调优了解么

答案

4. MySQL执行计划

答案

5. 为什么推荐自增id,有什么优点

答案

6. 索引最左匹配
7. mysql建立索引的原则

答案

8. 什么条件不能命中索引

答案

9. sql很慢,怎么排查?

答案

10. 数据库的自增主键的优缺点?

答案

11. 数据库和缓存的一致性问题

答案

12. 数据库分库后,如何生成全局唯一的ID

答案

13. Mysql怎么产生死锁

参考1
参考2

14. mysql如何确定sql走哪个索引,mysql sql语句执行时是否使用索引检查方法

添加链接描述

15. 什么时候用/不用索引,索引的类别

答案

16. MySQL索引优化 MySQL索引如何选择

答案

17. 覆盖索引?

答案

18. 如何高效地使用索引?
  1. 索引列不能是表达式的一部分,也不能是函数的参数。
  2. 使用前缀索引。如果要索引很长的字符列,会让索引变得很大并且慢,这时可以以列开始的部分字符索引,这样可以大大节约索引空间,从而提高索引效率。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值