Loading...
墨滴

阿东lazy

2021/07/31  阅读:40  主题:蔷薇紫

《MySQL必知必会》读书笔记

《MySQL必知必会》读书笔记

前言

​ 第一次完整的技术书籍的读书笔记,这本书200多页,看起来轻松又简单,当然因为内容本身非常基础的缘故,这本书我也只是翻了一遍,等接触到具体内容的时候可以拿起来再看看,看这本书的意义就在于此。

资源链接:

链接:https://pan.baidu.com/s/1RnsH_-HjTCgKOKlxWg4dTg 
提取码:6nta 
--来自百度网盘超级会员V6的分享

推荐语

​ 这本书十分的基础,适合没有学过数据库的小白学习,当然不要过于纠结版本特性,只需要了解基本的sql操作即可。这本书可以让新手快速上手mysql,非常典型的一本入门指导书。

​ 对于已经熟悉mysql的人,这本书可以作为回顾使用,包括mysql里面基本内容以及需要学习的重点,后续介绍的触发器,存储过程,游标等内容可能可能会觉得平时工作用的不多但是其实也是十分重要的内容。

​ 当然这本书不建议购买实体书。买个电子版的翻一翻还是不错的,有种快速学会一本书所有内容的畅快感。

个人评价

​ 这本书从新手入门的角度可以说是一本很适合的书,讲的内容是非常基础但是可以让你刚好入门的程度,翻起来也不会十分的痛苦,同时在内容的编排方面也是典型的由浅入深,这本书 没有什么废话,基本就是直接用案例告诉你sql如何使用,对于新手来说是特别友好的一本书。

​ 另外说明一下书中介绍的mysql5.1是非常老的版本,所以旧版本的特性完全不建议深入学习,而是应该多看看mysql5.5之后的版本新特性,当然如果公司有遗留项目使用低版本的mysql,这里有些内容还是有一定的参考价值的(仅适用于mysql5.1)。

内容概要

​ 实操大于理论的一本书,这里提一些日常比较容易忽略的一些点:

尾空格的like

​ 一条记录存储的格式如下,如果此时写入一条如下的查询条件like %anvil不会匹配上第二条记录的,因为尾部空格的缘故,导致第二条记录是检索不到的,这里的解决办法是可以使用trim()函数或者写成%anvil%的方式:

prod_id | prod_name
a1   2 ton anvil
a2   4 ton anvil[空格]
a3    1 ton anvil

​ 其实这种错误只要入库的时候数据进行严格的处理一般不会出什么问题,这里引申一下java中一个还算比较容易犯的错误:

@Test
public void test() {

    Map<String, Object> map = new HashMap<>();
    map.put(" a1""test1");
    map.put("a3""test3");
    map.put("a2""test2");
    System.out.println(map.get("a1"));
}/*运行结果:
null

*/

​ 不知道碰到这种BUG的人有多痛苦,个人没有碰到过,但是曾经给同事排查问题的发现了类似的情况,当然不是这么明显的错,而是由于前端传递的时候,json当中的key前面多了一个空格,也是因为这个空格,导致花了好几个小时才排查出来!这里希望读者引以为戒,在编写类似代码时候严格检查有没有手贱多敲空格。

and和or的优先级问题:

​ 有时候我们会写出这样的sql:

select * from t_user where name = 'xxx' or age > 18 and email like '@qq.com'

​ 这里根据优先级的就近匹配原则,百分之百的会出现意想不到的情况,因为此时mysql会误认为是下面这样的情况,进行查询之后,数据肯定和我们预想的or条件不一致了:

select * from t_user where name = 'xxx' or (age > 18 and email like '@qq.com')

​ 要修复这段程序很简单就是把or查询的条件包裹起来:

select * from t_user where (name = 'xxx' or age > 18and email like '@qq.com'

​ 所以不管是编程语言还是sql,都需要小心这种操作符优先级带来的莫名其妙的问题。

不能没有的where条件

​ 不论是select,update,insert,delete那个操作,最应该关注的是有没有where条件,可能有人会觉得select影响会稍微小一些?

​ 大错特错,加入select一张全表特别是select *一个表所有的内容并且通过反射映射到程序当中的时候,甚至会导致 内存溢出,并且这种事情是真实发生过的事情。

​ 另外提一个建议是mybatis编写一些插件对于查询语句进行扫描,排查没有where条件的sql并且不允许执行。

​ 上面扯远了,总之,不管是平时练习还是自己上手干活的时候,一定要确保可以触发where条件

小心NULL值

null这个值大概是所有人痛恨的一个东西,然而也是十分重要的一个值,在数据库操作的时候尤其需要小心,因为某些函数比如count(),sum()、min()、max()等函数是不会统计null的数据的,这很容易造成统计数据的错误。

逗号的陷阱

​ 逗号也是非常容易犯错的一个点,当一条sql几十上百行的时候,如果那里写错一个逗号排查难度可想而知,当然mysql给的提示多数情况能发现问题,但是更多的时候会给出一些莫名其妙的错误,报错的结果和真实的错误相差甚远,所以建议每写一点sql就应该马上运行一下,查看一下逗号是否写错,以及是否写多或者语法的问题。

​ 写了一大段的sql语句并且自我感觉良好运行的时候,这种错误尤其容易出现。

having和where的区别

​ 书中的介绍非常的简洁易懂,这里直接摘抄了:where在数据分组之前进行过滤,having在数据分组之后进行过滤。where排除的行不包含在分组中,这容易改变计算值,从而影响having的计算结果。

NOT语句的限制

​ mysql的Not语句限制比较大,只能和in、between、exists语句进行匹配,不像其他某些的sql语言可以对于判断条件进行取反

= NULL 和 IS NULL

​ 老生常谈的一个话题,这里不要去纠结,mysql中判断字段内容是否为null就应该使用 is null,使用 = null 容易出现意想不到的结果。

Rtrim 和 Ltrim 语句

​ 除了基本的trim函数,mysql还支持删除数据左边的空格或者右边的空格,还是挺方便的,这里也记录到了笔记上面。

更新和删除的指导原则:

​ 好的建议总是让人忍不住点赞,这里也同样记录:

  • 除非全表更新或者删除,否则总是使用where条件更新或者删除

  • 保证每一个表都有主键,尽量使用主键关联删除,因为主键索引的效率十分高

  • 在where条件更新或者删除之前,先用SELECT实验一遍。不要对自己的sql过于自信

  • 对于一些关键数据进行表强制关联引用,防止误删除。

    这一点可能很难做到,因为现代多数设计很少使用外键而是使用冗余字段+业务去处理的。

更快的删表方法TRUNCATE

​ 书中给了一个特殊的删表方法,这个还真用的不多,他的格式如下,不建议随便乱用,如果小心把重要数据表干了这里表示不负责哈......

​ 这个删除的原理其实是把整个表干掉,然后直接重新建立一个表,有点类似neo4j图数据的操作.....

TRUNCATE table task_log

​ 现实情况下其实是完全不推荐使用delete去大批量的删除数据,很容易造成资源占用和线程的阻塞(涉及数据结构和底层设计的原理,原因很复杂不做扩展)。也有一些线上库是禁止DELETE的或者在设计的层面上引入 假删除,这里也不做过多扩展,总之DELETE操作能少用就少用

建表的时候尽量使用not null

​ 又是这个深恶痛绝的null,有些数据表的设计会默认给一个值,哪怕他确实没有任何数据也要填充一个''空字符串进去,至于原因这里忘了,总之是null对于索引有很重要的影响,容易让索引失效?总之,数据最好都有意义,没有意义就给个默认值是最好的

总结

​ 如果没有mysql或者sql基础,这本书算是最值得推荐的入门书籍,没有之一,个人当年学习数据库是用的一些垃圾培训机构的书,写的又啰嗦还全是图片,后面跑去看培训机构的视频才真正看懂......

写到最后

​ 写笔记的时候回过头又看了一遍,确实是一本值得推荐的好书,好拿读起来也十分的轻松。

阿东lazy

2021/07/31  阅读:40  主题:蔷薇紫

作者介绍

阿东lazy