缘起
从 "燕十八 http://www.yanshiba.com/" 接触到 "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..." 也可以.
来源: https://juejin.im/post/5c87241ff265da2dd168a206