【总结记录】《MySQL必知必会》读后笔记,结合 leetcode 例题理解
生活随笔
收集整理的這篇文章主要介紹了
【总结记录】《MySQL必知必会》读后笔记,结合 leetcode 例题理解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 一. 《MySQL知會》讀后筆記
- 1. 零散的前文知識
- 2. 連接數據庫
- 3. 檢索數據(重點開始了)
- 4. 排序、過濾數據
- 5. 通配符、正則表達式
- 6. 匯總數據
- 7. 分組數據
- (1)GROUP BY(數據分組)
- (2)HAVING (過濾分組)
- (3)GROUP BY 和 ORDER BY 的區別
- 8. 子查詢 && 聯結
- (1)子查詢
- (2)聯結
- (3)高級聯結
- 9. 組合查詢
- 二. leetcode 實戰
這篇文章主要是為了學習查詢的 sql 語句~
主要是《MySQL必知必會》的筆記,也可能會加入其他額外查詢的知識
結合 leetcode 的 sql 例題理解
一. 《MySQL知會》讀后筆記
1. 零散的前文知識
-
數據庫表名唯一
-
主鍵(一列、或一組列):唯一區分表中各行,需要滿足條件:
- 任意兩行都不具有相同主鍵值
- 每個行都要有主鍵(主鍵列不允許NULL值)
-
主鍵的好習慣:(主要就是保持主鍵值穩定啦)
- 不更新主鍵列中的值
- 不重用主鍵列的值
- 不在主鍵列中使用可能會更改的值
-
為什么用 MySQL?
- 開源,免費
- 性能好,執行快
- 可信賴、簡單
2. 連接數據庫
安裝、開啟 MySQL 之類的內容,可以去其他博客看看,我這里就不造輪子了= =
tips:自動增量 auto_increment,用于訂單編號、用戶ID等地方。這個屬性會讓 MySQL 自動地為每個行分配下一個可用編號。
3. 檢索數據(重點開始了)
- SQL 語句的結束:用分號‘;'結束
- 大小寫:不區分,但是建議關鍵字大寫,列和表名小寫(可讀性高)
- 空格和換行:被省略,但是可以用來增加可讀性
- 檢索多個列:用逗號 ‘,’
- 檢索所有列:用 * 通配符(不必要就不用,會降低檢索和應用程序的性能)
- 檢索不同的行:用 DISTINCT 關鍵字
注意:DISTINCT 應用于所有列,而非只是前置列(見下列代碼)
- 限制結果:LIMIT 子句,只返回第一行或前幾行(也可以選定開始行)
- 使用完全限定的表名:可以完全限定表名來引用列
4. 排序、過濾數據
- ORDER BY 子句:默認升序,可以通過 DESC 關鍵字變成降序
- 過濾數據 WHERE:
- 空值檢查:對于 NULL,需要用 IS NULL,而 = NULL 是不行的。(IS NOT NULL同理)
- NULL 與不匹配:過濾時,NULL 一定會被過濾,因為數據庫不知道它們是否匹配,所以匹配過濾、不匹配過濾時都不會返回它們
- AND、OR 操作法:用法見代碼,注意 AND 優先級比 OR 高,建議用括號
- IN 操作符:指定范圍,等同于 OR,優點:
- NOT 操作符:唯一功能,否定之后跟的所有條件。對于復雜子句很有用。
5. 通配符、正則表達式
這塊感覺用得不多,簡單寫寫吧
- LIKE 操作符:后跟通配符(百分號通配符、下劃線通配符)
- 百分號通配符:% 表示任何字符出現任意次數
- 下劃線通配符:_ 只能匹配單個字符,而不是多個字符
- 注意:使用通配符所花時間更長,不要過度使用
- 正則表達式:用于匹配文本的特殊的串,可用于查找、替換、提取等功能的一種特殊語言
6. 匯總數據
- 有平均值、計數、最大值、最小值、總和等
7. 分組數據
注意 GROUP BY 和 HAVING 的作用區別噢!
(1)GROUP BY(數據分組)
- 必須出現在 WHERE 子句之后,ORDER BY 子句之前
- 代碼示例:
(2)HAVING (過濾分組)
- WHERE 過濾的是行,而不是分組,因此我們需要引入 HAVING 來進行分組的過濾。
- 也就是說:WHERE 與 HAVING 的區別在于過濾對象(行 or 分組)
- HAVING 支持所有的 WHERE 操作符
- 代碼示例(引用上面 GROUP BY 的例子):
(3)GROUP BY 和 ORDER BY 的區別
- ORDER BY 是排序的唯一方法
| 作用 | 排序產生的輸出 | 分組行,但輸出可能不是分組的順序 |
| 不一定 | 必須使用每個選擇列表達式 |
8. 子查詢 && 聯結
一般來說子查詢更好理解,聯結效率更高
(1)子查詢
- 總是從內向外處理。
- 并不總是最有效方法
- 最常見的使用是WHERE子句的 IN 操作符中。
- 代碼例子
- 可以由此寫出功能強、且靈活的 SQL 語句
- 對于嵌套個數沒有限制,但是由于性能限制,不能嵌套太多的子查詢。
(2)聯結
- 這是 SQL 最強大的功能之一噢~
- 外鍵:某個表中的一列,包含另一個表的主鍵值,定義了兩個表之間的關系。好處如下:
- 信息不重復,不浪費時間、空間
- 外鍵對應表格的信息變動,只需改變其表的值,以它為外鍵的表則不被干擾(因為其他表只管外鍵嘛!而外鍵是對應表格的主鍵,因此不會改變)
- 因為數據無重復,因此可以保證數據一致性
- 總之,關系數據可以有效地存儲和方便地處理。因此關系型數據庫的可伸縮性遠比非關系型數據庫要好。
可伸縮性:能夠適應不斷增加的工作量而不失敗(資本家狂喜)
- 為什么要使用聯結?:
為了使用單條 SELECT 語句,檢索出存儲在多個表中的數據 - 創建方法:規定要聯結的所有表,以及它們如何聯結即可。
- 笛卡爾積:由沒有聯結條件的表關系返回的結果(檢索出的行的數目的表1行數 * 表2行數
- 目前為止所用的聯結稱為等值聯結,也稱為內部聯結,可以使用這樣的語法實現
- 聯結多個表:聯結表的數目無限制,但是越多越耗費資源,下降性能
- 多做實驗:為實現任一SQL操作,一般存在不止一種方法。性能可能會受操作類型、表中數據量、是否存在索引或鍵,以及其他一些條件的影響。
(3)高級聯結
- 使用表別名:主要理由有兩個:
- 縮短 SQL 語句
- 允許在單條 SELECT 語句中,多次使用相同的表
- 自聯結:同表子查詢,用自聯結替代會更好。(見下兩SQL語句對比)
- 外部聯結:聯結包括了相關表中沒有關聯行的行。
某些場景需要使用,比如列出所有產品,以及訂購數量,包括 沒有人訂購的產品 - 用 OUTER JOIN。需要指定左聯、還是右聯(LEFT、RIGHT)
9. 組合查詢
沒咋用過,簡單寫寫= =
- 需要使用組合查詢的兩種情況:
- 在單個查詢中,從不同的表返回類似結構的數據
- 對單個表執行多個查詢,按單個查詢返回數據
- 用 UNION,可以組合多個 SELECT 語句,將它們的結果組合成單個結果集
- 使用方法:很簡單,在 SELECT 語句之間放上 UNION 即可
- 列數據類型必須兼容,但不必完全相同
- UNION 會自動去除重復行
- 如果不想去除重復行,可以用 UNION ALL
- 對 UNION 組合查詢,只能用一條 ORDER BY 子句,必須出現在最后一條 SELECT 語句之后
二. leetcode 實戰
175. 組合兩個表
- 考察外聯結性質:可以包括沒有關聯的行。
176. 第二高的薪水
- 子查詢,先找出第一高的薪水,再依此作 WHERE 條件篩數據
181.超過經理收入的員工
- 自聯結!組合成 < 員工信息 + 對應經理信息> 的行即可
(經理:你禮貌嗎?)
182. 查找重復的電子郵箱
- 考察數據分組、分組篩選(思路見注釋)
183. 從不訂購的客戶
- 考察外聯結保持 NULL 值的性質
- 以及 IS NULL 進行空值判斷
184. 部門工資最高的員工
- 第一道 medium 題出現了!
- 考察了內聯結、子查詢、分組以及聚合函數,比較全面的題。難點在于理清思路。
- 關鍵思路:找出 <部門最高工資 - 部門> 的“鍵值對”
596. 超過5名學生的課
- 雖然是 easy,但是也不錯的一道題
- 關鍵點在于:學生在同一門課中不應被重復計算(可能重修,需要去重)
- 考察了 DISTINCT 和聚合函數的結合使用噢!
620. 有趣的電影
- 誒,也還不錯的一道題
- 考察了 ORDER BY、DESC 的使用
結尾:
爆肝了屬于是…沒想到一邊看一邊寫筆記,還是花了一天的時間才整完這篇博客= =
sql 語句得好好記得用法呀~
總結
以上是生活随笔為你收集整理的【总结记录】《MySQL必知必会》读后笔记,结合 leetcode 例题理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编程时程序无错却崩溃_人间真实:程序员的
- 下一篇: 【LeetCode笔记】128. 最长连