数据分析之SQL子查询

作者: 数据蛙datafrog | 来源:发表于2018-12-20 23:38 被阅读10次

    文章阅读路线:

    • SQL子查询概念
    • 独立子查询实例
    • 相关子查询实例
    • SQL子查询常见玩伴
    1.SQL子查询概念

    子查询,简单的说就是把一个查询的结果在另一个查询中使用就叫子查询。
    子查询基本分类:

    • 独立子查询
      就是子查询可以独立运行,与外层不存在任何联系的
    • 相关子查询
      就是子查询中引用了父查询中的结果;父查询进行一次,子查询才进行一次

    下面各种SQL查询所用的数据集来自自行车连锁店数据

    2.独立子查询实例

    [业务需求1] 查找位于纽约客户的销售订单:

    SELECT
        order_id,
        order_date,
        customer_id
    FROM
        sales.orders
    WHERE
        customer_id IN (       ---括号中就是子查询,并不受外部的影响,可以直接运行
            SELECT
                customer_id
            FROM
                sales.customers
            WHERE
                city = 'New York'
        )
    ORDER BY
        order_date DESC;
    

    展示结果如下:


    3.SQL 相关子查询实例

    [业务需求2]查询每个订单中的最高价格(一次订单中一般是不止一件商品,求订单中商品的最高价格)

    SELECT
        order_id,
        order_date,
        (
            SELECT
                MAX (list_price)
            FROM
                sales.order_items i
            WHERE
                i.order_id = o.order_id  ##这里就是引用了外部结果
        ) AS max_list_price
    FROM
        sales.orders o
    order by order_date desc;
    

    来看下结果

    4.SQL子查询常见玩伴

    SQL 子查询常和下面的运算一起使用:

    • IN or NOT IN
    • ANY or ALL
    • EXISTS or NOT EXISTS
    4.1 子查询和 IN 运算符一起使用

    与IN运算符一起使用的子查询,要返回一个或多个值,子查询返回值后,外部查询将使用它们

    [业务需求3]:找到所有的山地车和陆地车产品名字

    SELECT
        product_id,
        product_name
    FROM
        production.products
    WHERE
        category_id IN (
            SELECT
                category_id
            FROM
                production.categories
            WHERE
                category_name = 'Mountain Bikes'
            OR category_name = 'Road Bikes'
        );
    

    查询结果如下:


    4.2 SQL子查询和ANY运算符一起用

    如果子查询中有值返回的话,ANY运算符就会返回True
    [业务需求4]:查询大于或者等于任意一个品牌产品平均价格的产品

    SELECT
        product_name,
        list_price
    FROM
        production.products
    WHERE
        list_price >= ANY (
            SELECT
                AVG (list_price)
            FROM
                production.products
            GROUP BY
                brand_id
        )
    

    查询结果如下:


    4.3 SQL 子查询和ALL运算符一起用

    如果子查询中有值返回的话,ALL运算符就会返回True
    [业务需求5]:查询大于或者等于任意一个品牌产品平均价格的产品

    SELECT
        product_name,
        list_price
    FROM
        production.products
    WHERE
        list_price >= ANY (
            SELECT
                AVG (list_price)
            FROM
                production.products
            GROUP BY
                brand_id
        )
    

    查询结果如下:


    4.4 SQL子查询和EXISTS或者 NOT EXISTS 运算符一起用

    如果子查询有结果返回,EXISTS 运算符返回 True,而 NOT EXISTS 则会是相反。

    [业务需求6]查询2017年购买商品的顾客

        SELECT
            customer_id,
            first_name,
            last_name,
            city
        FROM
            sales.customers c
        WHERE
            EXISTS (
                SELECT
                    customer_id
                FROM
                    sales.orders o
                WHERE
                    o.customer_id = c.customer_id
                AND YEAR (order_date) = 2017
            )
        ORDER BY
            first_name,
            last_name;
    

    查询结果如下:


    [业务需求6]查询没有购买商品的用户
    SELECT
        customer_id,
        first_name,
        last_name,
        city
    FROM
        sales.customers c
    WHERE
        NOT EXISTS (
            SELECT
                customer_id
            FROM
                sales.orders o
            WHERE
                o.customer_id = c.customer_id
            AND YEAR (order_date) = 2017
        )
    ORDER BY
        first_name,
        last_name;
    

    查询结果如下:


    参考链接:
    SQL Server Subquery

    相关文章

      网友评论

        本文标题:数据分析之SQL子查询

        本文链接:https://www.haomeiwen.com/subject/tnbrkqtx.html