2018/07/26 《SQL 必知必會》 學習筆記
讀書總結:
《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 都可以使用
selectid,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 必知必會》 學習筆記