前言
derived table 派生表,跟其他表一样,也是跟在from
之后,只是派生表内部是一条SQL子查询语句,而不单单是一个表名;
派生表类似于临时表,都是临时创建的,目的就是为了简化复杂的查询;
关于temporary table 临时表,可以参考这篇:MySQL-临时表 (javalover.cc)
目录
- derived table 介绍
- derived table 例子
- derived table 和 temporary table的区别
正文
1. derived table 介绍
派生表的格式如下:图片取自mysqltutorial网
可以看到,这里给派生表取了一个别名 derived_table_name,此时这条SQL语句的其他部分,就可以直接用这个派生表的别名;
这样一来,就可以很方便地跟派生表的内容 进行一些联合查询 (join操作);
派生表必须取一个别名,如果没有取别名,那么运行时会报错,提示如下:
> 1248 - Every derived table must have its own alias
意思是 每个派生表都必须有一个别名;
2. derived table 例子
假设我们现在有如下三个表:s_product 产品表,s_order 订单表, s_order_detail 订单详情表
现在我们要知道每款产品的总销量,就可以通过下面的语句来实现:
select t1.product_number, sum(t2.order_count) as orderTotalCount
from s_order as t1
join s_order_detail as t2
on t1.order_number = t2.order_number
group by t1.product_number
输出如下所示:
因为缺少产品名称这个信息,所以我们还需要联合s_product产品表进行查询;
这时我们就可以用派生表来联合查询,语句如下:
select t3.product_name, derived_table.orderTotalCount
from (select t1.product_number, sum(t2.order_count) as orderTotalCount
from s_order as t1
join s_order_detail as t2
on t1.order_number = t2.order_number
group by t1.product_number) as derived_table
join s_product as t3 on t3.product_number = derived_table.product_number
下面我们简单介绍下上面的SQL语句:
- 派生表中的group by 分组语句,用来将返回结果按照 product_number 产品编号进行分组;
- 分组后,再结合 sum() 聚合函数,用来对分组中的数据进行求和操作,求出每个分组中的销量总和;
- 接着给派生表取个别名 derived_table,这样SQL语句的其他地方就可以直接用这个派生表名去获取 派生表中对应的数据(比如derived_table.orderTotalCount)
- 最后跟 s_product表进行联合查询( join 内联合,等价于 inner join),以从s_product中获取产品名称;
输出结果如下:
可以看到,跟上面的结果很像,只是这次返回了产品名称,比产品编号更加直观
3. derived table 和 temporary table的区别
共同点是:他俩都可以基于SQL查询语句进行创建
不同点是:派生表是虚拟的,临时表是真实存在的
总结
- 派生表是一种特殊的SQL查询语句,跟在
from
关键字后面; - 派生表必须取一个别名,否则会报错;
- 派生表是虚拟的,临时表是真实的;
评论区