緣起
從"燕十八"接觸到 "MySQL 查詢模型",對(duì) SQL 語(yǔ)句的理解有醍醐灌頂之感.
贈(zèng)人玫瑰, 手有余香, 分享自己對(duì)這一模型的理解.
先說(shuō)結(jié)論
把數(shù)據(jù)庫(kù)表的"列"看成"變量",把" SQL 查詢語(yǔ)句"理解成編程語(yǔ)言中的"流程控制語(yǔ)句".
4 個(gè)要點(diǎn):
- 把"列"看成"變量", "變量"是可以計(jì)算的;
-
WHERE
是"布爾表達(dá)式/判斷條件", 它的值為"true/false"; -
FROM
是指定"循環(huán)遍歷"的范圍 - 當(dāng)
WHERE
為true時(shí), 就將這一行的數(shù)據(jù)提取出來(lái);
查詢模型
比如對(duì)于下面的數(shù)據(jù):
id | name | age |
---|---|---|
1 | ober | 89 |
2 | lucy | 17 |
3 | lilei | 19 |
SQL 查詢語(yǔ)句 SELECT name, age FROM user WHERE id = 2
可以理解成"編程中的循環(huán)判斷控制語(yǔ)句":
- 把"列" (id/name/age) 看成"變量", 程序會(huì)循環(huán)歷遍每行數(shù)據(jù);
-
WHERE
是表達(dá)式,id = 2
是判斷條件(布爾表達(dá)式), 它的值為"true/false"; - 如果判斷
id = 2
為true時(shí), 就執(zhí)行SELECT name, age
,把變量name和age取出來(lái); - 如果判斷
id = 2
為false, 則完成這次判斷, 讀取下一行, 更新變量為下一行的值, 繼續(xù)判斷; - 所以這句 SQL 語(yǔ)句可以理解成**"在 user 中遍歷檢索, 當(dāng)
WHRER uid = 2
為真時(shí), 執(zhí)行SELECT name, age
:
for (i = 0; i < count(*), i++){
if (uid = 2){
SELECT name, age;
}
}
延伸
理解"計(jì)算字段"
既然將"列"理解成"變量",而"變量"是可以計(jì)算的, 就很容易理解"計(jì)算字段"的概念:
- "拼接字段"就是字符串運(yùn)算符, 或者說(shuō)格式化輸出
- 算數(shù)計(jì)算:
SELECT name, age+1 FROM user WHERE uid=2 /* 輸出時(shí)age+1 */
理解"別名"
"別名",也是"變量", 比如
SELECT AVG(prod_price) AS avg_price
FROM Products;
表示檢索出Products表中所有產(chǎn)品的平均價(jià)格, 該平均價(jià)格賦給別名avg_price
(類似于變量)
理解 where 1
提問:
SQL 查詢語(yǔ)句 SELECT * FROM user WHERE 1
將會(huì)如何執(zhí)行?
解答:
因?yàn)?WHERE 是表達(dá)式/判斷條件, 而 1
表示 true
, 所以判斷條件永遠(yuǎn)為 true
,因此前面的 SQL 語(yǔ)句會(huì)遍歷檢索出所有的數(shù)據(jù).
如果換成 SELECT * FROM user WHERE 0
或者 SELECT * FROM user WHERE false
, 就不執(zhí)行 SELECT
, 不返回?cái)?shù)據(jù).
PS. 不光是 1 表示 true, "2, 3, 4..."也表示 true.
參考文章
文章歷史
- 2016/10/21 (第一次發(fā)布)
- 2017/03/19 修改"理解
where 1
"章節(jié), 避免歧義; 增加"參考文章"章節(jié)
如果你覺得我的文章對(duì)你有用, 請(qǐng)打個(gè)"喜歡", 或者給些改進(jìn)的建議 _