🔍 SQL 子查询全位置解析:可编写子查询的 7 大子句

子查询可以出现在 SQL 语句的多个关键位置,不同位置的子查询具有独特的行为和限制。以下是系统化总结:


📌 1. WHERE 子句(最常用)

SELECTFROMWHERE 列 操作符 (SELECT ...);

类型

  • 标量子查询(单值)
  • 行子查询(单行多列)
  • 集合子查询(多行单列)
    示例
-- 标量子查询
SELECT * FROM products
WHERE price > (SELECT AVG(price) FROM products);-- 集合子查询
SELECT * FROM customers
WHERE id IN (SELECT cust_id FROM orders);

📊 2. FROM 子句(派生表)

SELECTFROM (SELECT ...) AS 别名 
WHERE 条件;

特点

  • 必须指定别名
  • 可包含任意复杂查询
  • 实质是创建临时视图
    示例
SELECT dept, avg_sal
FROM (SELECT dept_id, AVG(salary) AS avg_salFROM employeesGROUP BY dept_id
) AS dept_avg;

🎯 3. SELECT 子句(标量子查询)

SELECT,(SELECT ...) AS 别名 
FROM;

限制

  • 必须返回单行单列
  • 通常为关联子查询(引用外部列)
  • 每行都会执行一次
    示例
SELECT name,salary,(SELECT AVG(salary) FROM employees) AS avg_sal,salary - (SELECT AVG(salary) FROM employees) AS diff
FROM employees;

🔍 4. HAVING 子句

SELECT 聚合列 
FROMGROUP BYHAVING 聚合函数() 操作符 (SELECT ...);

特点

  • 在分组后执行
  • 可访问聚合函数结果
    示例
SELECT dept_id, AVG(salary) 
FROM employees
GROUP BY dept_id
HAVING AVG(salary) > (SELECT AVG(salary) FROM employees);

🔄 5. JOIN 子句

SELECTFROM1 
JOIN (SELECT ...) AS 别名 ON 连接条件;

优势

  • 预先过滤/聚合连接表
  • 减少连接数据量
    示例
SELECT c.name, o.order_count
FROM customers c
JOIN (SELECT cust_id, COUNT(*) AS order_countFROM ordersGROUP BY cust_id
) o ON c.id = o.cust_id;

⚙️ 6. INSERT 语句

插入数据来源
INSERT INTO 目标表 ()
SELECT ... FROM 源表;

示例

INSERT INTO premium_users (id, name)
SELECT id, name 
FROM users
WHERE total_spend > 10000;
插入值计算
INSERT INTO(1,2) 
VALUES ((SELECT ...), (SELECT ...)
);

限制

  • 每个子查询必须返回单值
    示例
INSERT INTO stats (total_users, avg_salary)
VALUES ((SELECT COUNT(*) FROM users),(SELECT AVG(salary) FROM employees)
);

✏️ 7. UPDATE 语句

UPDATESET= (SELECT ...) 
WHERE 条件;

关键点

  • SET 子句的子查询必须返回单值
  • WHERE 子句可嵌套子查询
    示例
-- 更新员工薪资为部门平均
UPDATE employees e
SET salary = (SELECT AVG(salary)FROM employees WHERE dept_id = e.dept_id
);

⚠️ 8. 特殊位置注意事项

ORDER BY 子句(少用)
SELECTFROMORDER BY (SELECT ...);

限制

  • 子查询必须返回单值
  • 每行执行一次,性能差
    示例
SELECT name, salary
FROM employees
ORDER BY (SELECT AVG(salary) FROM employees);
CREATE VIEW 语句
CREATE VIEW 视图名 AS
SELECT ... FROM (SELECT ...);

⚠️ 子查询通用注意事项

  1. NULL 处理

    • NOT IN 遇 NULL 返回空集 → 用 NOT EXISTS 替代
    -- 危险
    WHERE id NOT IN (SELECT ...) -- 安全
    WHERE NOT EXISTS (SELECT 1 FROM ...)
    
  2. 性能陷阱

    • 关联子查询(Correlated Subquery)导致 O(n²) 复杂度
    • 解决方案:
      -- 低效
      SELECT * FROM t1 
      WHERE col = (SELECT ... FROM t2 WHERE t2.id = t1.id)-- 高效:转为 JOIN
      SELECT t1.* 
      FROM t1 
      JOIN (SELECT ... FROM t2) sub ON t1.id = sub.id
      
  3. 返回结果限制

    位置允许的行/列是否需别名
    WHERE单行或多行(取决操作符)
    FROM任意
    SELECT单行单列可选
    HAVING单行或多行
    SET (UPDATE)单行单列
  4. 可读性优化

    • 超过 2 层嵌套时改用 CTE(公共表表达式):
    -- 嵌套子查询(难维护)
    SELECT ...
    FROM (SELECT ... FROM (SELECT ...)) -- CTE 优化版
    WITH step1 AS (SELECT ...),step2 AS (SELECT ... FROM step1)
    SELECT ... FROM step2;
    

💎 子查询位置决策指南

使用场景首选位置替代方案
行级条件过滤WHEREJOIN
创建临时数据集FROMCTE/临时表
动态计算列值SELECT应用层计算
分组后过滤HAVING子查询 + WHERE
批量插入数据INSERT SELECTETL工具
基于查询结果更新UPDATE SET多语句事务
复杂数据集连接前预处理JOIN物化视图

📌 黄金法则

  1. 能用 JOIN 解决不用子查询(优化器更易优化)
  2. 标量子查询优先放 SELECT,集合查询优先放 WHERE
  3. 关联子查询是 性能最后选项 - 必须用 EXPLAIN 分析
  4. MySQL 中避免在 SELECT 子查询更新相同表(错误 1093)

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

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

相关文章

C#高级:Winform桌面开发中DataGridView的详解(新)

一、数据填充&#xff08;反射&#xff09; 1.封装 /// <summary> /// 渲染DataGridView /// </summary> /// <param name"dataGridView">被渲染控件</param> /// <param name"list">数据集</param> /// <param …

人脸活体识别2:Pytorch实现人脸眨眼 张嘴 点头 摇头识别(含训练代码和数据集)

人脸活体识别2&#xff1a;Pytorch实现人脸眨眼 张嘴 点头 摇头识别(含训练代码和数据集) 目录 人脸活体识别2&#xff1a;Pytorch实现人脸眨眼 张嘴 点头 摇头识别(含训练代码和数据集) 1. 前言 2.人脸活体识别方法 &#xff08;1&#xff09;基于人脸动作的检测​​ &a…

Webpack 自定义插件开发指南:构建流程详解与实战开发全攻略

一. webpack打包流程 开发 Webpack 插件的第一步&#xff0c;就是明确&#xff1a;我的插件要接入 Webpack 构建流程的哪个阶段&#xff0c;解决什么问题。 了解流程之前首先要了解插件的两个核心概念&#xff1a;compiler&#xff0c;compilation 1. compiler&#xff1a;全局…

本地部署Dify+Ragflow及使用(一)

概念说明 RAGflow&#xff1a; 吃透知识&#xff1a;将企业文档&#xff08;如技术白皮书&#xff09;解析为结构化知识片段。精准检索&#xff1a;当用户提问时&#xff0c;从知识库中召回最相关内容。 模型供应商&#xff1a; 提供大脑&#xff1a;为 Dify 提供生成答案的模…

2025.06.24【R语言】|clusterProfiler安装与常见报错FAQ全解

文章目录 一、clusterProfiler安装方法1. Bioconductor官方推荐2. Conda安装&#xff08;个人推荐 适合服务器/依赖复杂环境&#xff09;3. 检查安装 二、常见依赖包安装三、常见报错与解决方案1. 报错&#xff1a;could not find function "bitr"2. 报错&#xff1a…

【转】PostgreSql的镜像地址

docker.io/postgres 项目中国可用镜像列表 | 高速可靠的 Docker 镜像资源 docker.io/postgrest/postgrest:v12.2.8 linux/amd64 docker.io17.34MB2025-04-04 13:14 346 docker.io/postgrest/postgrest:v12.2.12 linux/amd64 docker.io17.38MB2025-05-27 22:02 79 docker.io…

爬虫005----Selenium框架

在总结爬虫 &#x1f577; 框架之前&#xff0c;先总结一下selenium框架&#xff0c;也可以说是selenium库&#xff0c;在自动化测试中是老生常谈了&#xff08;长时间⌛️不用&#xff0c;已经忘记了&#xff0c;实际测试工作中做UI自动化的也很少了&#xff0c;上次搞UI自动化…

记一次 Kafka 磁盘被写满的排查经历

开篇扯犊子 今天踏进办公听到不是同事的早安&#xff0c;而是“有一个好消息&#xff0c;一个坏消息&#xff0c;你想听哪个&#xff1f;” 我一愣&#xff0c;心想“大早上&#xff0c;就要玩刺激的吗&#xff1f;” 但是还是淡定的回复说“无所谓&#xff0c;哥什么场面没见…

python多线程:各线程的输出在控制台中同一行原因分析

代码例子 import threading import timedef error_worker():print("子线程开始")time.sleep(1)raise Exception("子线程出错了&#xff01;")t threading.Thread(targeterror_worker) t.start()print("主线程继续执行&#xff0c;不受子线程异常影响…

Promptify与ReActAgent

一、Promptify 定位&#xff1a;NLP 任务的「自动化流水线」 1. 解决什么问题&#xff1f; 传统 LLM 应用开发痛点&#xff1a; 反复调试&#xff1a;需手工编写/调整 prompt 格式&#xff08;如调整分隔符、示例数量&#xff09;兼容性差&#xff1a;不同模型需重写适配代码…

如何将视频从 iPhone 发送到 Android 设备

如果您想将视频从 iPhone 发送到 Android 设备&#xff0c;尤其是视频尺寸较大时&#xff0c;您需要一种高效的传输方法。本文将为您提供 7 种实用方法&#xff0c;让您轻松发送大型视频文件或短视频片段&#xff0c;并且不会损失视频质量。 第 1 部分&#xff1a;如何通过 iRe…

Stable Diffusion入门-ControlNet 深入理解 第四课:风格迁移与重绘控制模型——让AI也有“艺术天赋”!

大家好&#xff0c;欢迎回到 Stable Diffusion入门-ControlNet 深入理解 系列的第四课&#xff01; 如果你还没有看过上一课&#xff0c;赶紧补课哦&#xff1a;Stable Diffusion入门-ControlNet 深入理解 第三课。 上一课我们讲解了 ControlNet 结构类模型&#xff0c;今天我…

国产鸿蒙系统开放应用侧载,能威胁到Windows地位吗?

上个月华为正式发布了 HarmonyOS PC 操作系统&#xff0c;关于生态方面大家其实一直蛮担心。 例如不兼容Windows应用、不支持应用侧载等。 不过&#xff0c;在最近举行的华为开发者大会 2025 电脑分论坛上&#xff0c;华为终端 BG 平板与 PC 产品线总裁&#xff08;朱懂东&am…

Linux登录检查脚本

登录检查脚本 提高兼容性&#xff08;适应不同Linux发行版&#xff09;增强可视化效果和可读性增加关键资源警戒提示优化表格对齐和颜色使用添加系统安全状态检查 #!/bin/bash# 改进版系统登录提示脚本 # 优化点&#xff1a;兼容性增强、资源警戒提示、表格美化、安全状态检查…

jenkinsfile调用groovy

先决条件 gitlab存放jenkinsfile以及groovy代码,jenkins我个人使用的是2.486具体的部署方法自己搞定,一堆文档. gitlab创建一个devops8项目组以及my-jenkins-demo2项目用于演示过程 创建群组 这里已经创建好相关群组. 进入群组创建新项目 创建一个空白项目 配置项目选项 说明…

Ubuntu20.04离线安装Realtek b852无线网卡驱动

最近有个项目&#xff0c;需要在 Ubuntu20.04 LTS 下开发&#xff0c;首先是安装 Linux&#xff0c;我们可以从下面的网址下载&#xff1a; https://releases.ubuntu.com/20.04/ 本以为一切顺利&#xff0c;结果刚开始就给我整不会了。我的电脑是联想设计师GeekPro7&#xff…

1 Studying《Computer Architecture A Quantitative Approach》5-7

目录 5 Thread-Level Parallelism 5.1 Introduction 5.2 Centralized Shared-Memory Architectures 5.3 Performance of Symmetric Shared-Memory Multiprocessors 5.4 Distributed Shared-Memory and Directory-Based Coherence 5.5 Synchronization: The Basics 5.6 M…

融智兴科技: RFID超高频柔性抗金属标签解析

在当今科技飞速发展的时代&#xff0c; RFID技术凭借其独特的优势&#xff0c;在众多领域得到了广泛应用。然而&#xff0c;在金属环境中&#xff0c;传统RFID标签往往面临着诸多挑战&#xff0c;如信号干扰、识别距离短等问题。融智兴科技推出的RFID 超高频柔性抗金属标签&…

PHP Error: 深入解析与解决策略

PHP Error: 深入解析与解决策略 引言 PHP作为世界上最流行的服务器端脚本语言之一,在全球范围内被广泛使用。然而,在PHP的开发过程中,错误处理是一个非常重要的环节。本文将深入探讨PHP错误处理的相关知识,包括错误类型、错误配置、错误日志以及常见的错误解决策略。 PH…

零基础langchain实战二:大模型输出格式化成json

零基础langchain实战一&#xff1a;模型、提示词和解析器-CSDN博客 书接上文 大模型输出格式化 在下面例子中&#xff1a;我们需要将大模型的输出格式化成json。 import os from dotenv import load_dotenvload_dotenv() # 加载 .env 文件 api_key os.getenv("DEEPS…