緣起
從"燕十八"接觸到 "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
可以理解成"編程中的循環判斷控制語句":
- 把"列" (id/name/age) 看成"變量", 程序會循環歷遍每行數據;
-
WHERE
是表達式,id = 2
是判斷條件(布爾表達式), 它的值為"true/false"; - 如果判斷
id = 2
為true時, 就執行SELECT name, age
,把變量name和age取出來; - 如果判斷
id = 2
為false, 則完成這次判斷, 讀取下一行, 更新變量為下一行的值, 繼續判斷; - 所以這句 SQL 語句可以理解成**"在 user 中遍歷檢索, 當
WHRER uid = 2
為真時, 執行SELECT name, age
:
for (i = 0; i < count(*), i++){
if (uid = 2){
SELECT name, age;
}
}
延伸
理解"計算字段"
既然將"列"理解成"變量",而"變量"是可以計算的, 就很容易理解"計算字段"的概念:
- "拼接字段"就是字符串運算符, 或者說格式化輸出
- 算數計算:
SELECT name, age+1 FROM user WHERE uid=2 /* 輸出時age+1 */
理解"別名"
"別名",也是"變量", 比如
SELECT AVG(prod_price) AS avg_price
FROM Products;
表示檢索出Products表中所有產品的平均價格, 該平均價格賦給別名avg_price
(類似于變量)
理解 where 1
提問:
SQL 查詢語句 SELECT * FROM user WHERE 1
將會如何執行?
解答:
因為 WHERE 是表達式/判斷條件, 而 1
表示 true
, 所以判斷條件永遠為 true
,因此前面的 SQL 語句會遍歷檢索出所有的數據.
如果換成 SELECT * FROM user WHERE 0
或者 SELECT * FROM user WHERE false
, 就不執行 SELECT
, 不返回數據.
PS. 不光是 1 表示 true, "2, 3, 4..."也表示 true.
參考文章
文章歷史
- 2016/10/21 (第一次發布)
- 2017/03/19 修改"理解
where 1
"章節, 避免歧義; 增加"參考文章"章節
如果你覺得我的文章對你有用, 請打個"喜歡", 或者給些改進的建議 _