博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQLSERVER之T-SQL查询(一)
阅读量:5351 次
发布时间:2019-06-15

本文共 1221 字,大约阅读时间需要 4 分钟。

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

 

  

转载于:https://www.cnblogs.com/sun-sjmeng/p/3196227.html

你可能感兴趣的文章
Codeforces Round #178 (Div. 2) B. Shaass and Bookshelf 【动态规划】0-1背包
查看>>
SparkStreaming 源码分析
查看>>
【算法】—— 随机音乐的播放算法
查看>>
mysql asyn 示例
查看>>
DataGrid 点击 获取 行 ID
查看>>
git 使用
查看>>
边框圆角方法
查看>>
asp.net WebApi自定义权限验证消息返回
查看>>
php中eval函数的危害与正确禁用方法
查看>>
20172315 2017-2018-2 《程序设计与数据结构》第十一周学习总结
查看>>
MySQL添加、修改、撤销用户数据库操作权限的一些记录
查看>>
关于谷歌浏览器Chrome正在处理请求的问题解决
查看>>
Git核心技术:在Ubuntu下部署Gitolite服务端
查看>>
平面波展开法总结
查看>>
建造者模式
查看>>
ArraySort--冒泡排序、选择排序、插入排序工具类demo
查看>>
composer 安装laravel
查看>>
8-EasyNetQ之Send & Receive
查看>>
Android反编译教程
查看>>
List<string> 去重复 并且出现次数最多的排前面
查看>>