前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQL高级知识:派生表

SQL高级知识:派生表

作者头像
SQL数据库开发
发布2024-05-20 15:29:46
1200
发布2024-05-20 15:29:46
举报
文章被收录于专栏:SQL数据库开发SQL数据库开发

SQL刷题专栏

SQL145题系列

派生表的定义

派生表是在外部查询的FROM子句中定义的,只要外部查询一结束,派生表也就不存在了。

派生表的作用

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

例如:

代码语言:javascript
复制
SELECT * FROM (
SELECT * FROM Customers WHERE 城市='广州'
) Cus

其中Cus就是派生表

派生表的特征

  • 所有列必须要有名称,出现无列名的要重命名
  • 列名称必须是要唯一,相同名称肯定是不允许的
  • 不允许使用ORDER BY(除非指定了TOP)
  • 派生表必须指定名称,例如:Cus

注意:派生表是一张虚表,在数据库中并不存在,是我们自己创建的,目的主要是为了缩小数据的查找范围,提高查询效率。

派生表嵌套

如果需要用一个本身就引用了某个派生表的查询,去定义另一个派生表,最终得到的就是嵌套派生表。

例子:查询每年处理客户数超过70的订单年度和每年所处理的客户数量。

方法一:不使用派生表

代码语言:javascript
复制
SELECT
YEAR(orderdate) AS Orderyear,
COUNT(DISTINCT custid) AS Numcusts
FROM Sales.Orders
GROUP BY YEAR(Orderdate)
HAVING COUNT(DISTINCT Custid) > 70;

方法二:使用派生表

代码语言:javascript
复制
SELECT Orderyear, Numcusts
FROM (
SELECT Orderyear, COUNT(DISTINCT Custid) AS Numcusts
FROM (
SELECT YEAR(Orderyear) AS Orderyear, Custid
FROM Sales.Orders) AS D1
GROUP BY Orderyear
) AS D2
WHERE Numcusts > 70;

嵌套查询看起来非常复杂,嵌套查询也是很容易产生问题的一个方面。在这个例子中,使用嵌套派生表的目的是为了重用列别名。但是,由于嵌套增加了代码的复杂性,所以对于本例考虑使用方案一。

与子查询的区别

子查询是指在主查询中使用的内部查询。通过将子查询作为主查询的条件或结果集来获取所需数据,子查询可以出现在很多地方。

  • 在where⼦句中: ⼦查询的结果可⽤作条件筛选时使⽤的值。
  • 在from⼦句中: ⼦查询的结果可充当⼀张表或视图,需要使⽤表别名。
  • 在having⼦句中: ⼦查询的结果可⽤作分组查询再次条件过滤时使⽤的值
  • 在select⼦句中: ⼦查询的结果可充当⼀个字段。仅限⼦查询返回单⾏单列的情况。

1、派生表通常出现在FROM子句后面。

2、派生表通常用于子查询的结果需要多次使用的场景,而子查询可以用于需要临时结果的场景。

3、派生表必须有自己的别名,而子查询一般不需要。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SQL数据库开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档