美文网首页
MySQL 查询模型

MySQL 查询模型

作者: patiencing | 来源:发表于2017-04-05 03:54 被阅读0次

    缘起

    从"燕十八"接触到 "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..."也可以.


    参考文章


    文章历史

    • 2016/10/21 (第一次发布)
    • 2017/03/19 修改"理解 where 1"章节, 避免歧义; 增加"参考文章"章节

    如果你觉得我的文章对你有用, 请打个"喜欢", 或者给些改进的建议 _

    相关文章

      网友评论

          本文标题:MySQL 查询模型

          本文链接:https://www.haomeiwen.com/subject/bnctattx.html