"Join"
- SQL.3 連接的起手式:配對條件的位置與連接種類的選擇
從全部配對縮小與把配對關係寫進 ON 在外連接處分開的原因、配不到的列怎麼決定用內連接、外連接或半連接,以及只提到被保護的表的條件該放的位置
- Outer Join(外連接)
想確認 LEFT / RIGHT / FULL 各自保護哪一側、或連接之後有些人從名單上消失時
- SQL.4 鏈式連接的左運算元:累積方式與外連接的保護範圍
每個 JOIN 的左運算元由哪些表合成、ON 因此引用得到哪些欄位、LEFT 與 RIGHT 各自保護哪些列,以及 WHERE 引用鏈尾的表時哪些列會被撤掉保護
- SQL.5 ON 與 WHERE:連接條件與篩選條件各自的職責
條件寫在連接的配對階段與寫在關係組完之後的篩選階段的差別、外連接的保護在 WHERE 被抵銷的機制,以及判斷一個條件該放哪一邊的測試
- SQL.6 連接之後的列數與空缺:列數膨脹、外連接補的 NULL 與三值邏輯
連接讓聚合多算的機制與計數、加總、平均、中位數各自的修法,以及外連接補出來的 NULL 在 count、等號比較、NOT IN 與 NOT EXISTS 上的行為
- SQL.7 表的出現與別名:表名的指稱、別名的作用範圍與自連接
FROM 裡的表名指的是什麼、同名的兩次出現為什麼被引擎擋下、自連接的前後配對、同組比較與層級關係,以及別名取名的依據
- SQL.8 IN、EXISTS 與 JOIN:列數、可取用的欄位與 NULL 的處理
同一個「找出有對應資料的那些」的問題用成員判斷、存在性判斷與連接各寫一次的結果,選用的判斷標準,以及子查詢含 NULL 時 NOT IN 與 NOT EXISTS 的分岔
- SQL.9 分組鍵的選擇:鍵與一組所代表的對象
外連接之後拿右表欄位當鍵的後果、輸出非分組欄時 MySQL、DuckDB 與 SQLite 的反應、補進鍵的欄位要滿足的函數相依,以及改用 NOT EXISTS 回答的那一類問題
- Cartesian Product(笛卡兒積)
看到 CROSS JOIN、或結果的列數遠多於預期時,查這個運算什麼時候會被展開
- Semi-join 與 Anti-join(半連接與反連接)
看到 EXISTS 或 NOT EXISTS 時,查它在代數裡對應哪個運算、以及列數上限為什麼是左邊那張表的列數
- SQL.20 關鍵字的宣告與引擎的行為:宣告落空的形態與查證
LEFT JOIN、CROSS JOIN、DISTINCT、COALESCE 與表的別名各自對讀的人宣告了什麼、宣告落空時下一個修改的人付出什麼代價,以及把關鍵字換成最弱的版本再跑一次的查證動作