zoukankan      html  css  js  c++  java
  • SQL查询中关键词的执行顺序

    写在前面:最近的工作主要是写SQL脚本,在编写过程中对SQL的执行和解析过程特别混乱不清,造成了想优化却无从下手。为此专门在网上找博文学习,并做了如下总结。

     

    1、查询中常用到的关键词有:

    SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY

    其中,SELECT与FROM是必需的,其他关键词则是可选的。

    2、这些关键词的书写顺序:

    SELECT 字段列表

    FROM 表名

    WHERE 记录筛选条件

    GROUP BY 分组字段列表

    HAVING 分组筛选条件

    ORDER BY 排序字段列表

    3、WHERE与HAVING的区别:

    WHERE是对记录进行筛选;而HAVING是对按GROUP BY进行分组后的组进行筛选。

    HAVING只有在使用GROUP BY 后才能使用。

    4、GROUP BY的两个作用:

    第一个作用是,将从表中取出的记录按照一个或者多个字段进行分组;

    第二个作用是,去重,其本质仍然是分组。

    5、这些关键词的解析/执行顺序:

    FROM->WHERE->GROUP BY->HAVING->SELECT->ORDER BY

    具体的说:

    FROM:组装来自不同数据源的记录

    WHERE:根据指定的条件过滤上一步检索出的记录

    GROUP BY:对上面过滤后的记录按指定条件分组

    SUM/AVG/COUNT:使用聚合函数进行计算

    HAVING:对所有分组根据指定条件进行过滤

    SELECT:从上一步过滤后的各个分组记录中提取指定查询的字段列表(包括聚合字段、计算字段、表达式字段等)

    ORDER BY:对上一步查询得到的结果集按照排序字段列表进行排序,并输出排序结果

    6、GROUP BY 字段1,字段2——先对所有记录按照字段1进行分组,然后对分组后的结果再在没组内按照字段2分组。

    7、ORDER BY 字段1,字段2——先按照字段1进行排序,再按照字段2进行排序。

    8、排序规则关键字:ASC(升序,默认)、DESC(降序)。

    9、COUNT关键字,作计数使用。COUNT(*)是做候选数据集的整体计数,COUNT(字段)是对某字段进行计数。如果某列出现NULL值时,COUNT(*)会算入该列,COUNT(字段)则不会算入该列。

     

    举例:

    在学生成绩表中,把班级为1班的学生成绩按照学生姓名分组,并且筛选分组结果,汇总计算各个学生的总成绩,选出总成绩大于600分的学生列表,并按照总分从高到低排列。

    SQL语句如下:

    select std_name, sum(score) as sum_score

    from grade_table

    where class_id=1

    group by std_name

    having sum(score)>600

    order by 2 asc

    在上面的示例中SQL语句的执行顺序如下:

    ①首先执行FROM子句,从grade_table表检索记录;

    ②执行WHERE子句,筛选出grade_table表中class_id=1的所有记录;

    ③执行GROUP BY子句,把grade_table表按std_name列进行分组;

    ④计算SUM()聚集函数,求出每个std_name的score之和;

    ⑤执行HAVING子句,筛选出sum(score)大于600的分组;

    ⑥提取std_name,sum(score)两个字段,产生新的结果集;

    ⑦执行ORDER BY子句,把⑥的结果集按sum(score)字段升序排列。

     

    参考资料:

    [1]查询语句中select from where group by having order by的执行顺序

    [2]sql关键字的解释执行顺序

    [3]sql关键词执行先后顺序

    感谢!

    文中如有错误和描述不当,欢迎指正!

  • 相关阅读:
    二十二、Linux 进程与信号---进程创建
    二十一、Linux 进程与信号---进程查看和进程状态、进程调度和进程状态变化、进程标识
    二十一、Linux 进程与信号---进程资源限制
    二十、Linux 进程与信号---非局部跳转
    AOSP android 源码下载
    十九、Linux 进程与信号---环境表
    十八、Linux 进程与信号---进程介绍
    09 scroll系列_简单的封装动画函数(变速(缓动)的动画函数_getComputedStyle函数_复杂的动画函数封装_颜色相关_案例_client系列
    A 第二课 栈_队列_堆
    pycharm 的快捷键
  • 原文地址:https://www.cnblogs.com/hbsygfz/p/4231828.html
Copyright © 2011-2022 走看看