文章阅读路线:
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;
查询结果如下:
作者:凡人求索
链接:https://www.jianshu.com/p/3c4a20217928