问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

请教一下关于sql server的语句执行顺序是否能够自己设定?

发布网友 发布时间:2022-04-11 17:59

我来回答

3个回答

懂视网 时间:2022-04-11 22:21

今天在写一条语句的时候,在查询分析器里边执行
要用10s,换用另外一种写法只用少于1s的时间,同事说是因为Sql句语执行顺序的原因。之前看过一点相
关的书,有一点印象,到网上找了资料,学习下。
逻辑查询处理步骤
代码如下:
(8)SELECT (9)DISTINCT
(11)<TOP_specification> <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>

每个步骤产生一个虚拟表,该虚拟表被用作下一个步骤的输入。只有最后一步生成的表返回给调用者。如
果没有某一子句,则跳过相应的步骤。
1. FROM:对FROM子句中的前两个表执行笛卡尔积,生成虚拟表VT1。
2. ON:对VT1应用ON筛选器。只有那些使<join_condition>为真的行才被插入VT2。
3. OUTER(JOIN):如果指定了OUTER JOIN,保留表中未找到匹配的行将作为外部行添加到VT2,生成VT3。
如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到
处理完所有的表为止。
4. 对VT3应用WHERE筛选器。只有使<where_condition>为TRUE的行才被插入VT4。
5. GROUP BY:按GROUP BY 子句中的列列表对VT4中的行分组,生成VT5。
6. CUBE|ROLLUP:把超组插入VT5,生成VT6。
7. HAVING:对VT6应用HAVING筛选器。只有使<having_condition>为TRUE的组才会被插入VT7。
8. SELECT:处理SELECT列表,产生VT8。
9. DISTINCT:将重复的行从VT8中移除,产生VT9。
10. ORDER BY:将VT9中的行按ORDER BY子句中的列列表排序,生成一个有表(VC10)。
11. TOP:从VC10的开始处选择指定数量或比例的行,生成表VT11,并返回给调用者。
以下是其它网友的补充:
好像自已在书写 SQL 语句时由于不清楚各个关键字的执行顺序, 往往组织的 SQL 语句缺少很好的逻辑, 凭感觉 "拼凑" ( 不好意思, 如果您的 SQL 语句也经常 "拼凑", 那您是不是得好好反省一下呢?, 呵呵).
这样做确实是爽了自己, 可苦了机器, 服务器还需要在我们的杂乱无章的 SQL 语句中寻找它下一句需要执行的关键字在哪里.
效率嘛, 由于我们的感觉神经对秒以下的变化实在不敏感, 暂且就认为自已写的 SQL 顺序无关紧要, "反正没什么变化!", 呵呵.其实服务器对每句 SQL 解析时间都会有详细记录的, 大家可以看一下自已按习惯写的 SQL 和按标准顺序写的SQL解析时间差别有多大.
因此, 建议大家在平时工作中 SQL 语句按标准顺序写, 一是专业, 二是实用, 呵呵, 不过我觉得最主要的是心里感觉舒服.
标准的 SQL 的解析顺序为:
(1).FROM 子句, 组装来自不同数据源的数据
(2).WHERE 子句, 基于指定的条件对记录进行筛选
(3).GROUP BY 子句, 将数据划分为多个分组
(4).使用聚合函数进行计算
(5).使用 HAVING 子句筛选分组
(6).计算所有的表达式
(7).使用 ORDER BY 对结果集进行排序
举例说明: 在学生成绩表中 (暂记为 tb_Grade), 把 "考生姓名"内容不为空的记录按照 "考生姓名" 分组, 并且筛选分组结果, 选出 "总成绩" 大于 600 分的.
标准顺序的 SQL 语句为:
select 考生姓名, max(总成绩) as max总成绩
from tb_Grade
where 考生姓名 is not null
group by 考生姓名
having max(总成绩) > 600
order by max总成绩
在上面的示例中 SQL 语句的执行顺序如下:
(1). 首先执行 FROM 子句, 从 tb_Grade 表组装数据源的数据
(2). 执行 WHERE 子句, 筛选 tb_Grade 表中所有数据不为 NULL 的数据
(3). 执行 GROUP BY 子句, 把 tb_Grade 表按 "学生姓名" 列进行分组
(4). 计算 max() 聚集函数, 按 "总成绩" 求出总成绩中最大的一些数值
(5). 执行 HAVING 子句, 筛选课程的总成绩大于 600 分的.
(7). 执行 ORDER BY 子句, 把最后的结果按 "Max 成绩" 进行排序.
好了,看了这些之后,我相信大家都知道了SQL中select语句的执行顺序了吧!哈哈!

您可能感兴趣的文章:

  • sql和MySQL的语句执行顺序分析
  • SQL语句执行顺序详解
  • SQL语句执行顺序图文介绍
  • SQL Select语句完整的执行顺序
  • mysql中sql的执行顺序的坑
  • 热心网友 时间:2022-04-11 19:29

    你的需求,其实是可以通过sql的goto语法进行实现的,而不是绝对的不可以,只是在使用goto之前需要首先定义一下变量。这个不仅仅是sql语言需要这样,任何语言都需要在使用变量之前提前声明。这样就可以将你需要执行的语句显示在前面了。具体方法如下:

    declare @i varchar(500), @sql varchar(5000), @count int
    set @count = 0 --定义一个循环变量,防止goto的语句死循环,你可以去了这句和后面的while试试你就知道了
    Branch_One:   --定义一个标签
    exec (@sql) --goto中的语句,如果有多个语句,请使用begin...end
    set @i = 'a' ---表名
    set @sql='select top 10 * from '+ @i
    set @count = @count + 1
    while @count <= 1 goto Branch_One --使用goto语句跳转到Branch_One进行执行。

    具体关于goto的语法和应用请参见:http://msdn.microsoft.com/zh-cn/library/ms180188.aspx

    热心网友 时间:2022-04-11 20:47

    不行,语句是按顺序执行的,必须按需要先定义,后执行
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    如何在win10下安装docker? windows(win10)上的docker使用:安装(国内镜像)、操作 win10安装dockerWin10下Docker安装和使用 关于安装配置docker,找不到Hyper-V(win10 家庭版需要配置,专业版不需要... 怎么把微信上的聊天记录转到新手机 怎么把聊天记录转到另一个手机 快递被别人冒领,快递公司有没有责任 洋葱汤洋葱汤 一颗洋葱汤怎么做 一颗洋葱汤怎么做好吃 asp.net 分页代码 首页 上一页 1 2 3 4 5 &gt;&gt; …… 30 下一页 尾页 用存储过程分页后,前台上一页,跳转页怎么写 存储过程数据排序问题 sqlserver 自定义函数怎么接收关键字参数 asp.net 如何一次执行多条件Sql语句,如何解决? ASP.NET怎样使用SQL语句呢? ASP.NET执行sql语句 c# .net中 对于access数据库执行sql命令 .net 执行一个sql脚本 C#.NET 怎么对WINDOWS的CMD命令操作 如何在asp.net中执行sql脚本文件 .net 执行 sql 语句 c#读取xml 中的数据库连接字符串 sqlserver语句中,怎么样将字符串&#39;ab00000008&#39;减去2,得到&#39;ab00000006&#39; ibatis中sql.xml怎么分割字符串并循环 硬盘分区情况同备份时不同,不能执行系统恢复操作 硬盘分区情况同备份时不同,不能执行系统恢复操作! 急需解决:系统还原 如果不小心删除了电脑中的*.bak文件,导致officeXP或office2003无法使用,如何解决? Sqlserver2012 在还原.bak文件的时候,不能选择源文件,这是怎么回事? sql server 2008中是先执行order by 后执行select top 3*from ceshi?为什么和规定的执行顺序相反? SQL server语句 sql server select某表的字段(字段存储着计算公式),这个字段内容可以作为select语句执行的一部分吗! sql server 2008 游标不按顺序执行语句怎么办 在sql触发器中如何获得被修改行的ID (转载)在sql触发器中如何获得被修改行的ID 刚才那个sql触发器的,怎么知道表里哪一行是被update了的? 在sql update 触发器中能不能定义获得要更改项的数据? sql2008 触发器,更新update数据时,如何可以取到指定字段(列)中的值 sql 触发器 update的问题 SQL触发器update问题 sql update触发器。急~ SQL的数据更新触发器 急!!怎么删除ACCESS中的重复记录 access 中怎么删除重复项 Access数据库用SQL语句 删除重复的数据! access中,怎样删除重复记录然后设置主键 关于ACCESS里,删除重复字段的信息条的SQL语句问题 如何删除ACCESS数据库中重复数据? 如何删除ACCESS中的重复字段