• SQLSERVER之T-SQL查询(一)


      最近想研究一下SQL语句,于是看了一下《SQLSERVER技术内幕》。由于刚刚开始看,所以顺便总结一下。

      在SQLSERVER中,常用的无非就是SELECT、FROM、JOIN、WHERE、ON、HAVING、ORDER BY、GROUP BY、DISTINCT等。但是SQL语句在SQLSERVER中具体是如何执行的呢?

      首先看一个SQL语句:

      SELECT C.customerid,COUNT(O.orderid) AS numorders

       FROM  dbo.Customers  AS C

        LEFT OUTER JOIN dbo.Orders AS O

          ON C.customerid=O.customerid

      WHERE C.city='Madrid'

      GROUP BY  C.customerid

      HAVING COUNT(O.orderid)<3

      ORDER BY numorders;

    此SQL语句是书上的例子,借用一下。

      这个SQL语句很好理解,只是一个简单的查询语句,但是具体的在SQLSERVER中是如何运行的呢?

      首先,SQL语句在运行时一定是首先运行FROM子句(大家一定有此经历:在SQLSERVER中写语句时,select 列名 from  这个时候列名是没有提示的。当写上SELECT  * FROM Table_Name,当再次修改*号时,有了列名提示。所以此项可以证明在SQLSERVER中先执行的是FROM子句)。当FORM表中存在多张表时,进行笛卡尔积的运算,生成一张临时表T1。

      第二,将临时表T1中的结果通过ON 条件过滤生成临时表T2。

      第三,执行OUTER JOIN操作,将无法匹配的行插入到临时表T2中,生成临时表T3。

      第四,执行WHERE子句,过滤不符合条件的记录生成临时表T4。

      第五,执行GROUP BY子句,将T4表中的记录进行分组,生成临时表T5。

      第六,执行HAVING子句,过滤T5表中的记录,生成临时表T6。

      再执行SELECT子句,将T6表中记录过滤不需要的字段,生成临时表T7。执行DISTINCT子句将T7临时表中的重复行删除,生成临时表T8。最后执行ORDER BY子句,将T8中的记录进行排序,进行输出。

      整个SQL语句的执行顺序到这儿才执行完毕。在这个过程中总共生成了8张表。其中T1~T7临时表都不能被客户端或者用户进行使用。当充分理解SQL语句在SQLSERVER中的执行顺序后,会使我们对SQL的运行原理有了更充分的理解,这对于书写SQL语句又很大的帮助。

      在随后的博客中,我将继续谈自己以及通过书本获得的SQL知识。如果有不足的地方希望大家批评指正。

     

      

  • 相关阅读:
    图形界面 Fedora Core 12/Core 11 How to log in GUI as r
    nis_client.txt
    nis_server.txt
    passwd
    samba.set
    【22.48%】【codeforces 689D】Friends and Subsequences
    【71.76%】【codeforces 732A】Buy a Shovel
    【56.74%】【codeforces 732B】Cormen --- The Best Friend Of a Man
    【43.26%】【codeforces 732C】Sanatorium
    【37.50%】【codeforces 732D】Exams
  • 原文地址:https://www.cnblogs.com/sun-sjmeng/p/3196227.html
Copyright © 2020-2023  润新知