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子句中的子查询)来简化复杂查询。