從"燕十八"接觸到 "MySQL 查詢模型",對 SQL 語句的理解有醍醐灌頂之感.
贈人玫瑰, 手有餘香, 分享本身對這一模型的理解.mysql
把數據庫表的"列"當作"變量",把" SQL 查詢語句"理解成編程語言中的"流程控制語句".sql
4 個要點:數據庫
WHERE
是"布爾表達式/判斷條件", 它的值爲"true/false";FROM
是指定"循環遍歷"的範圍WHERE
爲true時, 就將這一行的數據提取出來;好比對於下面的數據:編程
id | name | age |
---|---|---|
1 | ober | 89 |
2 | lucy | 17 |
3 | lilei | 19 |
SQL 查詢語句 SELECT name, age FROM user WHERE id = 2
能夠理解成"編程中的循環判斷控制語句":數組
WHERE
是表達式, id = 2
是判斷條件(布爾表達式), 它的值爲"true/false";id = 2
爲true時, 就執行SELECT name, age
,把變量name和age取出來;id = 2
爲false, 則完成此次判斷, 讀取下一行, 更新變量爲下一行的值, 繼續判斷;WHRER uid = 2
爲真時, 執行SELECT name, age
:for (i = 0; i < count(*), i++){
if (uid = 2){
SELECT name, age;
}
}
複製代碼
既然將"列"理解成"變量",而"變量"是能夠計算的, 就很容易理解"計算字段"的概念:bash
SELECT name, age+1 FROM user WHERE uid=2 /* 輸出時age+1 */
複製代碼
"別名",也是"變量", 好比編程語言
SELECT AVG(prod_price) AS avg_price FROM Products;
複製代碼
表示檢索出Products表中全部產品的平均價格, 該平均價格賦給別名avg_price
(相似於變量)fetch
數據庫表的數據相似用"數組"形式組織, 就像mysqli_fetch_assoc
提取的數組, 數組的索引位置就是從0開始算起. 若是SELECT查詢時添加OFFSET 1
條件,將會檢索第2行, 而不是第1行, 由於第1個被檢索的行是第0行, 而不是第1行;ui
提問:
SQL 查詢語句 SELECT * FROM user WHERE 1
將會如何執行?spa
解答:
由於 WHERE 是表達式/判斷條件, 而 1
表示 true
, 因此判斷條件永遠爲 true
,所以前面的 SQL 語句會遍歷檢索出全部的數據.
若是換成 SELECT * FROM user WHERE 0
或者 SELECT * FROM user WHERE false
, 就不執行 SELECT
, 不返回數據.
PS. 不光是 1 表示 true, "2, 3, 4..."也能夠.