sql查询语句的处理步骤,代码清单

--查询组合字段
(5)select (5-2) distinct(5-3) top(<top_specification>)(5-1)<select_list>
--连表
(1)from (1-J)<left_table><join_type> join <right_table> on <on_predicate>(1-A)<left_table><apply_type> apply <right_table_expression> as <alias>(1-P)<left_table> pivot (<pivot_specification>) as <alias>(1-U)<left_table> unpivot (<unpivot_specification>) as <alias>
--查询条件
(2)where <where_pridicate>
--分组
(3)group by <group_by_specification>
--分组条件
(4)having<having_predicate>
--排序
(6)order by<order_by_list>

说明:

1、顺序为有1-6,6个大步骤,然后细分,5-1,5-2,5-3,由小变大顺序,1-J,1-A,1-P,1-U,为并行次序。如果不够明白,接下来我在来个流程图看看。

2、执行过程中也会相应的产生多个虚拟表(下面会有提到),以配合最终的正确查询。

sql查询语句的处理步骤,流程图

对于一条Sql语句(主要指的是查询语句)的执行顺序,很多开发人员并不是十分的了解,哪怕已经工作几年的所谓高级开发人员也是一样,对于他们来说,只关心最终得到的结果,并不关心中间的过程,那么了解SqlServer的语句执行过程到底有什么用处的?

1、如果不了解执行过程,下面的Sql语句你认为结果是一样的吗?

select * from Customers AS C
left join Orders AS O
On C.customerid=O.customerid
and C.customerid='FRNDO'
where city ='Madrid'select * from Customers AS C
left join Orders AS O
On C.customerid=O.customerid
where city ='Madrid'
and C.customerid='FRNDO'

如果你了解Sql的执行顺序,这个问题就不难解释了,只不过是On语句和Where语句谁先执行以及On和Where之间是否还有其它执行步骤?

2、下面这两条语句,第一个会提示列where语句中的myorder(select 中起的别名)无效,第二条是可以正常执行的,那问题来了,为什么order by语句中可以使用myorder列而where中就不可以呢?

select C.customerid,C.city,O.orderid as myorder
from Customers AS C
left join Orders AS O
On C.customerid=O.customerid
where myorder >3
order by myorder descselect C.customerid,C.city,O.orderid as myorder
from Customers AS C
left join Orders AS O
On C.customerid=O.customerid
where O.orderid >3
order by myorder desc

Sql语句逻辑执行顺序

一条常用的查询语句应当是包含了下面的几条命令

select distinct top 3  C.customerid, count(O.orderid) as orderCount
from Customers as C
left join Orders as O
ON C.customerid=O.customerid
where C.city='Madrid'
group by C.customerid
having count(O.orderid)>1
order by orderCount desc

1、From阶段

From阶段主要是标识数据来源,处理表运算符(join、apply,pivot等,本文只针对join讲解),以及各个子阶段(包括笛卡尔积、ON筛选器应用、添加外部行[只有外链接才有]);

1.1 join阶段   join分为cross join、inner join、[left join、right join,full join]

cross join只是简单的进行笛卡尔积,如上面的两张表cross join之后的结果如下图(左一);

inner join是在cross join的基础上加入了ON筛选条件,如图(左二和左三),只有ON(C.customerId=O.customerId)为Ture的才会返回

left join 是在 inner join的基础上添加了外部行,在ON阶段获取的数据基础上添加左表(Customer表)中的未满足ON筛选条件的所有行(未在ON阶段出现的),如图(左四)

2、Where 阶段

where 阶段就是对From阶段得到的虚拟表进行进一步的过滤和筛选,和Join中的ON筛选类似,只是比ON筛选器执行的晚,特别对于外链接来说,ON筛选和Where筛选中间还多了一步添加外部行,这里应该可以解释本文开篇提到的第一个问题了。

3、Group By

Group By 只是按照指定的列名对第二步(如果存在)Where阶段得到的虚拟表进行分组,每个分组只有一条数据,一般都是使用聚合函数来计算一些数据,比如上面例子中用按照CustomerId进行分组,用Count获取每个客户的订单数量,然后按照订单数量倒序去排名前三的客户。

4、Having

Having阶段是在第三步(如果存在)分组之后再一次进行过滤,也就是对Group By阶段得到的虚拟结果集进行进一步的筛选过滤,过程和ON、Where类似,只能用在Group BY 之后。

5、Select

Select 阶段则是针对第四步(如果存在)获取的虚拟表的基础上选择需要的列,也就是最终要返回的列,看到这里是不是明白了本文开篇提到的第二个问题,为什么Select中的别名不能再Wher阶段使用,因为Where早于Select,

Select又可以分为几个子阶段,包括(5.1计算表达式,5.2 Distinct,5.3 Top)

6、Order By

Order By 阶段是整个查询的最后阶段也就是根据指定的列名对Select阶段进行排序,这也就是为什么在Order By语句中可以用Select阶段起的别名的原因,不过Order By阶段和上面的5个阶段有个很大的区别,Order By阶段返回的数据集是游标,而上面的5个阶段生成的都是数据表,理解这点很重要,SqlServer的理论基础是集合论,集合中的行之间没有预先定义顺序,它只是成员之间的逻辑组合,成员之间的顺序无关紧要,而对于带有Order By的查询语句,是返回了一个按照特定的顺寻组成的一个对象,成为游标。

最后附上一张Sql语句的执行流程图(图片来源Sql08解密)

SqlServer中sql执行顺序相关推荐

  1. hive中sql执行顺序

    1.from 2.join on 或 lateral view explode(需炸裂的列)  tbl   as  炸裂后的列名 3.where 4.group by  (开始使用select中的别名 ...

  2. SqlServer中Sql语句的逻辑执行顺序

    准备数据 Sql脚本如下,两张表,一张客户表Customers只包含customerid和city字段,一张订单表Orders包含orderid和customerid(关联Customers的cust ...

  3. SQL 执行顺序图解

    目录 执行顺序 数据的关联过程 执行顺序 这是一条标准的查询语句: 这是我们实际上SQL执行顺序: 我们先执行from,join来确定表之间的连接关系,得到初步的数据 where对数据进行普通的初步的 ...

  4. sql笔记1:sql执行优先级和casewhen用法、sql执行顺序

    MySQL 语句中执行优先级--and比or高 例: select * from table where 条件1 AND 条件2 OR 条件3 等价于 select * from table wher ...

  5. java程序基础——SQL执行顺序

    SQL执行顺序 1.from 2.join 3.on 4.where 5. group by(开始使用select中的别名,后面的语句中都可 以使用) 6.avg,sum.... 7.having 8 ...

  6. MySQL高级 - SQL技巧 - SQL执行顺序及正则表达式

    SQL执行顺序 编写顺序 SELECT DISTINCT<select list> FROM<left_table> <join_type> JOIN<rig ...

  7. Unity脚本在层级面板中的执行顺序测试3

    断断续续的写了3篇,以后有时间可以做成一个系列了 前面2篇测试了GameObject的顺序,以及Awake和OnEnable的时机: Unity脚本在层级面板中的执行顺序测试1 http://www. ...

  8. 日志打印、main函数中代码执行顺序

    文章目录 1.设置时区 2.日志打印 3.main函数中代码执行顺序 1.设置时区 我们要设置成 CST 时区,以保证正确地显示日期.时间. 我们常看到的时区有如下几个: PST:美国太平洋标准时间, ...

  9. Hive 优化--SQL执行顺序、Hive参数、数据倾斜 、小文件优化

    优化整体思路 如果资源充足就加资源加内存, 调度链路优化,调整调度顺序,时效性要求高的模型先产出, 数据接入模块,调优数据接入工具sqoop,datax 模型设计质量不高,调整模型,提高质量和复用度, ...

最新文章

  1. avs php,【求助!】小白求个标准反交错AVS脚本和解答困扰我的几个问题!!
  2. P3201 [HNOI2009]梦幻布丁 [启发式合并][set]
  3. Android memory
  4. Hive group by实现-就是word 统计
  5. Python基础概念_7_数据结构
  6. vue实现鼠标悬浮 显示全部内容
  7. vux 组件库首次使用安装
  8. 海豚php表格,表格选取(1.4.3+) · DolphinPHP1.5.0完全开发手册-基于ThinkPHP5.1.41LTS的快速开发框架 · 看云...
  9. 胃net的放大内镜_李锐:内镜下的早癌诊断
  10. linux基础-权限管理,手工添加用户,umask,bash配置文件
  11. 自动化测试——unittest生成HTML测试报告
  12. python文本格式_python处理文本文件并生成指定格式的文件
  13. 《Netty Zookeeper Redis 高并发实战》 图书简介
  14. oracle去除逗号函数,oracle逗号分隔函数
  15. 架构之美:教你如何分析一个接口?
  16. JDK9API网盘下载
  17. Android的发布与更新
  18. 计算机科学技术学院迎新晚会主题,我校计算机科学与技术学院举行迎新晚会
  19. 杰理之检测linein音频输入大小(能量)的方法【篇】
  20. 破解EXCEL工作表保护密码

热门文章

  1. 现代化物流对应术语解释
  2. FPGA实现的SPI协议(二)----基于SPI接口的FLASH芯片M25P16的使用
  3. 学mtml还是html5,图解核苷酸替代模型的选择 – MrMTgui 篇
  4. DSP28379D_ePWM同步触发差分AD
  5. 最短路 (Dijstra) 最短路
  6. JavaScript【判断一个数是否是素数】函数实现
  7. 大会详细日程:O'Reilly AI Conference 北京站
  8. HashMap线程安全性问题
  9. GraphSense介绍
  10. 什么是框架,框架的作用是什么?