阅读 374

mysql查询模型

缘起

从"燕十八"接触到 "MySQL 查询模型",对 SQL 语句的理解有醍醐灌顶之感.
赠人玫瑰, 手有余香, 分享自己对这一模型的理解.

先说结论

把数据库表的"列"看成"变量",把" SQL 查询语句"理解成编程语言中的"流程控制语句".

4 个要点:

  1. 把"列"看成"变量", "变量"是可以计算的;
  2. WHERE是"布尔表达式/判断条件", 它的值为"true/false";
  3. FROM是指定"循环遍历"的范围
  4. WHERE为true时, 就将这一行的数据提取出来;

查询模型

比如对于下面的数据:

id name age
1 ober 89
2 lucy 17
3 lilei 19

SQL 查询语句 SELECT name, age FROM user WHERE id = 2
可以理解成"编程中的循环判断控制语句":

  1. 把"列" (id/name/age) 看成"变量", 程序会循环历遍每行数据;
  2. WHERE是表达式, id = 2是判断条件(布尔表达式), 它的值为"true/false";
  3. 如果判断id = 2为true时, 就执行SELECT name, age,把变量name和age取出来;
  4. 如果判断id = 2为false, 则完成这次判断, 读取下一行, 更新变量为下一行的值, 继续判断;
  5. 所以这句 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..."也可以.



关注下面的标签,发现更多相似文章
评论