当前位置 主页 > 网站技术 > 代码类 >

    mysql派生表(Derived Table)简单用法实例解析

    栏目:代码类 时间:2019-12-31 12:06

    本文实例讲述了mysql派生表(Derived Table)简单用法。分享给大家供大家参考,具体如下:

    关于这个派生表啊,我们首先得知道,派生表是从select语句返回的虚拟表。派生表类似于临时表,但是在SELECT语句中使用派生表比临时表简单得多,因为它不需要创建临时表的步骤。所以当SELECT语句的FROM子句中使用独立子查询时,我们将其称为派生表。废话不多说,我们来具体的解释:

    SELECT 
      column_list
    FROM
    *  (SELECT 
    *    column_list
    *  FROM
    *    table_1) derived_table_name;
    WHERE derived_table_name.column > 1...
    
    

    其中标记星号的地方就使用了派生表。为了详细点,咱们来看个具体的例子。咱们接下来要从数据库中的orders表和orderdetails表中获得2018年销售收入最高的前5名产品。先来看下表的字段:

    咱们先来看下面这条sql:

    SELECT 
      productCode, 
      ROUND(SUM(quantityOrdered * priceEach)) sales
    FROM
      orderdetails
        INNER JOIN
      orders USING (orderNumber)
    WHERE
      YEAR(shippedDate) = 2018
    GROUP BY productCode
    ORDER BY sales DESC
    LIMIT 5;
    
    

    这条sql是以两张表中共有的orderNumber字段为联合查询的节点,完事之后,以时间为条件,再以那个什么productCode字段为分组依据,完事获取分组字段和计算之后的别称字段,再以sales字段为排序依据,最后提取前五条结果。大概就是这么回事,完事结果集我们可以看做是一张临时表或者别的什么。大家来看个结果集:

    +-------------+--------+
    | productCode | sales |
    +-------------+--------+
    | S18_3232  | 103480 |
    | S10_1949  | 67985 |
    | S12_1108  | 59852 |
    | S12_3891  | 57403 |
    | S12_1099  | 56462 |
    +-------------+--------+
    5 rows in set
    
    

    完事呢,既然是学习派生表,我们当然可以使用此查询的结果作为派生表,并将其与products表相关联。其中,products表的结构如下所示:

    mysql> desc products;
    +--------------------+---------------+------+-----+---------+-------+
    | Field       | Type     | Null | Key | Default | Extra |
    +--------------------+---------------+------+-----+---------+-------+
    | productCode    | varchar(15)  | NO  | PRI |     |    |
    | productName    | varchar(70)  | NO  |   | NULL  |    |
    | productLine    | varchar(50)  | NO  | MUL | NULL  |    |
    | productScale    | varchar(10)  | NO  |   | NULL  |    |
    | productVendor   | varchar(50)  | NO  |   | NULL  |    |
    | productDescription | text     | NO  |   | NULL  |    |
    | quantityInStock  | smallint(6)  | NO  |   | NULL  |    |
    | buyPrice      | decimal(10,2) | NO  |   | NULL  |    |
    | MSRP        | decimal(10,2) | NO  |   | NULL  |    |
    +--------------------+---------------+------+-----+---------+-------+
    20 rows in set
    
    

    表结构既然了解完事了,我们就来看下面的sql:

    SELECT 
      productName, sales
    FROM
    #  (SELECT 
    #    productCode, 
    #    ROUND(SUM(quantityOrdered * priceEach)) sales
    #  FROM
    #    orderdetails
    #  INNER JOIN orders USING (orderNumber)
    #  WHERE
    #    YEAR(shippedDate) = 2018
    #  GROUP BY productCode
    #  ORDER BY sales DESC
    #  LIMIT 5) top5_products_2018
    INNER JOIN
      products USING (productCode);
    
    

    上面#号部分是咱们之前的那条sql,方便大家理解,我使用#标记了出来,大家写的时候可不能用啊。完事我们来看下这条sql是神马意思呢?它是把我们用#标记的部分当做一个表,来做一个简单的联合查询而已。然而这个表,我们就叫它派生表,它会在使用过后即时清除的,所以我们在简化复杂查询的时候可以考虑使用。废话不多说,我们来看下结果集: