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

一. 利用子查询进行过滤

假设订单存储在两个表中。对于包含订单号、客户ID、 订单日期的每个订单,orders表存储一行。各订单的物品存储在相关的 orderitems表中。orders表不存储客户信息。它只存储客户的ID。实际 的客户信息存储在customers表中

现在,假如需要列出订购物品TNT2的所有客户,应该怎样检索?下 面列出具体的步骤

(1) 检索包含物品TNT2的所有订单的编号。

(2) 检索具有前一步骤列出的订单编号的所有客户的ID。

(3) 检索前一步骤返回的所有客户ID的客户信息。

上述每个步骤都可以单独作为一个查询来执行。可以把一条SELECT 语句返回的结果用于另一条SELECT语句的WHERE子句。

也可以使用子查询来把3个查询组合成一条语句。

第一条SELECT语句的含义很明确,对于prod_id为TNT2的所有订单物 品,它检索其order_num列。输出列出两个包含此物品的订单:

下一步,查询具有订单20005和20007的客户ID。

现在,把第一个查询(返回订单号的那一个)变为子查询组合两个 查询。请看下面的SELECT语句:

在SELECT语句中,子查询总是从内向外处理。在处理上面的 SELECT语句时,MySQL实际上执行了两个操作。

首先,它执行下面的查询

此查询返回两个订单号:20005和20007。然后,这两个值以IN操作符要 求的逗号分隔的格式传递给外部查询的WHERE子句。外部查询变成:

可以看到,输出是正确的并且与前面硬编码WHERE子句所返回的值相同。

现在得到了订购物品TNT2的所有客户的ID。下一步是检索这些客户 ID的客户信息。检索两列的SQL语句为:

可以把其中的WHERE子句转换为子查询而不是硬编码这些客户ID:

为了执行上述SELECT语句,MySQL实际上必须执行3条SELECT 语句。最里边的子查询返回订单号列表,此列表用于其外面的 子查询的WHERE子句。外面的子查询返回客户ID列表,此客户ID列表用于 最外层查询的WHERE子句。最外层查询确实返回所需的数据

可见,在WHERE子句中使用子查询能够编写出功能很强并且很灵活的 SQL语句。对于能嵌套的子查询的数目没有限制,不过在实际使用时由于 性能的限制,不能嵌套太多的子查询。

二.作为计算字段使用子查询

使用子查询的另一方法是创建计算字段。假如需要显示customers 表中每个客户的订单总数。订单与相应的客户ID存储在orders表中。

为了执行这个操作,遵循下面的步骤。

(1) 从customers表中检索客户列表。

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

正如前两章所述,可使用SELECT COUNT(*)对表中的行进行计数,并 且通过提供一条WHERE子句来过滤某个特定的客户ID,可仅对该客户的订单进行计数。例如,下面的代码对客户10001的订单进行计数:

为了对每个客户执行COUNT(*)计算,应该将COUNT(*)作为一个子查 询。请看下面的代码:

这 条 SELECT 语句对 customers 表中每个客户返回 3 列 : cust_name、cust_state和orders。orders是一个计算字段, 它是由圆括号中的子查询建立的。该子查询对检索出的每个客户执行一 次。在此例子中,该子查询执行了5次,因为检索出了5个客户

子查询中的WHERE子句与前面使用的WHERE子句稍有不同,因为它使 用了完全限定列名。下面的语句告诉SQL比较 orders表中的cust_id与当前正从customers表中检索的cust_id:

相关子查询(correlated subquery) 涉及外部查询的子查询

这种类型的子查询称为相关子查询。任何时候只要列名可能有多义 性,就必须使用这种语法(表名和列名由一个句点分隔)。为什么这样? 我们来看看如果不使用完全限定的列名会发生什么情况

显然,返回的结果不正确(请比较前面的结果),那么,为什么 会这样呢?有两个cust_id列,一个在customers中,另一个在 orders中,需要比较这两个列以正确地把订单与它们相应的顾客匹配。 如果不完全限定列名,MySQL将假定你是对orders表中的cust_id进行 自身比较。而SELECT COUNT(*) FROM orders WHERE cust_id = cust_id; 总是返回orders表中的订单总数(因为MySQL查看每个订单的cust_id 是否与本身匹配,当然,它们总是匹配的)

虽然子查询在构造这种SELECT语句时极有用,但必须注意限制有歧 义性的列名。

SQL——子查询的概念及使用相关推荐

  1. sql子查询示例_学习SQL:SQL查询示例

    sql子查询示例 In the previous article we've practiced SQL, and today, we'll continue with a few more SQL ...

  2. sql子查询示例_SQL更新查询示例说明

    sql子查询示例 In this article, we're going to learn how to use the SQL update statement - what it is, wha ...

  3. sql 子查询 嵌套查询_SQL子查询– SQL中的嵌套查询

    sql 子查询 嵌套查询 In the real world, there are times when we need a particular set of data but we don't h ...

  4. sql 子查询及基本语句 挺全的收录

    引自https://blog.csdn.net/jia_gugang/article/details/80282873 一.SQL子查询语句 1.单行子查询         select ename, ...

  5. SQL子查询、关联查询

    SQL子查询.关联查询: 注:以上内容仅提供参考和交流,请勿用于商业用途,如有侵权联系本人删除! 持续更新中- 如有对思路不清晰或有更好的解决思路,欢迎与本人交流,QQ群:273557553,个人微信 ...

  6. sql子查询的妙用:用在from后面做子表、用在where后面做子条件以及用在select后面用作子字段

    昨天去客户方让客户小姐姐给我查询一段sql的时候,竟然发现sql子查询还可以这样写: sql子查询不仅仅可以出现在from 后面作为表结构,譬如: select t1.company_id,t1.co ...

  7. mysql 新建子查询_Mysql创建SQL子查询ALIAS

    通常这些被称为视图.例如: CREATE VIEW vMyLongQuery AS SELECT a, b, c FROM (LONG QUERY) X WHERE ... 然后可以像这样引用: SE ...

  8. mysql+sql+子查询语句_SQL子查询

    子查询或内部查询或嵌套查询在另一个SQL查询的查询和嵌入式WHERE子句中. 子查询用于返回将被用于在主查询作为条件的数据,以进一步限制要检索的数据. 子查询可以在SELECT,INSERT,UPDA ...

  9. sql 子查询(mysql)

    子查询:一个查询嵌套在另一个查询当中:又叫内部查询. 子查询 可以分为: 单行单列(就是一个值) 单行多列(就是有一行,这一行有很多不同列数据) 多行单列(同一列不同的数据) 多行多列(可以说就是一张 ...

最新文章

  1. Android SearchView介绍及搜索提示实现
  2. 永远的Macromedia, Macromedia Forever
  3. Selenium测试专项三班隆重开班
  4. 电脑自带 超强系统文件自检 分享
  5. 错误:不能继续进行下一步操作 openfire 设置._如何为MacBook或Mac电脑恢复出厂设置...
  6. [9月29日的脚本] 枚举SharePoint列表(PowerShell)
  7. CodeForces - 888C K-Dominant Character 思维
  8. 对接闪送_中国快递业加速出海,圆通上线“全球闪送”,与顺丰、申通抢市场...
  9. java打jar包的方式,jar命令,maven
  10. css3自适应 fill-available、fit-content、max-content、min-content
  11. 昆仑通态触摸屏如何把参数由触摸屏传递到PLC_昆仑通态MCGS触摸屏如何连接Modsim32进行组态仿真...
  12. python可以处理矩阵吗_Python 稀疏矩阵处理
  13. Kali Linux 网络扫描秘籍 第八章 自动化 Kali 工具
  14. html5支付认证,html5实现微信支付宝接口
  15. 局域网下的两个 QQ 好友进行在线文件传输抓包
  16. c语言所有逻辑符号大全,C语言中的逻辑取反是“~”符号吗逻辑或是“|”符号吗?...
  17. Ubuntu19.04 创建桌面快捷方式
  18. 【C#】Message类的属性Msg所关联的消息ID
  19. python 输入名字输出hello名字_Python 输入输出
  20. echarts饼图label文字颜色

热门文章

  1. MFC注册表CRegKey
  2. 2021年软考考核方式
  3. 搜索引擎介绍系列——数据采集
  4. root后开启指纹支付,root之后不能用指纹支付
  5. 商城 商品模块 数据库 表设计
  6. 力扣(1053.115)补9.13
  7. 数说“德尔塔”病毒,数据分析展示变异新冠毒株的传播情况
  8. 【FPGA学习】Quartus II新建工程流程
  9. Java实验——编写一个程序,实现字符串大小写的转换并倒序输出
  10. 以wifi为媒介,linux系统与android设备交互