写在前面:最近的工作主要是写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关键词执行先后顺序

感谢!

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

SQL查询中关键词的执行顺序的更多相关文章

  1. SQL查询中关键字的执行顺序

    SQL语句中的每个关键字都按照顺序往下执行,而每一步操作会生成一个临时表,最后的临时表就是最终结果: FROM <left_table>:from子句返回初始结果集 <join_ty ...

  2. MySQL数据库之单表查询中关键字的执行顺序

    目录 MySQL数据库之单表查询中关键字的执行顺序 1 语法顺序 2 执行顺序 3 关键字使用语法 MySQL数据库之单表查询中关键字的执行顺序 1 语法顺序 select distinct from ...

  3. sql查询原理和Select执行顺序

    一 sql语句的执行步骤 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义. 2) 语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限. 3)视图转换,将涉及视图的 ...

  4. {MySQL的逻辑查询语句的执行顺序}一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析

    MySQL的逻辑查询语句的执行顺序 阅读目录 一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SEL ...

  5. 关于sql和MySQL的语句执行顺序(必看!!!)

    今天遇到一个问题就是mysql中insert into 和update以及delete语句中能使用as别名吗?目前还在查看,但是在查阅资料时发现了一些有益的知识,给大家分享一下,就是关于sql以及My ...

  6. 关于sql和MySQL的语句执行顺序

    sql和mysql执行顺序,发现内部机制是一样的.最大区别是在别名的引用上. 一.sql执行顺序 (1) from (3) join (2) on (4) where (5) group by(开始使 ...

  7. SQL Select语句完整的执行顺序(转)

    SQL Select语句完整的执行顺序: 1.from子句组装来自不同数据源的数据: 2.where子句基于指定的条件对记录行进行筛选: 3.group by子句将数据划分为多个分组: 4.使用聚集函 ...

  8. 170607、SQL Select语句完整的执行顺序

    SQL Select语句完整的执行顺序: 1.from子句组装来自不同数据源的数据: 2.where子句基于指定的条件对记录行进行筛选: 3.group by子句将数据划分为多个分组: 4.使用聚集函 ...

  9. (转)关于sql和MySQL的语句执行顺序(必看!!!)

    原文:https://blog.csdn.net/u014044812/article/details/51004754 https://blog.csdn.net/j080624/article/d ...

随机推荐

  1. bzoj 1057 单调栈

    首先我们可以枚举每个一点,然后向下一直拓展到不能拓展为止,然后向下拓展的同时我们可以算出来向左最多拓展的个数,用单调栈来维护一个上升的序列,这样就类似与悬线法找最大01子矩阵了,但是对于这题01交替来 ...

  2. 子DIV块中设置margin-top时影响父DIV块位置的解决办法?

    解决方法: 1.修改父元素的高度,增加padding-top样式模拟(padding-top:1px:常用) 2.为父元素添加overflow:hidden:样式即可(完美) 3.为父元素或者子元素声 ...

  3. 原生ES-Module在浏览器中的尝试

    其实浏览器原生模块相关的支持也已经出了一两年了(我第一次知道这个事情实在2016年下半年的时候) 可以抛开webpack直接使用import之类的语法 但因为算是一个比较新的东西,所以现在基本只能自己 ...

  4. js_实现给未来元素添加事件。

    未来元素:不是一个页面上的元素,是通过js或者通过后台直接渲染在页面上的元素,也就是说这些元素不是直接写在document中的. 1.对于未来元素,我们想直接用js或者jq操作它们是不起作用的. $( ...

  5. 变量对象vs活动对象

    这是我见过描述的最为详尽的关于变量对象.活动对象以及闭包的解析,来自知乎,感谢答主: 作者:闭家锁链接:https://www.zhihu.com/question/36393048/answer/7 ...

  6. 6.0docker Dockerfile文件

    指令格式 #注释 FROM :基础镜像 MAINTAINER:镜像的作者信息 RUN :指定(构建过程中)当前镜像中运行的命令 EXPOSE :指定运行镜像的容器应用程序所使用的端口 容器但不会打开, ...

  7. jq 浏览器窗口大小发生变化时

    当调整浏览器窗口的大小时,发生 resize 事件: $(selector).resize(); 实例 对浏览器窗口调整大小进行计数: $(window).resize(function() { $( ...

  8. LINUX中断学习笔记【转】

    转自:http://blog.chinaunix.net/uid-14825809-id-2381330.html 1.中断的注册与释放: 在 , 实现中断注册接口: int request_irq( ...

  9. selenium===介绍

    selenium 是支持java.python.ruby.php.C#.JavaScript . 从语言易学性来讲,首选ruby ,python 从语言应用广度来讲,首选java.C#.php. 从语 ...

  10. hardseed

    hardseed https://github.com/yangyangwithgnu/hardseed