1. 程式人生 > >2018/07/26 《SQL 必知必會》 學習筆記

2018/07/26 《SQL 必知必會》 學習筆記

order lec tinc 終端 報錯 提交 寫法 啟動 過濾

讀書總結:

  《SQL 必知必會》是我系統學習數據庫的第一本書。

  主要講解了 常用的 SQL 語句寫法和一些基本的註意點。

  並不涉及一些比較深入的知識點。

  作為初學或者是系統學習的查漏補缺我覺得還時不錯的。

1:DISTINCT 用於去重,但是需要註意的是,它是用於所有列的,也就是說,除非指定的列全部相同,否則所有的行都會被檢索出來。


2:ORDER BY 用於排序,但是應該註意的是,它因該是 SELECT 語句中出現的最後一條字句,如果不是,則報錯。

3:在 WHERE 字句中出現多個 AND 和 OR 時候應該特別註意,因為和大多數語言一樣,因為優先級不同(AND更大),所以在使用中 應該使用 ()

來包住你需要的篩選條件。

4:IN 可以使用 WHERE / OR 實現,但是最大的不同是,IN 中可以包含 WHERE 字句

5:當使用 AS 重新命名之後,必須使用命名之後的名稱。

SELECT `user.name` FROM `name` AS n;  // 報錯,沒有此字段
SELECT `n.name` FROM `name` AS n; // 正常,包括 WHERE 字句中也是如此 

6:WHERE 和 HAVING 的區別

  - HAVING 的刪選條件只能是之前已經篩選出來的字段

  - WHERE 的使用是表中具體存在的字段

    - 例如

    1:having 和 where 都可以使用
    select
id,name form user where id = 1; // 正常
    select id,name form user having id = 1; // 正常,因為having的字段是之前已經 select 的字段
  
    2:只有where可以使用
    select name form user having id = 1; // 報錯,因為having的字段並沒有select出來

    3:只有having可以使用
    group by 字句後面
    聚合函數只有having能用

    select count(*) as count from users where count > 0 group by id; // 錯誤,count並不是表字段,而是算出來的值,where不認識
    select count(*) as count from users group by id where count > 0 ; // 正確

  - 總結來說

    where 可以使用的,是表裏的具體字段,而聚合函數count(`field`)/avg(`field`)等等,它們算出來的都不是表裏的字段,當然不能使用。

    而 having 的過濾條件是之前已經檢索出來的數據。

7:當啟動事務的時候,兩條語句是相互不影響的

  - 比如在終端 A / B 中,啟動了同樣的一個事務。

    - 在 A 中修改了 user 的 name 為 李四 。

    - 這時候 A 終端查詢這條記錄的 name 是李四。

    - 但是在 B 終端中查詢的 name 還是張三

  也就是說,未提交的事務是不會影響其他事務的。

2018/07/26 《SQL 必知必會》 學習筆記