MySQL 子查询

目录

[1. 标量子查询](#1. 标量子查询)

[2. 行子查询](#2. 行子查询)

[3. 列子查询](#3. 列子查询)

[4. 表子查询](#4. 表子查询)

示例

[1. 标量子查询](#1. 标量子查询)

[2. 行子查询](#2. 行子查询)

[3. 列子查询](#3. 列子查询)

[4. 表子查询](#4. 表子查询)

[5. 复杂示例](#5. 复杂示例)


在 MySQL 中,子查询(或嵌套查询)是指在一个 SQL 查询中嵌套另一个查询。子查询可以用来在主查询中动态地检索数据,常用于过滤、计算和汇总数据等。子查询可以出现在 SELECTWHEREFROMHAVING 子句中。

1. 标量子查询

  • 功能 :返回单个值,通常用于 SELECTWHERE 子句中。

  • 语法

    sql 复制代码
    SELECT 列1, 列2
    FROM 表1
    WHERE 列1 = (SELECT 列1 FROM 表2 WHERE 条件);
    复制代码

2. 行子查询

  • 功能 :返回一行多列的结果,通常用于 WHERE 子句中。

  • 语法

    sql 复制代码
    SELECT 列1, 列2
    FROM 表1
    WHERE (列1, 列2) = (SELECT 列1, 列2 FROM 表2 WHERE 条件);

3. 列子查询

  • 功能 :返回多行单列的结果,通常用于 IN 子句中。

  • 语法

    sql 复制代码
    SELECT 列1, 列2
    FROM 表1
    WHERE 列1 IN (SELECT 列1 FROM 表2 WHERE 条件);

4. 表子查询

  • 功能 :返回多行多列的结果,通常用于 FROM 子句中。

  • 语法

    sql 复制代码
    SELECT t1.列1, t2.列2
    FROM 表1 t1
    JOIN (SELECT 列1, 列2 FROM 表2 WHERE 条件) t2
    ON t1.列1 = t2.列1;

示例

1. 标量子查询

表结构:

employees

employee_id employee_name salary department_id
1 Alice 6000 1
2 Bob 5500 1
3 Carol 7000 2
4 David 8000 2
5 Eve 7500 3

示例:

查找所有员工的姓名,其工资高于公司的平均工资。

sql 复制代码
SELECT employee_name
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
2. 行子查询

表结构:

departments

department_id department_name
1 Sales
2 Engineering
3 HR

示例:

查找所有 employees 表中与 departments 表中 "Engineering" 部门的员工相同的员工记录。

sql 复制代码
SELECT employee_id, employee_name
FROM employees
WHERE (employee_id, department_id) = (
    SELECT employee_id, department_id
    FROM employees
    WHERE department_id = (SELECT department_id FROM departments WHERE department_name = 'Engineering')
);
3. 列子查询

表结构:

managers

manager_id manager_name
1 Alice
3 Carol

示例:

查找 employees 表中那些员工的 ID 出现在 managers 表中的员工。

sql 复制代码
SELECT employee_id, employee_name
FROM employees
WHERE employee_id IN (SELECT manager_id FROM managers);
4. 表子查询

表结构:

employees 表(同上)

示例:

查找所有部门的平均工资,并显示每个部门的部门 ID 和其平均工资。

sql 复制代码
SELECT department_id, avg_salary
FROM (
    SELECT department_id, AVG(salary) AS avg_salary
    FROM employees
    GROUP BY department_id
) AS department_avg_salary;
5. 复杂示例

表结构:

employees 表(同上)

示例:

查找所有工资高于 employees 表中部门 ID 为 2 的所有员工中最高工资的员工。

sql 复制代码
SELECT employee_id, employee_name, salary
FROM employees
WHERE salary > (
    SELECT MAX(salary)
    FROM employees
    WHERE department_id = 2
);
相关推荐
后端优选官1 小时前
上海Agent开发公司:企业级智能体软件的技术架构与落地评估
数据库·人工智能·架构·软件开发·开发经验·上海
JustNow_Man1 小时前
`openspec/config.yaml` 解析与生效机制
数据库
Databend1 小时前
用 QUALIFY 写出更清晰的窗口函数 SQL
数据库·sql·数据分析
数智化管理手记1 小时前
应收应付资金占用过高怎么办?应收应付搭配账龄分析怎么做
大数据·网络·数据库·人工智能·数据挖掘
用户71333585156242 小时前
MySQL - EXPLAIN 执行计划
数据库
这就是佬们吗2 小时前
Python入门③-运算符、条件与循环
开发语言·数据库·vscode·python·pycharm·编辑器
wending-Y2 小时前
Flink 滑动窗口作业 TaskManager RocksDB 状态膨胀 Bug 分析
java·前端·数据库
小大宇2 小时前
mongoDB dump技巧
数据库·mongodb
huijingjituan2 小时前
三方聊天软件工具定制开发|打造企业级智能通讯平台
数据库·安全·阿里云·实时互动·腾讯云
zyplayer-doc2 小时前
研发接口文档怎么长期维护:zyplayer-doc把API、Markdown和变更记录放进同一个知识库
大数据·数据库·人工智能·笔记·pdf·ocr