最近想研究一下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知识。如果有不足的地方希望大家批评指正。