数据分析之SQL子查询
2019-08-02 15:03
99 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/gg0124/article/details/98205326
文章阅读路线:
- 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
与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' );
查询结果如下:
如果子查询中有值返回的话,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 )
查询结果如下:
如果子查询中有值返回的话,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 )
查询结果如下:
如果子查询有结果返回,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简介&数据表分析&数据查询
- Informix数据表结构分析资料整理之字段类型说明和查询SQL语句
- SQL之数据分析必问查询顺序
- Oracle Class2. SQL查询和SQL函数(Oracle数据类型,ddl,dml,dcl,事务控制语言tcl,sql操作符,sql函数,select语句,运算符,分析函数,临时表)
- Informix数据表结构分析资料整理之字段类型说明和查询SQL语句
- 基于数据字典的通用查询系统(一)SQL语句的构成分析
- 基于数据字典的通用查询系统(一)SQL语句的构成分析
- [SQL Server玩转Python] 二.T-SQL查询表格值及Python实现数据分析
- oracle数据库执行计划统计分析,优化表数据字典,提高sql查询效率
- Informix数据表结构分析资料整理之字段类型说明和查询SQL语句
- Informix数据表结构分析资料整理之字段类型说明和查询SQL语句
- Informix数据表结构分析资料整理之字段类型说明和查询SQL语句
- mysql高级----查询截取分析(二):批量插入数据脚本、用show profile分析sql、全局查询日志
- Mybatis程序中执行和单独执行同一条SQL出现结果不一致(部分数据没有查询出来)
- mysql千万级大数据SQL查询优化
- 数据查询时几个关键字(IN、OR、EXIST)的效率分析
- Sql Server中查询今天、昨天、本周、上周、本月、上月数据
- 今天遇见的sql中使用concat()函数,在数据库查询没问题,在后台获取数据乱码的问题
- SQL查询获取最后一笔时间数据问题
- 只满足某个条件的数据统计SQL各类写法性能分析