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表中的订单数。

相关推荐
余槐i2 小时前
PostgreSQL 函数索引报错 must be immutable:3种绕法与代价
数据库·后端·sql·postgresql·性能优化
数据库小学妹2 小时前
PostgreSQL表膨胀怎么办?autovacuum清不动的根因与排查命令
数据库·postgresql·表膨胀·mvcc·数据库运维
mister_guo2 小时前
MySQL-1267错误:排序规则冲突的原因与解决方案
数据库·mysql
骇客野人3 小时前
在麒麟操作系统上 分别安装 jdk1.8, 达梦数据库,redis ,memcache 的操作实施方案和步骤
数据库·redis·memcached
美狐美颜SDK开放平台4 小时前
直播APP如何实现美白滤镜功能?视频美颜SDK技术开发方案详解
前端·数据库·人工智能·音视频·美颜sdk·直播美颜sdk·视频美颜sdk
花间相见6 小时前
【计算基础|MySQL01】【上手】安装连接、数据类型与建库建表
数据库·后端
花间相见6 小时前
【计算基础|MySQL02】【上手】SQL 增删改查
数据库·后端
ITxiaobing20236 小时前
IP 库与 AppsFlyer 国家/地区数据不一致,如何系统地对账?
数据库·网络协议·tcp/ip
这个DBA有点耶6 小时前
从时间到语义:时序数据库与向量数据库的核心机制、选型与多模融合趋势
数据库·mysql·架构
对空六课6 小时前
RFM分层边界变化的回溯计算
大数据·服务器·前端·数据库·人工智能·算法·数据分析