侧边栏壁纸
  • 累计撰写 94 篇文章
  • 累计创建 100 个标签
  • 累计收到 10 条评论

目 录CONTENT

文章目录

MySQL-派生表

汤圆学Java
2023-02-24 / 0 评论 / 0 点赞 / 629 阅读 / 837 字
温馨提示:
本文最后更新于 2023-02-24,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

前言

derived table 派生表,跟其他表一样,也是跟在from之后,只是派生表内部是一条SQL子查询语句,而不单单是一个表名;

派生表类似于临时表,都是临时创建的,目的就是为了简化复杂的查询;

关于temporary table 临时表,可以参考这篇:MySQL-临时表 (javalover.cc)

目录

  1. derived table 介绍
  2. derived table 例子
  3. derived table 和 temporary table的区别

正文

1. derived table 介绍

派生表的格式如下:图片取自mysqltutorial网

image-20220523151109114

可以看到,这里给派生表取了一个别名 derived_table_name,此时这条SQL语句的其他部分,就可以直接用这个派生表的别名;

这样一来,就可以很方便地跟派生表的内容 进行一些联合查询 (join操作);

派生表必须取一个别名,如果没有取别名,那么运行时会报错,提示如下:

> 1248 - Every derived table must have its own alias

意思是 每个派生表都必须有一个别名;

2. derived table 例子

假设我们现在有如下三个表:s_product 产品表,s_order 订单表, s_order_detail 订单详情表

image-20220523172159274

现在我们要知道每款产品的总销量,就可以通过下面的语句来实现:

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

输出如下所示:

image-20220523171430095

因为缺少产品名称这个信息,所以我们还需要联合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中获取产品名称;

输出结果如下:

image-20220523171812831

可以看到,跟上面的结果很像,只是这次返回了产品名称,比产品编号更加直观

3. derived table 和 temporary table的区别

共同点是:他俩都可以基于SQL查询语句进行创建

不同点是:派生表是虚拟的,临时表是真实存在的

总结

  1. 派生表是一种特殊的SQL查询语句,跟在from关键字后面;
  2. 派生表必须取一个别名,否则会报错;
  3. 派生表是虚拟的,临时表是真实的;
0

评论区