T-SQL:SQL语句处理顺序的坑(四)

首先看上边一条相比较成功语句,都是相比较宽泛的要紧字。

USE Temp;

SELECT empid, YEAR(orderdate) AS orderyear, COUNT(*) AS numorders
FROM Sales.Orders
WHERE custid = 71
GROUP BY empid, YEAR(orderdate)
HAVING COUNT(*) > 1
ORDER BY empid, orderyear;

我们来详细分析一下sql语句的逻辑处理顺序,即使select在每条语句的第一位,但实在它是被最后才处理的

1.from  

2.where

3.group by

4.having

5.select

6.order by

7.TOP

在仔细分析各样执行各种代表的意趣 (它的骨子里顺序)

FROM Sales.Orders
WHERE custid = 71
GROUP BY empid, YEAR(orderdate)
HAVING COUNT(*) > 1
SELECT empid, YEAR(orderdate) AS orderyear, COUNT(*) AS numorders
ORDER BY empid, orderyear;

1.从 Orders 表查询数据

2.遵照规则筛选客户ID等于71的

3.对客户id和订单年度 进行分组

  1. 再选出大于一个订单的组

5.回来查询出的数据 以及你要来得的字段

6.末尾对客户id 和订单 举办排序

7.输出

输入的键入顺序和处理顺序不一致是有原因的,SQL设计师是为着让用户依照英文的措施提供温馨的呼吁

建议、坑

  1. from 表时  最好给定 库名和表名  Sales.Orders 
    让称扬显表示 不用程序检索。
  1. where 子句分外首要  SQL Server 会对where 条件
    举办评估访问请求数据要采纳的目录,通过索引可以大大缩小表扫描时间

还要 where 子句检索 完成后 
它回到的是寻找结果为True的行  ,但一味铭记, SQL
数据库使用三值谓词逻辑,也就是说有五个结果。

True,False 或 UNKNOWN ,  再次回到true 行 并不同等
不回来False  实际上是不回来 False 行 和 UNKNOWN 行
未来会再博客中专门讲NULL。

3.记住除count(*)之外, 
聚合函数都是忽视NULL标记  假诺有一组数据“1,1,3,4,5,null”列名为qty  
表明式Count(*) 重返的是6 可是Count(qty)

是5  count中加以显示值 就会默认寻找已知值 
也得以  count(distinct qty ) 再次来到的是4 去重新  这几个 可以用来 处理 
重回每个不另行统计问题很方便 它和 select
distinct
有很大性能区别 未来会细讲 也足以
sum(distinct qty
) 是13
也是用作总计不重复数据。

4.因为 group by
属于行处理 在having 先总结所以having 中可以出现  聚合函数 。

5.像下边的 “YEAR(orderdate)” SQL Server 只对它运行两回 
能辨别查询中重复使用的平等表明式

6.最好别使用 select * 即使你要查询 所有字段。

7.用到 order by 对有恢宏重复的字段举行排序是低效的  例如对日期举办排序
这样一个排序选10条 会有四个被认为是对的结果
所以我们要确保排序字段的数目唯一性, 以及在 select distinct  时 排序
会导致 单个结果对应四个源数据行。

 

相关文章