派生表是从SELECT语句返回的虚拟表。派生表类似于临时表,但是在SELECT语句中使用派生表比临时表简单得多,因为它不需要创建临时表的步骤。当SELECT语句的FROM子句中使用独立子查询时,我们将其称为派生表。与子查询不同,派生表必须具有别名,以便稍后在查询中引用其名称。 如果派生表没有别名,MySQL将发出错误。
mysql派生表概述
我们首先得知道,派生表是从select语句返回的虚拟表。派生表类似于临时表,但是在SELECT语句中使用派生表比临时表简单得多,因为它不需要创建临时表的步骤。所以当SELECT语句的FROM子句中使用独立子查询时,我们将其称为派生表。
基本格式
SELECT
column_list
FROM
* (SELECT
* column_list
* FROM
* table_1) derived_table_name;
WHERE derived_table_name.column > 1...
实例应用
我们有如下的统计结果
SELECT
IF(length(A.DICT_NAME)>0,AVG( A.DICT_CODE ),0) WASTE_TYPE,
COUNT( T.ID ) NUMBER,
IFNULL( SUM( T.WEIGHT ), 0 ) WEIGHT,
IFNULL( A.DICT_NAME, '总重量/总数量' ) DICT_NAME
FROM
t_sys_dictionary A
LEFT JOIN t_mw_waste_material T ON T.WASTE_TYPE = A.DICT_CODE
AND T.ORG_CODE = '34010201'
AND T.DEPT_CODE = '3401020101'
WHERE
A.DICT_TYPE = '废弃物类别'
GROUP BY
A.DICT_NAME
WITH ROLLUP
如果想对以上的结果按照number从大到小排序,应该怎么弄。mysql5.7中WITH ROLLUP 与ORDER BY是不可以一起使用的。
我们可以把前面的结果作为一个派生表,在派生表的基础上进行排序操作,如下所示
SELECT
*
FROM
(
SELECT
IF
( length( A.DICT_NAME )> 0, AVG( A.DICT_CODE ), 0 ) WASTE_TYPE,
COUNT( T.ID ) NUMBER,
IFNULL( SUM( T.WEIGHT ), 0 ) WEIGHT,
IFNULL( A.DICT_NAME, '总重量/总数量' ) DICT_NAME
FROM
t_sys_dictionary A
LEFT JOIN t_mw_waste_material T ON T.WASTE_TYPE = A.DICT_CODE
AND T.ORG_CODE = '34010201'
AND T.DEPT_CODE = '3401020101'
WHERE
A.DICT_TYPE = '废弃物类别'
GROUP BY
A.DICT_NAME WITH ROLLUP
) tmp
ORDER BY
NUMBER DESC
派生表没有别名会报错,如下图所示
本文小结
派生表主要是用来对数据进行二次处理的,在第一次处理的结果之上进行操作。