《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 > 18) and 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 根底,这本书算是最值得举荐的入门书籍,没有之一,集体当年学习数据库是用的一些垃圾培训机构的书,写的又啰嗦还全是图片,前面跑去看培训机构的视频才真正看懂 ……
写到最初
写笔记的时候回过头又看了一遍,的确是一本值得举荐的好书,好拿读起来也非常的轻松。