缘起
从"燕十八"接触到 "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
(类似于变量)
理解"OFFSET"
数据库表的数据类似用"数组"形式组织, 就像mysqli_fetch_assoc
提取的数组, 数组的索引位置就是从0开始算起. 如果SELECT查询时添加OFFSET 1
条件,将会检索第2行, 而不是第1行, 因为第1个被检索的行是第0行, 而不是第1行;
理解 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..."也可以.
参考文章
文章历史
- 2016/10/21 (第一次发布)
- 2017/03/19 修改"理解
where 1
"章节, 避免歧义; 增加"参考文章"章节
如果你觉得我的文章对你有用, 请打个"喜欢", 或者给些改进的建议 _
网友评论