最近想研究一下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中是如何运行的呢?

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知识。如果有不足的地方希望大家批评指正。