数据分析之SQL子查询

浏览: 935

文章阅读路线:

  • 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

推荐 0
本文由 DataFrog 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册