news 2026/5/13 4:35:12

SQL必会必知整理-12-使用子查询

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SQL必会必知整理-12-使用子查询
12.1 子查询
  • 任何SQL语句都是查询。但此术语一般指SELECT语句。

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

12.2 利用子查询进行过滤
SELECT cust_id FROM orders WHERE order_num IN (SELECT order_num FROM orderitems WHERE prod_id = 'TNT2');
  • 上面的SELECT语句,MySQL实际上执行了两个操作:首先,它执行下面的查询:SELECT order_num FROM orderitems WHERE prod_id = 'TNT2' 此查询返回两个订单号:20005和20007。然后,这两个值以IN操作符要求的逗号分隔的格式传递给外部查询的WHERE子句。外部查询变成:SELECT cust_id FROM orders WHERE order_num IN (20005,20007)

  • 在SELECT语句中,子查询总是从内向外处理。

  • 包含子查询的SELECT语句难以阅读和调试,特别是它们较为复杂时更是如此。如上所示把子查询分解为多行并且适当地进行缩进,能极大地简化子查询的使用。

SELECT cust_name,cust_contact FROM customers WHERE cust_id IN (SELECT cust_id FROM orders WHERE order_num IN (SELECT order_num FROM orderitems WHERE prod_id = 'TNT2'));
  • 为了执行上述SELECT语句,MySQL实际上必须执行3条SELECT语句。最里边的子查询返回订单号列表,此列表用于其外面的子查询的WHERE子句。外面的子查询返回客户ID列表,此客户ID列表用于最外层查询的WHERE子句。最外层查询确实返回所需的数据。

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

  • 在WHERE子句中使用子查询(如这里所示),应该保证SELECT语句具有与WHERE子句中相同数目的列。通常,子查询将返回单个列并且与单个列匹配,但如果需要也可以使用多个列。

  • 虽然子查询一般与IN操作符结合使用,但也可以用于测试等于(=)、不等于(<>)等。

  • 这里给出的代码有效并获得所需的结果。但是,使用子查询并不总是执行这种类型的数据检索的最有效的方法。

12.3 作为计算字段使用子查询
  • 使用子查询的另一方法是创建计算字段。

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

  • 子查询中的WHERE子句与前面使用的WHERE子句稍有不同,因为它使用了完全限定列名。

  • 涉及外部查询的子查询。这种类型的子查询称为相关子查询。任何时候只要列名可能有多义性,就必须使用这种语法(表名和列名由一个句点分隔)。

  • 用子查询测试和调试查询很有技巧性,特别是在这些语句的复杂性不断增加的情况下更是如此。用子查询建立(和测试)查询的最可靠的方法是逐渐进行,这与MySQL处理它们的方法非常相同。首先,建立和测试最内层的查询。然后,用硬编码数据建立和测试外层查询,并且仅在确认它正常后才嵌入子查询。这时,再次测试它。对于要增加的每个查询,重复这些步骤。这样做仅给构造查询增加了一点点时间,但节省了以后(找出查询为什么不正常)的大量时间,并且极大地提高了查询一开始就正常工作的可能性。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/9 6:56:26

SSE换环境导致502问题

华为云 必须加固定请求头 headers.add("Content-Type", "text/event-stream");headers.add("Transfer-Encoding", "chunked");阿里云 // 阿里云不可以加 Transfer-Encoding&#xff0c;不然阿里云原生网关报错 502 // 可能原因 阿里云…

作者头像 李华
网站建设 2026/5/13 12:38:15

同花顺短线大赚副图 源码分享

{}IF(PERIODNAME<>"日线") { 统计:"该指标只在日线周期下有效。"; RETURN; } r:((ZDMR[-1]BDMR[-1])-(ZDMC[-1]BDMC[-1]))/SHGZG*100; 大单净量:r; D3:EMA(EMA(r,30),3)*30,color00ffff; D5:EMA(EMA(D3,5),3),colorff00cc; D10:EMA(EMA(D3,10),3),co…

作者头像 李华
网站建设 2026/5/3 17:47:52

红烛量能副图 红多头黄加仓

{}VAR1:(VOL / (((HIGH - LOW) * 2) - ABS((CLOSE - OPEN)))); 买盘:IF((CLOSE > OPEN),(VAR1 * (HIGH - LOW)),IF((CLOSE < OPEN),(VAR1 * ((HIGH - OPEN) (CLOSE - LOW))),(VOL / 2))); 卖盘:IF((CLOSE > OPEN),(0 - (VAR1 * ((HIGH - CLOSE) (OPEN - LOW)))),IF(…

作者头像 李华
网站建设 2026/5/13 6:29:26

PostIn从基础到实践(13) - 集成soular,使用soular用户统一认证登录

PostIn 是一款开源免费的接口管理工具&#xff0c;支持免费私有化部署&#xff0c;轻量、简洁易用。本文将详细介绍如何安装PostInsoular&#xff0c;实现统一认证登录。 1、soular 安装 1.1 安装 本文以CentOS操作系统为例。 下载&#xff0c;CentOS安装包下载地址&#x…

作者头像 李华
网站建设 2026/5/1 2:15:38

使用 Docker 一键部署 PaddleOCR-VL: 新手保姆级教程

作者&#xff1a;飞桨开发者技术专家 刘力 | 适合人群&#xff1a;刚接触 PaddleOCR-VL Docker部署的同学 | 学习目标&#xff1a;从一台刚装好的 Ubuntu 24.04 开始&#xff0c;完成 Docker 环境准备 → 拉起 PaddleOCR-VL 服务 → 本机用 HTTP 调用 /layout-parsing 接口…

作者头像 李华
网站建设 2026/5/13 6:19:12

论文查重免费工具排行榜:9大平台+每日不限次推荐

论文查重免费工具排行榜&#xff1a;9大平台每日不限次推荐 核心工具对比速览 工具名称 查重速度 降重效果 特色功能 适用场景 aicheck 极快 重复率可降30% 专业术语保留 高重复率紧急处理 aibiye 中等 逻辑优化明显 学术表达增强 提升论文质量 askpaper 快 …

作者头像 李华