首页 > 数据库 >SQL Server SQL执行顺序

SQL Server SQL执行顺序

时间:2023-07-13 11:23:42浏览次数:32  
标签:语文 顺序 SQL Server 李四 子句 tb ORDER

SQL Server SQL执行顺序

下面是对应用于SQL server 2000和SQL Server 2005的各个逻辑步骤的简单描述。

(8) SELECT (9)DISTINCT  (11)<Top Num> <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子句中的前两个表执行笛卡尔积(Cartesian product)(交叉联接),生成虚拟表VT1
  2. ON:对VT1应用ON筛选器。只有那些使<join_condition>为真的行才被插入VT2。
  3. OUTER(JOIN):如 果指定了OUTER JOIN(相对于CROSS JOIN 或(INNER JOIN),保留表(preserved table:左外部联接把左表标记为保留表,右外部联接把右表标记为保留表,完全外部联接把两个表都标记为保留表)中未找到匹配的行将作为外部行添加到 VT2,生成VT3.如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表为止。
  4. WHERE:对VT3应用WHERE筛选器。只有使<where_condition>为true的行才被插入VT4.
  5. GROUP BY:按GROUP BY子句中的列列表对VT4中的行分组,生成VT5.
  6. CUBE|ROLLUP:把超组(Suppergroups)插入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,并返回调用者。

注:步骤10,按ORDER BY子句中的列列表排序上步返回的行,返回游标VC10.这一步是第一步也是唯一一步可以使用SELECT列表中的列别名的步骤。这一步不同于其它步骤的 是,它不返回有效的表,而是返回一个游标。SQL是基于集合理论的。集合不会预先对它的行排序,它只是成员的逻辑集合,成员的顺序无关紧要。对表进行排序 的查询可以返回一个对象,包含按特定物理顺序组织的行。ANSI把这种对象称为游标。理解这一步是正确理解SQL的基础。

因为这一步不返回表(而是返回游标),使用了ORDER BY子句的查询不能用作表表达式。表表达式包括:视图、内联表值函数、子查询、派生表和共用表达式。它的结果必须返回给期望得到物理记录的客户端应用程序。例如,下面的派生表查询无效,并产生一个错误:

select * from(select orderid,customerid from orders 
order by orderid) as d

下面的视图也会产生错误

create view my_view
 as
 select *from orders order by orderid

在SQL中,表表达式中不允许使用带有ORDER BY子句的查询,而在T—SQL中却有一个例外(应用TOP选项)。

所以要记住,不要为表中的行假设任何特定的顺序。换句话说,除非你确定要有序行,否则不要指定ORDER BY 子句。排序是需要成本的,SQL Server需要执行有序索引扫描或使用排序运行符。
推荐一段SQL代码:行列转置

问题:假设有张学生成绩表(tb)如下:

姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94

想变成(得到如下结果):

姓名 语文 数学 物理


李四 74 84 94
张三 74 83 93

create table tb(姓名 varchar(**10**),课程 varchar(**10**),分数 int)

insert into tb values('张三' , '语文' , **74**)
 insert into tb values('张三' , '数学' , **83**)
 insert into tb values('张三' , '物理' , **93**)
 insert into tb values('李四' , '语文' , **74**)
 insert into tb values('李四' , '数学' , **84**)
 insert into tb values('李四' , '物理' , **94**)
 go 

SQL SERVER 2000 静态SQL,指课程只有语文、数学、物理这三门课程。

select 姓名 as 姓名 , 
max(case 课程 when '语文' then 分数 
else **0** end) 语文, 
max(case 课程 when '数学' then 分数 
else **0** end) 数学, 
max(case 课程 when '物理' then 分数 
else **0** end) 物理
from tb
group by 姓名

标签:语文,顺序,SQL,Server,李四,子句,tb,ORDER
From: https://www.cnblogs.com/HeroZhang/p/17549879.html

相关文章

  • 对目标元素进行监听 - addListener和IntersectionObserver
    在web的构建中,经常需要对元素进行监听,例如监听元素是否出现在可视范围内。我们可以通过addEventListener来监听滚动,计算元素距离顶部的位置对元素的变更来做出反应。但是长时间大量的触发事件反而对网页性能影响很大,使用节流的话其实也只是浅浅的优化一下性能。有没有其他思路可......
  • 如何实现只有80对外开放的宿主机,使用docker实现mysql和redis和外部通信的具体操作步
    使用Docker实现MySQL和Redis与外部通信引言在现代软件开发中,往往需要使用到各种数据库和缓存技术。MySQL是一种常用的关系型数据库,而Redis是一种常用的内存缓存数据库。在部署这些数据库和缓存时,我们常常需要与外部的系统进行通信,例如通过网络连接,提供服务给其他系统。本文将介绍......
  • 怎么在数据库里关闭mysqlbinlog 这个问题怎么解决?
    项目方案:关闭MySQLBinlog1.项目背景MySQLBinlog是MySQL数据库的事务日志,它记录了数据库的所有操作,包括插入、更新和删除等操作。在某些情况下,我们可能需要关闭MySQLBinlog来提高数据库的性能或保护敏感数据。2.方案介绍本方案将介绍如何在MySQL数据库中关闭MySQLBinlog。......
  • 怎么提升mysql批量更新速度 这个问题怎么解决?
    项目方案:提升MySQL批量更新速度1.简介在开发过程中,我们可能会遇到需要批量更新大量数据的情况,而MySQL默认的单条更新语句执行效率较低,不能满足高效更新的需求。因此,我们需要通过一些优化方案来提升MySQL批量更新的速度。2.方案2.1.使用事务在进行批量更新时,将多个更......
  • 如何实现在linux连接Windows的mysql的命令的具体操作步骤
    在Linux连接Windows的MySQL的命令作为一名经验丰富的开发者,我将会教给你如何在Linux环境下连接到Windows的MySQL数据库。下面是整个过程的步骤,以及每一步所需要执行的操作和相应的代码。连接步骤步骤操作1安装MySQL客户端2配置远程访问权限3连接到Windows的My......
  • Jq-table 拖拽顺序
    使用sortable对table列表进行拖拽排序<tableid="sort"name="Register_GameId"class="tabletable-borderedui-sortable"><tbody><trstyle="opacity:1;"class=""><td><inputtype="......
  • python-pymysql-类对象映射为sql语句
    查询语句importpymysqlclassUserQuery:def__init__(self,name=None,age=None,email=None):self.name=nameself.age=ageself.email=emaildefselect_data(table,condition):#连接到数据库connection=pymysql.connec......
  • 【技术积累】Mysql中的SQL语言【技术篇】【二】
    数据操作插入数据Mysql使用INSERT语句来插入数据。INSERT语句的一般格式如下:INSERTINTO表名(列1,列2,列3,...)VALUES(值1,值2,值3,...);其中,表名是要插入数据的表名;列1,列2,列3是要插入数据的列名;值1,值2,值3是要插入的具体值。下面以一个学生表student为例......
  • 脚本化修改Oracle用的密码以及执行sql
    一、脚本化检查Oracle是否能正常登录 #shell定义检查函数functioncheck(){VALUE=`sqlplus-S用户名/$1@数据库网络服务名<<EOFsetheadingofffeedbackoffselectcount(1)fromdual;EOF`if[.$VALUE-eq1];thenecho"yes"elseecho"no"fi}......
  • PostgreSQL在线修改数据类型
    修改大表中列的数据类型几乎总是一件痛苦的事情。由于altertable语句获得的排他锁,它可能会锁定整个表的读写。本文中,我们将探讨如何以最小的影响、最少的锁来执行这样的操作。它适用于任何数据类型;让我们以int到bigint的变化为例。 示范用例假设我们有一个有许多列的表。其......