SQL点滴10—使用with语句来写一个稍微复杂sql语句,附加和子查询的性能对比
今天偶尔看到sql中也有with关键字,好歹也写了几年的sql语句,居然第一次接触,无知啊。看了一位博主的文章,自己添加了一些内容,做了简单的总结,这个语句还是第一次见到,学习了。我从简单到复杂地写,希望高手们不要见笑。下面的sql语句设计到三个表,表的内容我用txt文件复制进去,这里不妨使用上一个随笔介绍的建立端到端的package的方法将这些表导入到数据库中,具体的就不说了。从这里下载文件employees.txt,customers.txt,orders.txt
参考文章:http://www.zzzyk.com/database/201105/91595.html
使用package导入数据:http://www.zzzyk.com/database/201105/91597.html
简单的聚合
从orders表中选择各个年份共有共有多少客户订购了商品
- 第一种写法,我们可以写成这样
要注意的是如果把group by YEAR(o.orderdata)换成group by orderyear就会出错,这里涉及到sql语句的执行顺序问题,有时间再了解一下1select YEAR(o.orderdate) orderyear,COUNT(distinct(custid)) numCusts
2from Sales.Orders o
3group by YEAR(o.orderdate)
4go - 第二种写法,
在from语句中先得到orderyear,然后再select语句中就不会出现没有这个字段的错误了1select orderyear,COUNT(distinct(custid))numCusts
2from (select YEAR(orderdate) as orderyear,custid from sales.orders) as D
3group by orderyear
4go - 第三种写法,
在as D后面加上选择出的字段,是不是更加的清楚明了呢!1select orderyear,COUNT(distinct(custid)) numCusts
2from (select YEAR(orderdate),custid from sales.orders) as D(orderyear,custid)
3group by orderyear
4go - 第四种写法,with出场了
with可以使语句更加的经凑,下面是权威解释。1with c as(
2select YEAR(orderdate) orderyear, custid from sales.orders)
3select orderyear,COUNT(distinct(custid)) numCusts from c group by orderyear
4go
指定临时命名的结果集,这些结果集称为公用表表达式 (CTE)。该表达式源自简单查询,并且在单条 SELECT、INSERT、UPDATE、MERGE 或 DELETE 语句的执行范围内定义。该子句也可用在 CREATE VIEW 语句中,作为该语句的 SELECT 定义语句的一部分。公用表表达式可以包括对自身的引用。这种表达式称为递归公用表达式。
----MSDN
- 第五种写法,也可以借鉴第三种写法,这样使语句更加清楚明了,便于维护
1 with c(orderyear,custid) as(
2 select YEAR(orderdate),custid from sales.orders)
3 select orderyear,COUNT(distinct(custid)) numCusts from c group by -
上面5中写法都得到相同的结果,如下图1:图1c.orderyear
4 go
添加计算
- 现在要求要求计算出订单表中每年比上一年增加的客户数目,这个稍微复杂
-
1 with
- 更多SQLServer疑问解答:
- 配置MSSQL复制指定快照文件夹提示:不是有效的路径或文件名
- 详细解读varchar和Nvarchar区别
- SQL SERVER 2005 同步复制技术
- 进程未能大容量复制到表 解决方法
- MSSql实例教程:MSSql数据库同步
- SQLServer2000同步复制技术实现(分发和订阅)
- sqlserver
- SQLSERVER
- 测试 sqlserver 最大用户数连接
- 写出一条Sql语句:取出表A中第31到第40记录(SQLServer,以自动增长的ID作为主键,注意:ID可能不是连续的
- sqlserver2008的安装问题。
- 为什么安装的SQL server 2008我的没有MSSQLSERVER协议啊?
- 怎样把exel表里的数据复制到sqlserver表里
- sqlserver数据库主键和外键问题
- sqlserver 中的左表连接查询和右表连接查询有啥不同?有什么用?