天天看點

《MySQL必知必會》讀書筆記《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 > 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基礎,這本書算是最值得推薦的入門書籍,沒有之一,個人當年學習資料庫是用的一些垃圾教育訓練機構的書,寫的又啰嗦還全是圖檔,後面跑去看教育訓練機構的視訊才真正看懂......

寫到最後

寫筆記的時候回過頭又看了一遍,确實是一本值得推薦的好書,好拿讀起來也十分的輕松。