MySQL 派生表
时间:2019-11-20 08:52:06 来源:igfitidea点击:
简介:在本教程中,您将了解MySQL派生表以及如何使用它简化复杂的查询。
MySQL派生表简介
派生表是从SELECT语句返回的虚拟表。
派生表类似于临时表,但是在SELECT语句中使用派生表比临时表简单得多,因为它不需要创建临时表的步骤。
术语派生表和子查询经常互换使用。
在SELECT语句的FROM子句中使用独立子查询时,该子查询称为派生表。
下面说明了使用派生表的查询:
请注意,独立子查询是可以独立于包含该子查询的语句执行的子查询。
与子查询不同,派生表必须具有别名,以便您稍后可以在查询中引用其名称。
如果派生表没有别名,MySQL将发出以下错误:
Every derived table must have its own alias.
下面说明了一个使用派生表的SQL语句:
SELECT column_list FROM (SELECT column_list FROM table_1) derived_table_name; WHERE derived_table_name.c1 > 0;
一个简单的MySQL派生表示例
以下查询从示例数据库的orders和orderdetails表中获得2003年销售收入排名前5的产品:
SELECT productCode, ROUND(SUM(quantityOrdered * priceEach)) sales FROM orderdetails INNER JOIN orders USING (orderNumber) WHERE YEAR(shippedDate) = 2003 GROUP BY productCode ORDER BY sales DESC LIMIT 5;
您可以将该查询的结果用作派生表,并将其与产品表联接,如下所示:
SELECT productName, sales FROM (SELECT productCode, ROUND(SUM(quantityOrdered * priceEach)) sales FROM orderdetails INNER JOIN orders USING (orderNumber) WHERE YEAR(shippedDate) = 2003 GROUP BY productCode ORDER BY sales DESC LIMIT 5) top5products2003 INNER JOIN products USING (productCode);
下面显示了上面查询的输出:
在此示例中:
首先,执行子查询以创建结果集或派生表。
然后,执行外部查询,该查询使用productCode列将top5product2003派生表与products表连接在一起。
一个更复杂的MySQL派生表示例
假设您必须将2003年购买产品的客户分为三类:铂金,黄金和白银。
并且您需要了解每个组在以下条件下的客户数量:
- 订单量超过10万的白金客户
- 订单量在1万到10万之间的金牌客户
- 订单量小于1万的白银客户
要构造此查询,您首先需要使用CASE表达式和GROUP BY子句将每个客户放入相应的组中,如下所示:
SELECT customerNumber, ROUND(SUM(quantityOrdered * priceEach)) sales, (CASE WHEN SUM(quantityOrdered * priceEach) < 10000 THEN 'Silver' WHEN SUM(quantityOrdered * priceEach) BETWEEN 10000 AND 100000 THEN 'Gold' WHEN SUM(quantityOrdered * priceEach) > 100000 THEN 'Platinum' END) customerGroup FROM orderdetails INNER JOIN orders USING (orderNumber) WHERE YEAR(shippedDate) = 2003 GROUP BY customerNumber;
以下是查询的输出:
然后,您可以将此查询用作派生表并按以下方式进行分组:
SELECT customerGroup, COUNT(cg.customerGroup) AS groupCount FROM (SELECT customerNumber, ROUND(SUM(quantityOrdered * priceEach)) sales, (CASE WHEN SUM(quantityOrdered * priceEach) < 10000 THEN 'Silver' WHEN SUM(quantityOrdered * priceEach) BETWEEN 10000 AND 100000 THEN 'Gold' WHEN SUM(quantityOrdered * priceEach) > 100000 THEN 'Platinum' END) customerGroup FROM orderdetails INNER JOIN orders USING (orderNumber) WHERE YEAR(shippedDate) = 2003 GROUP BY customerNumber) cg GROUP BY cg.customerGroup;
该查询返回客户组以及每个客户组中的客户数量。
在本教程中,您学习了如何使用MySQL派生表(它们是FROM子句中的子查询)来简化复杂查询。