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  时 排序
会导致 单只结实对诺多只源数据行。

 

相关文章