SQL第11课——使用子查询

11.1 子查询

查询(query):

任何SQL语句都是查询,但此术语一般指select语句。

select语句是SQL的查询,迄今为止所有的select语句都是简单查询,即从单个数据库表中检索数据的单条语句。

SQL还允许创建子查询(subquery),即嵌套在其他查询中的查询。

11.2 利用子查询进行过滤

本课使用的数据库表都是关系表。订单存储在两个表中。每个订单包含订单编号,客户ID, 订单日期,在orders表中存储为一行。各订单的物品存储在相关的orderitems表中。orders表不存储顾客信息,只存储顾客ID。顾客的实际信息存储在customers表中。

现在需要列除订购物品RGAN01的所有顾客,实时步骤:

  1. 检索包含物品RGAN01的所有订单的编号;------OrderItems表中

  2. 检索具有前一步骤列出的订单编号的所有顾客的ID;------Customers表中

  3. 检索前一步骤返回的所有顾客ID的顾客信息------Orders表中

每个步骤可以单独作为一个查询来执行,可以把一条select语句返回的结果用于另一条select语句的where子句。也可以使用子查询把3个查询组合成一条语句。

第一步骤:

第二步:

结合这两个查询,把第一个查询变为子查询。

子查询总是从内向外处理。

第三步:检索这些顾客ID的顾客信息。

把where子句转换为子查询,

实际使用时由于性能的限制,不能嵌套太多的子查询。

作为子查询的select 语句只能查询单个列,企图检索多个列将返回错误。

使用子查询并不总是执行这类数据检索的最有效方法,更好的方法,以后论述。

11.3 作为计算字段使用子查询

使用子查询的另一种方法是创建计算字段。

假如需要显示customers表中每个顾客的订单总数。订单与相应的顾客ID存储在orders表中,执行这个操作,要遵循下面的步骤:

  1. 从customers表中检索顾客列表;

  2. 对于检索出的每个顾客,统计其在orders表中的订单数目。

对顾客1000000001的订单进行计数:

要对每个顾客执行count(*),应该将它作为一个子查询:

where指定了表名,如果没有具体指定表名,就会返回错误结果,如下:

总是返回orders表中的订单数。

相关推荐
莫叫石榴姐12 分钟前
数据科学与SQL:组距分组分析 | 区间分布问题
大数据·人工智能·sql·深度学习·算法·机器学习·数据挖掘
小技与小术1 小时前
数据库表设计范式
数据库·mysql
安迁岚1 小时前
【SQL Server】华中农业大学空间数据库实验报告 实验三 数据操作
运维·服务器·数据库·sql·mysql
安迁岚1 小时前
【SQL Server】华中农业大学空间数据库实验报告 实验九 触发器
数据库·sql·mysql·oracle·实验报告
Loganer1 小时前
MongoDB分片集群搭建
数据库·mongodb
LKID体1 小时前
Python操作neo4j库py2neo使用之创建和查询(二)
数据库·python·neo4j
刘大浪2 小时前
后端数据增删改查基于Springboot+mybatis mysql 时间根据当时时间自动填充,数据库连接查询不一致,mysql数据库连接不好用
数据库·spring boot·mybatis
一只爱撸猫的程序猿2 小时前
简单实现一个系统升级过程中的数据平滑迁移的场景实例
数据库·spring boot·程序员
无敌岩雀2 小时前
MySQL中的索引
数据库·mysql
a_安徒生2 小时前
linux安装TDengine
linux·数据库·tdengine