写在前面:最近的工作主要是写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. 51nod 1486 大大走格子——dp

    有一个h行w列的棋盘,里面有一些格子是不能走的,现在要求从左上角走到右下角的方案数. Input 单组测试数据. 第一行有三个整数h, w, n(1 ≤ h, w ≤ 10^5, 1 ≤ n ≤ 20 ...

  2. POJ 2991 Crane (线段树)

    题目链接 Description ACM has bought a new crane (crane -- jeřáb) . The crane consists of n segments of v ...

  3. signal, sigaction,信号集合操作

    信号是与一定的进程相联系的,而建立其信号和进程的对应关系,这就是信号的安装登记. Linux主要有两个函数实现信号的安装登记:signal和sigaction.其中signal在系统调用的基础上实现, ...

  4. Tomcat debug模式下特别慢但是run正常处理方法

    转载自:http://blog.csdn.net/builderwfy/article/details/50785749 到网上查资料发现这是由eclipse和tomcat交互时,在debug模式启动 ...

  5. java实现数据库分页

    /*** * 工具类 * @param pageIndex //页码 * @param pageSize//每页数据的条数 * @param rowCount//总的数据条数 * @return */ ...

  6. 安装Hadoop2.7和hive2.0以及redis

    安装过程很简单,主要记录期间碰到的问题: 安装过程: 下载安装包: hadoop:http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7. ...

  7. 8:django sessions(会话)

    django会话 django提供对匿名会话全方位的支持,会话框架可以存储和检索每个站点访问者的任意数据.会话数据是存储在服务器端的,并且简要了发送和接受cookie的过程,cookies只包含一个s ...

  8. spring使用aop需要的jar包,和常见异常

    3.0以后spring不再一起发布aop依赖包,需要自己导入: 必须包: 这几个jar包分别为 1.org.springframework.aop-3.1.1.RELEASE  这个是spring的 ...

  9. Java单线程多实例和多线程多实例

    最近写了一个程序,是采用多线程往redis里面写入数据,想统计一下一共写了多少条数据,于是用了一个static的全局变量count来累加,这块代码抽象出来就是这样的: public class Mul ...

  10. [转载] login shell和non-login shell

    原文地址:这里. 在linux中我们知道当你输入一条命令的时候,命令的查找是根据环境变量PATH来查找的,如果想知道一个命令的源文件存放在什么地方可以用which或whereis指令.那么PATH变量 ...