SQL SERVER派生表

派生表是一个查询结果生成的表,类似于临时表。

派生表可以简化查询,避免使用临时表。相比手动生成临时性能更优越。派生表与其他表一样出现在查询的FROM子句中

select * from (select * from athors)  temp
temp 就是派生表
Every derived table must have its own alias(每个派生表必须有自己的别名)

派生出来的表必须要是一个有效的表.因此,它必须遵守以下几条规则:

  1. 所有列必须要有名称

  2. 列名称必须是要唯一

  3. 不允许使用ORDER BY(除非指定了TOP)

eg.

bbc国家概况表

显示每个地区以及的该地区国家总人口数不少于1000万的国家总数.

SELECT region, COUNT(name) FROM bbc WHERE population >=10000000 GROUP BY region

使用派生表:

SELECT region, COUNT(name) FROM (SELECT region, name FROM bbc WHERE population>=10000000) temp1 GROUP BY region

or:

SELECT region, COUNT(name) FROM (select name,region from bbc where population>=10000000) as temp1 group by region
 
举例:
派生表:比如要查找一个叫张铁牛的人的信息,我们知道他是男性,为了缩小查找范围我把所有的男性都找出来,然后从这些男性中里面再去找张铁牛.这里男性的集合就相当于派生表,转成sql语句:
select 姓名,住址,身份证
 from (select * from 表名 where 性别='男性') temp 
where 姓名='张铁牛'
(这里只是为了举例子),这里的 temp这个数据集就是派生表,它是虚表,在数据库中不存在的,是我们构建的,在这里的目的是为了缩小数据的查找范围.
相关子查询:子查询的执行依赖于外部查询的数据,外部查询执行一行,子查询就执行一次.比如:select * from 外表 where 姓名 in (select 姓名 from 内表 where 外表.姓名=内表.姓名),你看在括号里的sql语句,是与外表关联的.
非相关子查询,还是以上面为例,如:select * from 外表 where 姓名 in (select 姓名 from 内表 where 外表.姓名='张铁牛'),你看这个语句中括号里的sql语句,它是单独执行的,与外表没有任何关联,它只执行一次,执行完后将结果集传递给外部查询使用.

猜你喜欢

转载自blog.csdn.net/qq_34987215/article/details/84145638