"Sql"
- SQL.0 一段查詢從需求到上線的決定:追問需求、設定判斷標準、選寫法、補前提、量代價、對邊界與交付
每個決定要決定什麼、決錯之後查詢出現什麼症狀、機制在哪一篇展開,以及這些決定共同依賴的建表時的決定
- Relation(關係)
看到 SQL 教材說「組成一個關係」而不確定它指的是不是資料表時
- 8.2 運算發生的位置:資料庫端與記憶體端的工具、分工條件與 DuckDB
運算留在資料庫端或搬進記憶體端這條分界,怎麼決定工具的形狀、容量上限與失敗形態
- Query Plan(執行計畫)
想知道一段查詢實際會怎麼被執行、或被要求「先看計畫」時
- SQL.1 宣告式的紅利與代價:書寫、求值與執行順序各自由誰決定
SQL 寫結果而不寫算法帶來的後果:同一個問題換書寫順序之後在有無統計資訊時拿到的計畫、求值順序擋下的寫法,以及代價為什麼要向引擎問
- Query Optimizer(查詢最佳化器)
想知道是誰決定了執行順序、或為什麼同一段查詢換個時間變慢時
- SQL.2 子句的求值順序:每一步可用的欄位、語意模型擋下的寫法與各家引擎放寬的寫法
從 FROM 到 LIMIT 每一步可用的欄位與值、聚合放進 WHERE、別名用在 WHERE 與列的條件放進 HAVING 在各家引擎上的結果,以及這幾種寫法換引擎時的表現
- SQL.3 連接的起手式:配對條件的位置與連接種類的選擇
從全部配對縮小與把配對關係寫進 ON 在外連接處分開的原因、配不到的列怎麼決定用內連接、外連接或半連接,以及只提到被保護的表的條件該放的位置
- 8.4 SQL 子句與 pandas 方法的對應:篩選、連接、分組彙總、視窗函數,以及空值、索引與順序的語意差異
SQL 與 DataFrame 共用的關聯代數、同一份資料上兩邊寫法的實測比對,以及照著逐句翻譯會靜默失準的位置
- Outer Join(外連接)
想確認 LEFT / RIGHT / FULL 各自保護哪一側、或連接之後有些人從名單上消失時
- Index(索引)
看到執行計畫寫著走索引或建索引、想知道那是什麼時
- SQL.4 鏈式連接的左運算元:累積方式與外連接的保護範圍
每個 JOIN 的左運算元由哪些表合成、ON 因此引用得到哪些欄位、LEFT 與 RIGHT 各自保護哪些列,以及 WHERE 引用鏈尾的表時哪些列會被撤掉保護
- NULL(空值)
查 NULL 在比較、計數與分組裡各自怎麼表現時
- SQL.5 ON 與 WHERE:連接條件與篩選條件各自的職責
條件寫在連接的配對階段與寫在關係組完之後的篩選階段的差別、外連接的保護在 WHERE 被抵銷的機制,以及判斷一個條件該放哪一邊的測試
- Aggregate Function(聚合函數)
想知道為什麼聚合只能寫在某幾個位置、或連接之後的總和算出來不對時
- SQL.6 連接之後的列數與空缺:列數膨脹、外連接補的 NULL 與三值邏輯
連接讓聚合多算的機制與計數、加總、平均、中位數各自的修法,以及外連接補出來的 NULL 在 count、等號比較、NOT IN 與 NOT EXISTS 上的行為
- SQL.7 表的出現與別名:表名的指稱、別名的作用範圍與自連接
FROM 裡的表名指的是什麼、同名的兩次出現為什麼被引擎擋下、自連接的前後配對、同組比較與層級關係,以及別名取名的依據
- Subquery(子查詢)
看到括號裡還有一個 SELECT、想知道它什麼時候算、算幾次時
- Schema(命名空間義)
看到 permission denied for schema、或想確認這個字指的是表結構還是命名空間時
- SQL.8 IN、EXISTS 與 JOIN:列數、可取用的欄位與 NULL 的處理
同一個「找出有對應資料的那些」的問題用成員判斷、存在性判斷與連接各寫一次的結果,選用的判斷標準,以及子查詢含 NULL 時 NOT IN 與 NOT EXISTS 的分岔
- Query Statistics(統計資訊)
看到「先跑 ANALYZE」、或同一段查詢沒改而某天變慢時,查這一份資料是什麼、誰在用它
- SQL.9 分組鍵的選擇:鍵與一組所代表的對象
外連接之後拿右表欄位當鍵的後果、輸出非分組欄時 MySQL、DuckDB 與 SQLite 的反應、補進鍵的欄位要滿足的函數相依,以及改用 NOT EXISTS 回答的那一類問題
- DDL 與 DML(定義結構與動資料)
看到「這個帳號只需要 DML 權限」或遷移文件把兩者分開講時,查這條界線切在哪裡
- SQL.10 分組與視窗函數:各自的產出、選用的依據與 LAG、LEAD 的相鄰列
GROUP BY 與視窗函數算完之後原本的列還在不在、依結果的一列代表什麼選用哪一個、視窗函數的值怎麼拿來當篩選條件,以及 LAG 取相鄰列時分區、排序鍵與距離條件各自要確認的事
- SQL.11 查詢結果的列序:沒有 ORDER BY 時的來源與 ORDER BY 的規定範圍
同一段查詢在建索引前後回不同順序的機制、ORDER BY 在求值順序的位置,以及空值落在哪一端各家的差別
- DataFrame(資料框)
SQL 教材拿 pandas 或資料框當對照時,查 DataFrame 是什麼、它與資料表差在哪
- SQL.12 分頁的排序鍵與接續標記:同分的列、全序與 OFFSET 的代價
每一頁各查一次時同分的列與翻頁途中的寫入怎麼造成重複與遺漏、排序鍵補到兩兩可分的條件、展開式與列值式的接續標記條件在排序方向上的差別,以及 OFFSET 隨頁數成長的代價
- Relational Algebra(關聯代數)
看到「子句其實是某個運算」或想知道 SQL 的規則從哪裡來時,查這一層在底下的是什麼
- SQL.13 查詢的合法性與答案的正確性:引擎檢查的範圍、答案錯掉的成因與查證方法
合法與問對了分別由誰負責、答案錯掉時引擎為什麼不報錯,以及靜態分析、約束與反例資料各自判得出哪些錯
- Constraint(約束)
看到「這個保證要來自約束而不是來自習慣」,或想確認某一欄會不會出現 NULL 時,查這一層由誰擋
- Sargable(可走索引的條件形狀)
索引存在而計畫仍走全表掃描時,查條件的寫法有沒有擋住那個索引
- SQL.14 識別字的規則:各家的大小寫摺疊、引號與保留字
表名與欄名送進引擎之後被怎麼改寫、PostgreSQL 與 SQLite、DuckDB 在引號上的差別、MySQL 的反引號,以及全部不加引號、全部加引號與混用各自在換引擎時的後果
- SQL.15 字串比較與 collation:相等、排序、LIKE 與索引可用性
同一段等值條件在各家回不同的列的原因、LIKE 與等號何時分岔、索引與條件的比較規則怎麼對上,以及規則該寫在哪一層
- Cartesian Product(笛卡兒積)
看到 CROSS JOIN、或結果的列數遠多於預期時,查這個運算什麼時候會被展開
- Database Engine(資料庫引擎)
文章說「引擎決定」「換一家引擎就不同」時,查那是哪一個層次的決定
- SQL.16 SQL 的權限模型:角色、GRANT 的授權單位與最小權限
新角色的預設權限、讀寫各自授權與收回的方式、建立物件的權限落在 schema 這一層,以及最小權限在應用程式帳號上成立的前提
- Semantic Model(語意模型)
文章說「模型定死」「符合語意模型」時,查那套規則是什麼、由誰保證
- SQL.17 查詢的代價:資料分布、索引與寫法各自的影響
找重複值的分組、自連接與 EXISTS 在有無索引與不同重複次數下的實測時間與計畫,以及比較查詢快慢時要補上的資料量、分布、索引與統計資訊
- Cardinality 與 Selectivity(基數與選擇率)
看到「這一欄基數太低、索引沒用」,或想知道最佳化器憑什麼決定要不要走索引時,查這兩個數各自量什麼
- SQL.18 外鍵與參照完整性:宣告、生效與查詢得到的保證
外鍵擋下哪些寫入與 NULL 的放行、SQLite、PostgreSQL 與 MySQL 讓宣告與生效分開的位置與查法、約束生效後查詢省掉的判斷、父列刪除時子列的去向,以及外鍵涵蓋不到的寫入與規則
- Semi-join 與 Anti-join(半連接與反連接)
看到 EXISTS 或 NOT EXISTS 時,查它在代數裡對應哪個運算、以及列數上限為什麼是左邊那張表的列數
- SQL.19 引擎寬鬆度與可攜性:各家對同一組寫法的差異、分級與處理時機
SQLite、DuckDB、PostgreSQL 與 MySQL 在未分組欄位、WHERE 用別名、同表未取別名、字串比對與空值排序上的實測對照,差異從當場報錯到完全靜默的分級,以及依目標組態數決定哪幾級差異在寫的當下處理
- SQL.20 關鍵字的宣告與引擎的行為:宣告落空的形態與查證
LEFT JOIN、CROSS JOIN、DISTINCT、COALESCE 與表的別名各自對讀的人宣告了什麼、宣告落空時下一個修改的人付出什麼代價,以及把關鍵字換成最弱的版本再跑一次的查證動作
- SQL.21 可讀性與執行代價:兩者一致與分岔的情形
寫法差異在什麼情形下免費、什麼情形下分岔,以及分岔時該動查詢還是動 schema
- SQL.22 查詢設計的完整示範:把「哪幾天氣溫比前一天高」從需求做到上線
以「哪幾天氣溫比前一天高」為例,把一句業務的話追問成可驗收的資料問題,比較自連接、視窗函數與相關子查詢各自押的前提與實測代價,以及需求沒說而資料會有的重複紀錄、時區與補登
- SQL 各篇共用的範例資料庫:一家小書店的顧客、訂單與評價表
SQL 各篇共用的顧客、訂單與評價表的建表語句與初始資料,以及各篇輸出所用的引擎版本、錯誤訊息與列序的閱讀約定
- 終端機 SQL 客戶端:harlequin、lazysql 與 pgcli/litecli 的選型
要在純文字終端機連資料庫跑查詢、在全螢幕 TUI(harlequin/lazysql)與增強型 REPL(pgcli/litecli)之間選、或遇到遠端連線的 SSL driver 問題時回來讀
- SQLite SQL Dialect and Index Limits
SQLite type affinity、NULL / date handling、constraint、index、query planner 與 PostgreSQL / MySQL 差異