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

