关于SQL子查询的使用策略

        在 SQL 优化中,一般遵循**“非必要不使用子查询”**的原则,因为子查询可能会带来额外的计算开销,影响查询效率。但是,并不是所有子查询都需要避免,有时子查询是最优解,具体要根据实际场景选择合适的优化方式。

1、为什么尽量避免子查询?

  • 子查询可能执行多次

    • 非相关子查询(Non-correlated subquery) 执行一次

    • 相关子查询(Correlated subquery) 可能要对每一行都执行一次,严重影响性能

  • 索引可能无法生效

    • 子查询的结果通常存储在临时表中,可能导致索引失效

  • 可能引入不必要的计算

    • 许多子查询可以通过 JOINEXISTS 替代,避免重复计

2、如何优化?

(1)使用子查询

        例:

SELECT * FROM users WHERE id IN (SELECT user_id FROM orders);

         这条SQL中,子查询会遍历 orders 表的所有数据,然后再匹配 users 表,可能导致性能下降。

         优化(使用 JOIN):

SELECT DISTINCT users.* 
FROM users 
JOIN orders ON users.id = orders.user_id;

        避免了子查询的重复执行,直接连接两个表,提高查询效率。

(2)使用 IN 子查询

        例:

SELECT * FROM products 
WHERE category_id IN (SELECT id FROM categories WHERE name = 'Electronics');

        子查询会先获取 id 列,再在 products 表中查找,可能导致索引失效。 

        优化(使用 JOIN):

SELECT p.* FROM products p
JOIN categories c ON p.category_id = c.id
WHERE c.name = 'Electronics';

        JOIN 让查询引擎直接连接表,而不是单独计算子查询,提高查询速度。

(3)使用 NOT IN

        例:

SELECT * FROM users 
WHERE id NOT IN (SELECT user_id FROM orders);

  NOT IN 可能导致索引失效,并且当 orders.user_id 里有 NULL 值时,查询结果可能不正确。

        优化(NOT EXISTS):

SELECT * FROM users u
WHERE NOT EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);
  • NOT EXISTS 通常比 NOT IN 更高效,因为它在找到匹配的记录时就会停止搜索,而 NOT IN 需要计算整个子查询结果。

  • 避免 NULL 值带来的问题

3、什么时候可以使用子查询? 

        虽然子查询通常会带来性能问题,但在某些情况下是合理的。

     (1)子查询返回的结果是一个固定值(如 MAX()MIN()

     (2)子查询无法用 JOIN 代替(如分组统计场景)

     (3)业务逻辑复杂,避免 JOIN 使 SQL 变得过于复杂。

       例如: 

SELECT name, price FROM products 
WHERE price = (SELECT MAX(price) FROM products WHERE category_id = products.category_id);

        这种情况下,子查询返回的是单个值,对性能影响较小。

4、总结

(1)可以优化子查询的场景:

  • IN 子查询 → JOIN

  • NOT IN 子查询 → NOT EXISTS

  • 相关子查询 → JOIN 结合 GROUP BY

(2)适合使用子查询的情况

  • 需要计算单个聚合值(如 MAX()SUM()

  • 业务逻辑导致 JOIN 过于复杂

以上就是关于子查询的相关使用策略! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/900075.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaEE初阶复习(JVM篇)

JVM Java虚拟机 jdk java开发工具包 jre java运行时环境 jvm java虚拟机(解释执行 java 字节码) java作为一个半解释,半编译的语言,可以做到跨平台. java 通过javac把.java文件>.class文件(字节码文件) 字节码文件, 包含的就是java字节码, jvm把字节码进行翻译转化为…

2.pycharm保姆级安装教程

一、pycharm安装 1.官网上下载好好软,双击打开 2.下一步 3.修改路径地址 (默认也可以) 4.打勾 5.安装 不用重启电脑 二、添加解释器 1.双击软件,打开 2.projects – new project 3.指定项目名字,项目保存地址,解释器 4.右击 – …

zk基础—4.zk实现分布式功能二

大纲 1.zk实现数据发布订阅 2.zk实现负载均衡 3.zk实现分布式命名服务 4.zk实现分布式协调(Master-Worker协同) 5.zk实现分布式通信 6.zk实现Master选举 7.zk实现分布式锁 8.zk实现分布式队列和分布式屏障 4.zk实现分布式协调(Master-Worker协同) (1)Master-Worker架构…

Java 实现 字母异位词分组

在这篇博客中,我们将详细解析如何使用 Java 代码来解决 字母异位词分组这个经典的算法问题。我们会逐步分析代码逻辑,并探讨其时间复杂度及优化思路。 题目描述 给定一个字符串数组 strs,请将字母异位词组合在一起。字母异位词是指由相同字…

【Ragflow】10. 助理配置参数详细解析/模型响应加速方法

概述 Ragflow的助理配置中,有很多参数,尽管官方文档给出了一定程度的解释,但不够详细。 本文将对各项参数进行更详细的解释说明,并进一步挖掘某些参数中隐含的潜在陷阱。 助理设置 空回复 含义:输入的问题若未能在…

Mac Apple silicon如何指定运行amd64架构的ubuntu Docker?

如何指定运行amd64架构的ubuntu Docker 下面这个docker命令如何指定运行amd64架构的ubuntu Docker? docker run -it -v $(pwd):/workspace ubuntu:20.04 bash这个命令已经非常接近正确运行一个基于 amd64 架构的 Ubuntu 容器了,但如果你想明确指定运行…

ColPali:基于视觉语言模型的高效文档检索

摘要 文档是视觉丰富的结构,不仅通过文本传递信息,还包括图表、页面布局、表格,甚至字体。然而,由于现代检索系统主要依赖从文档页面中提取的文本信息来索引文档(通常是冗长且脆弱的流程),它们…

使用C++实现HTTP服务

天天开心!!! 阅读本篇文章之前,请先阅读HTTP基础知识 传送门----> HTTP基础知识 文章目录 一、CWeb服务器(核心代码WebServer.cpp)二、静态文件结构三、编译和运行四、访问测试 一、CWeb服务器&#xff…

Reactive编程入门:Project Reactor 深度指南

文章目录 4.2.1 创建 Flux 和 MonoFlux 基础创建方式高级创建模式Mono 创建方式 4.2.2 订阅与数据处理基础订阅模式数据处理操作符 4.2.3 核心操作符深度解析flatMap 操作符zip 操作符buffer 操作符 高级组合模式复杂流处理示例背压处理策略 测试响应式流性能优化技巧 React 编…

【万字总结】前端全方位性能优化指南(完结篇)——自适应优化系统、遗传算法调参、Service Worker智能降级方案

前言 自适应进化宣言 当监控网络精准定位病灶,真正的挑战浮出水面:系统能否像生物般自主进化? 五维感知——通过设备传感器实时捕获环境指纹(如地铁隧道弱光环境自动切换省电渲染) 基因调参——150个性能参数在遗传算…

PQ以及有关索引的笔记Faiss: The Missing Manual

参考Faiss 索引结构总结: 为了加深记忆,介绍一下Inverted File Index(IVF)的名字由来: IVF索引的名字源自“倒排文件”(Inverted File)的概念。在传统的信息检索中,倒排文件是一种索…

win10彻底让图标不显示在工具栏

关闭需要不显示的软件 打开 例此时我关闭了IDEA的显示 如果说只是隐藏,鼠标拖动一个道理 例QQ 如果说全部显示不隐藏

关税核爆72小时!跨境矩阵防御战紧急打响

一、T86崩塌:全球贸易链的至暗时刻 (配图:美国海关系统深夜弹出红色警报) 5月2日凌晨2:17,杭州某光伏企业的供应链系统突然发出刺耳警报——其价值1800万美元的逆变器模块被划入34%关税清单。这场代号"黑天鹅突…

蓝桥杯Java B组省赛真题题型近6年统计分类

困难题 题号题型分值代码量难度通过率内容2024-F解答1581困难0.12最短路问题 Dijkstra 期望2024-G解答20116困难0.19模拟 暴力 搜索 DFS 剪纸 枚举2023-H解答2070困难0动态规划2022-H解答20109困难0.032022-J解答25141困难0搜索2021-H解答2041困难0.18二分 思维 规律2021-I解答…

【网络流 图论建模 最大权闭合子图】 [六省联考 2017] 寿司餐厅

题目描述: P3749 [六省联考 2017] 寿司餐厅 题目描述 Kiana 最近喜欢到一家非常美味的寿司餐厅用餐。 每天晚上,这家餐厅都会按顺序提供 n n n 种寿司,第 i i i 种寿司有一个代号 a i a_i ai​ 和美味度 d i , i d_{i, i} di,i​&…

前端面试题(三):axios有哪些常用的方法

Axios 是一个基于 Promise 的 HTTP 客户端,用于浏览器和 Node.js 中发送 HTTP 请求。它提供了一些常用的方法来处理不同类型的请求。以下是 Axios 中常用的一些方法: 1. axios.get() 用于发送 GET 请求,从服务器获取数据。 axios.get(/api/d…

python match case语法

学习路线:B站 普通的if判断 def if_traffic_light(color):if color red:return Stopelif color yellow:return Slow downelif color green:return Goelse:return Invalid colorprint(if_traffic_light(red)) # Output: Stop print(if_traffic_light(yellow)) …

LLaMA-Factory大模型微调全流程指南

该文档为LLaMA-Factory大模型微调提供了完整的技术指导,涵盖了从环境搭建到模型训练、推理和合并模型的全流程,适用于需要进行大模型预训练和微调的技术人员。 一、docker 容器服务 请参考如下资料制作 docker 容器服务,其中,挂…

【HCIA】静态综合实验练习笔记

实验拓扑图如下: 实验配置思路如下: 1、网段划分、配置IP地址 2、配置DHCP,使客户端获得ip地址 3、配置静态明细路由,内网全网通 4、配置空接口防环 5、配置优先级,实现选路最佳 6、配置缺省路由,实现公网通…

大数据(4.5)Hive聚合函数深度解析:从基础统计到多维聚合的12个生产级技巧

目录 背景一、Hive聚合函数分类与语法1. 基础聚合函数2. 高级聚合函数 二、6大核心场景与案例场景1:基础统计(SUM/COUNT)场景2:多维聚合(GROUPING SETS)场景3:层次化聚合(ROLLUP&…