zoukankan      html  css  js  c++  java
  • select 语句的执行顺序

    借用ItZik Ben-Gan、Lubor Kollar、Dejan Sarka所著的《Sql Server 2005 技术内幕:T-SQL查询》的一段话足以说明:

    (8) select (9) distinct (11) <top_specification > <select_list>
    
    (1)from<lef t_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_condition>
    
    

    从这个顺序可以看出,所有的查询语句都是从from开始执行的。在执行过程中,每个步骤都会为下一个步骤生成一个虚拟表,这个虚拟表将作为下一个执行步骤的基础。

    第一步:from

    首先对from子句中的前两个表执行一个笛卡尔乘积,此时生成虚拟表vt1 .

    第二步:on

    接下来便是应用on筛选器,on 中的逻辑表达式将应用到 vt1 中的各个行,筛选出满足on逻辑表达式的行,生成虚拟表 vt2 .

    第三步:join

    如果是outer join 那么这一步就将添加外部行,left outer jion 就把左表在第二步中过滤的添加进来,如果是right outer join 那么就将右表在第二步中过滤掉的行添加进来,这样生成虚拟表 vt3.

    第四步:多表

    如果 from 子句中的表数目多余两个表,那么就将vt3和第三个表连接从而计算笛卡尔乘积,生成虚拟表,该过程就是一个重复1-3的步骤,最终得到一个新的虚拟表 vt3.

    第五步:where

    应用where筛选器,对上一步生产的虚拟表引用where筛选器,生成虚拟表vt4,在这有个比较重要的细节不得不说一下,对于包含outer join子句的查询,就有一个让人感到困惑的问题,到底在on筛选器还是用where筛选器指定逻辑表达式呢?on和where的最大区别在于,如果在on应用逻辑表达式那么在第三步outer join中还可以把移除的行再次添加回来,而where的移除的最终的。

    第六步:group by

    分组,生成虚拟表 vt4

    第七步:having

             对vt4应用having筛选器,生成虚拟表 vt5

    第八步:select

    处理select 列表,生成虚拟表vt6

    第九步:distinct

    将vt6 中重复的行去掉,生成虚拟表vt7

    第十步:order   by

    将vt7中的行按order by 子句中的列列表排序,生成一个游标vc8

    第十一步: top

    从vc8的开始处选择指定数量或比例的行,生成虚拟表vt9,并返回给调用者

    ====================================

    SQL Select语句完整的执行顺序:

    1、from子句组装来自不同数据源的数据;
    2、where子句基于指定的条件对记录行进行筛选;
    3group by子句将数据划分为多个分组;
    4、使用聚集函数进行计算;
    5、使用having子句筛选分组;
    6、计算所有的表达式;
    7、使用order by对结果集进行排序。

    ====================================

    三. SQL语句扩展

    1.select

    1.1 选择性插入语句
    1.1.1 Insert into  table1 (field1 )  Select field2 from table2

    要求table1必须存在。

    1.1.2 select field1 into table1 from table2

       要求table1不存在,在运行时会自动创建表名为table1,字段名为field1的一个表。

    1.2打开其它数据源

    /* OracleSvr为链接服务器名 ,本示例假定已经创建了一个名为 ORCLDB 的 Oracle 数据库别名。*/

    EXEC sp_addlinkedserver 'OracleSvr',  --链接服务器名OracleSvr,sysname类型

       'MSDAORA', --provider_name数据源提供程序,此处为oracle

       'ORCLDB' --数据源名称

    GO

    Select * from OPENQUERY(OracleSvr, 'SELECT name, id FROM joe.titles')

    如果有多个sql server实例:

    SELECT *FROM  [servername\instancename.]pubs.dbo.authors.

    注意:一个对象的完整名称包括四个标识符:服务器名称、数据库名称、所有者名称和对象名称。其格式如下:

    [ [ [ server. ] [ database ] .] [ owner_name ] .] object_name

    中间的名称可以省略,但是.不可以省略。如:server…object_name

    2.update

    2.1多表更新

    Update table1 set  table1.field 1=table2.field2  from

    table1,table2 /*猜测下连接方式全联接 FULL [OUTER] JOIN */

    where  table1.field3= table2 .filed3

    知识:SQL Server的update语句中from后可跟多个表,Oracle则不支持该用法

    Oracle 中:Update  table1  set  table1.field1=

    (select table2.field2 from table2 where .field3= table2 .filed3)

    3.insert

    3.1 插入语句的规范问题

    在sql server 2000,sql server 2005中

    标准语句:insert into  table(field)  values (value)

    提示:在access中不正确,原因sql语句不规范,因此在书写sql语句的过程中一定要按正规的语法来写。

    4.delete

    4.1标准删除

    标准语句:delete from table where condition

    提示:同insert

    4.2其它删除
    4.2.1  truncate

    语法:truncate table  table_name

    删除表中所有行,不记录单个行删除操作,不记录日志,,所有速度比Delete快。

    4.2.2  drop

    语句: Drop table table_name

    删除表及相关,有fk约束的不能删,先去年fk;系统表不能使用。

    5.order by

    功能:排序

    技巧:order by newid() 随机排序

  • 相关阅读:
    UISegmentControl
    UISwitch 开关控件
    UI弹出键盘和收回键盘
    UITextField的属性设置
    UIButton的属性设置
    UILabel 的属性设置
    创建UIView对象
    id和instancetype的异同
    SPOJ FIBPOL
    HDU 6168 Numbers
  • 原文地址:https://www.cnblogs.com/LCX/p/1977417.html
Copyright © 2011-2022 走看看