SQL Server支持四种类型的表表达式:派生表,公用表表达式,视图和内联表值函数。
派生表是一个查询结果生成的表,类似于临时表。
派生表可以简化查询,避免使用临时表。相比手动生成临时性能更优越。派生表与其他表一样出现在查询的FROM子句中
select * from (select * from athors) temp
temp 就是派生表
派生出来的表必须要是一个有效的表.因此,它必须遵守以下几条规则:
1. 所有列必须要有名称
2. 列名称必须是要唯一
3. 不允许使用ORDER BY(除非指定了TOP)
派生表:比如要查找一个叫张铁牛的人的信息,我们知道他是男性,为了缩小查找范围我把所有的男性都找出来,然后从这些男性中里面再去找张铁牛.这里男性的集合就相当于派生表,转成sql语句:
select 姓名,住址,身份证 from (select * from 表名 where 性别=‘男性‘) temp where 姓名=‘张铁牛‘
(这里只是为了举例子),这里的 temp这个数据集就是派生表,它是虚表,在数据库中不存在的,是我们构建的,在这里的目的是为了缩小数据的查找范围.
CTE大部分地方可以代替临时表。CTE可以完成递归才是最重要的。
CTE只是作为公用表达式,并不是一个实体表,在实际运用中,它的递归作用非常有用。
CTE最优秀的地方是在实现递归操作,和替代绝大部分游标的功能,但是对于大数据量,由于cte不能建索引,所以明显比临时表差。我给开发的建议是少于1万数据的话,cte和表变量就不要用于做暂存数据的功能。而改用临时表。
CTE后面必须直接跟使用CTE的SQL语句(如select、insert、update等),否则,CTE将失效。但是临时表一直存在,除非drop掉。
数据量大时,CTE的性能要币临时表差很多(即使临时表不建索引)
公用表表达式的好处之一是可以在接下来一条语句中多次引用:
WITH CTE_Test AS ( SELECT * FROM Person_1 ) SELECT * FROM CTE_Test AS a --第一次引用 INNER JOIN CTE_Test AS b --第二次引用 ON a.Id = b.Id ORDER BY a.Id DESC
由于CTE只能在接下来一条语句中使用,因此,当需要接下来的一条语句中引用多个CTE时,可以定义多个,中间用逗号分隔,下面是一次定义多个CTE的例子:
WITH CTE_Test1 AS ( SELECT * FROM Person_1 ), CTE_Test2 AS ( SELECT * FROM Person_2 ) SELECT * FROM CTE_Test1 UNION SELECT * FROM CTE_Test2
这里我们利用CTE实现了和派生表同样的结果,派生表和CTE其实只是在语义上有差异,但是相对于派生表最主要的优势在于不需要像派生表那样需要多重嵌套,而CTE只要定义了就无需嵌套,每个CTE在代码中以模块化的方式分别出现。这中模块化的方式和嵌套派生表方式相比,大大提高了代码的可读性和可维护性,若有多个表需要嵌套利用CTE来实现更加清爽并有助于代码的清晰性。而对于派生表的另外一个优势在于就外部查询的FROM子句而言,CTE在之前就已经存在,因此可以引用同一个CTE的多个实例。
https://www.cnblogs.com/kissdodog/archive/2013/06/24/3153012.html
https://blog.csdn.net/miqi770/article/details/51505720
https://www.cnblogs.com/janneystory/p/5623019.html
什么是内联表值函数
一种可重用的表表达式,能够支持输入参数。除了支持输入参数以外,内联表值函数在其他方面都与视图相似。
内嵌表值函数是支持输入参数的可重复使用的表表达式。除了支持输入参数之外的其他所有方面都和视图类似。我们来看下怎么创建内嵌表值函数。
借助表表达式可以简化代码,提高代码的可维护性,还可以封装查询逻辑。当需要使用表表达式,而且不计划重用它们的定义时,可以使用派生表或CTE。与派生表相比,CTE具有两个优点:CTE不用像派生表那样嵌套使用,此外,还可以引用同一CTE的多个实例,也派生表不能这么用。
当需要定义可重用的表表达式时,可以使用视图和内联表值函数。如果不须要支持输入参数,则使用视图,相反则使用内联表值函数
(1)表表达式可以简化代码,提高代码的可维护性和封装查询逻辑。
(2)当需要使用表表达式并且不打算重复使用其定义时,可以使用派生表或CTE,而CTE对派生表具有更多优势不需要像派生表那样嵌套CTE,使用CTE使代码更加模块化和便于维护,此外,还可以引用同一个CTE的多个实例,这一点是派生表无法实现的。
(3)当需要使用表表达式并且需要定义可重复使用的表表达式时,可以使用视图或内嵌表值函数,当不需要支持输入参数时,可以使用视图,否则,应当使用内嵌表值函数(TVF)。
http://www.cnblogs.com/jackson0714/p/TSQLFundamentals_04_part1.html
原文:https://www.cnblogs.com/cnki/p/9561427.html