当前位置:首页 > 技术文章 > 正文内容

SQL执行顺序(SqlServer)(sql执行的过程是怎样的)

学习SQL这么久,如果突然有人问你SQL的执行顺是怎么样的?是不是很多人会觉得C#、JavaScript都是根据编程顺序来处理的,那么SQL也是根据编程顺序来执行的吗?

No. SQL不同于其它编程语言,在SQL语言中尽管第一个出现是的是Select语句,但是其实数据库第一个被处理的语句是From子句,我们了解了SQL的执行顺序,那么对应我们后边需要学习的Linq会有一定的帮助,我们在最后的时候举一个例子来讲解下。

(8) SELECT (9)DISTINCT<select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) WITH {CUBE|ROLLUP}
(7) HAVING <having_condition>
(10) ORDER BY <order_by_list>
(11) LIMIT <limit_number>

可以看到总的有十一个步骤,每一步的操作都会产生一个虚拟表,该虚拟表作为下一个处理的输入,我们来看下执行顺序:

(1) FROM子句:对FROM子句中前两个表,左表<left_table>和右表<right_table>执行笛卡儿积,产生一个虚拟表VT1;
(2) ON: 对虚拟表VT1进行ON筛选,只有那些符合
<join_condition>的行才被插入到虚拟表VT2;
(3) JOIN: 如果指定了
OUTER JOIN(如LEFT OUTER JOIN、RIGHT OUTER JOIN),那么保留表中未匹配的行作为外部行添加到虚拟表VT2,产生虚拟表VT3。如果FROM子句包含两个以上的表,则对上一个连接生成的结果表VT3和下一个表重复执行步骤1~步骤3,直到处理完所有的表;
(4) WHERE: 对虚拟表VT3应用WHERE过滤条件,只有符合
<where_condition>的记录才会被插入虚拟表VT4;
(5) GROUP By: 根据GROUP BY子句中的列,对VT4中的记录进行分组操作,产生VT5;
(6) CUBE|ROllUP: 对VT5进行CUBE或ROLLUP操作,产生表VT6;
(7) HAVING: 对虚拟表VT6应用HAVING过滤器,只有符合
<having_condition>的记录才会被插入到VT7;
(8) SELECT: 第二次执行SELECT操作,选择指定的列,插入到虚拟表VT8中;
(9) DISTINCT: 去除重复,产生虚拟表VT9;
(10) ORDER BY: 将虚拟表VT9中的记录按照
<order_by_list>进行排序操作,产生虚拟表VT10;
(11) LIMIT: 取出指定银行的记录,产生虚拟表VT11,并返回给查询用户

举例说明:

在学生成绩表中 (Grade), 把 "姓名"内容不为空的记录按照 "姓名" 分组, 并且筛选分组结果, 选出 "总成绩" 大于 600 分的并按照总成绩进行从大到小排序
标准顺序的 SQL 语句为:
select 姓名, max(总成绩) as max总成绩
from Grade
where 姓名 is not null
group by 姓名
having max(总成绩) > 600
order by max总成绩 desc
在上面的示例中 SQL 语句的执行顺序如下:
(1). 首先执行 FROM 子句, 从 Grade 表组装数据源的数据
(2). 执行 WHERE 子句, 筛选 Grade 表中姓名不为空的数据
(3). 执行 GROUP BY 子句, 把 Grade 表按 "姓名" 列进行分组
(4). 计算 max() 聚集函数, 按 "总成绩" 求出总成绩中最大的一些数值
(5). 执行 HAVING 子句, 筛选课程的总成绩大于 600 分的.
(7). 执行 ORDER BY 子句, 把最后的结果按 "Max 成绩" 进行排序.


注:这边因为涉及到了数据统计的WITH CUBE|ROLLUP,我们也大概了解下

CUBE\ROLLUP可以对查询的数据进行汇总。

区别:CUBE会对所有的分组字段进行统计,ROLLUP不会对Group By第一个字段进行统计


例子:

SQL

Select * from Users Where Id=16

Linq

from a in Users
where a.Id ==16
Select a

我们通过上述的Linq的例子是否就可以看出来,Linq直接就是按照SQL的执行顺序进行书写语句的。

扫描二维码推送至手机访问。

版权声明:本文由AR编程网发布,如需转载请注明出处。

本文链接:http://www.arlanguage.com/post/4370.html

标签: sql怎么学
分享给朋友:

“SQL执行顺序(SqlServer)(sql执行的过程是怎样的)” 的相关文章

给你的Nginx加个防火墙

引言朋友的一个 WordPress 站经常访问慢。看了一下日志,发现整天被扫描网站目录,如phpmyadmin 或者 SQL 文件,和被 CC攻击。找了一下,发现 ngx_lua_waf 是个不错的方案,但是太久不更新了,而且代码我看不懂,猝最后找到 oneinstack 一键包内置的 ngx_lu...

【网络安全】关于PHP Study nginx解析高危漏洞的预警通报

网络安全近日,山石网科安全研究院监测发现PHPStudy Windows最新版本存在nginx解析漏洞,可以造成任意代码执行。一、漏洞情况phpStudy是一个PHP调试环境的程序集成包,该程序包集成最新的Apache+PHP+MySQL+phpMyAdmin+ZendOptimizer,一次性安装...

windows 搭建php运行环境(2024年)

由于需要运行一套cms系统,需要运行php环境,现在开始记录搭建步骤:1、分别下载nginx和php包,然后解压到自己喜欢目录下面2、这里我们使用nginx的反向代理模式的FastCGI server,修改nginx.conf,然后启动或重启nginx。location ~ \.php$ {...

网站nginx配置限制单个IP访问频率,预防DDOS恶意攻击

一、简介对于网站来说,尤其是流量较大出名的网站,经常遇到攻击,如DDOS攻击等,虽然有些第三方,如Cloudflare可以挡,但对于动态网站PHP来说,只能挡一部分。这时候需要对于单个IP恶意攻击做出限流。nginx的两个模块可以限流。nginx两个限流模块:连接频率限制,ngx_http_lim...

nginx-UrlRewrite 实现URL重写转发

URL重写在前后端分离的开发模式中,会遇到这样一个需求:前端通过特定路由前缀来访问后端接口,例如:http://localhost/api/getUser,这里 api 即是每一个前端 request 所多加的前缀。nginx 需要把http://localhost/api/getUser 转换成后...

Nginx——location常见配置指令,alias、root、proxy_pass

1、【alias】——别名配置,用于访问文件系统,在匹配到location配置的URL路径后,指向【alias】配置的路径。如: location /test/ { alias/first/second/img/; }即:请求/test/1.jpg(省略了协议与域名),将会返回文件/first...