当前位置: 首页 > article >正文

MySQL之不相关子查询

MySQL 不相关子查询详解

在MySQL中,子查询(Subquery)是指在一个查询语句中嵌套另一个查询语句。子查询可以分为相关子查询不相关子查询。今天我们要详细讨论的是不相关子查询

什么是不相关子查询?

不相关子查询是指子查询的执行不依赖于外部查询。也就是说,子查询可以独立运行,并且它的结果会被外部查询使用。不相关子查询通常用于从另一个表中获取数据,然后将这些数据用于外部查询的条件或计算。

不相关子查询的特点
  1. 独立性:子查询可以独立运行,不依赖于外部查询。

  2. 执行顺序:子查询先执行,外部查询后执行。

  3. 结果集:子查询的结果集通常是一个单一的值、一列值或一个表。

不相关子查询的使用场景
  1. WHERE子句中的子查询:用于过滤外部查询的结果。

  2. SELECT子句中的子查询:用于计算或获取额外的列。

  3. FROM子句中的子查询:用于生成一个临时表,供外部查询使用。

不相关子查询的语法
SELECT column1, column2, ...
FROM table1
WHERE column_name OPERATOR (SELECT column_name FROM table2 WHERE condition);
  • OPERATOR 可以是 =><INEXISTS 等。

  • 子查询 (SELECT column_name FROM table2 WHERE condition) 会先执行,然后将结果传递给外部查询。

代码示例

为了更好地理解不相关子查询,我们通过几个具体的例子来演示。

示例1:在WHERE子句中使用不相关子查询

假设我们有两个表:employees 和 departments

  • employees 表结构:

CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    department_id INT,
    salary DECIMAL(10, 2)
);
  • departments 表结构:

CREATE TABLE departments (
    department_id INT PRIMARY KEY,
    department_name VARCHAR(50)
);

插入一些示例数据:

INSERT INTO departments (department_id, department_name) VALUES
(1, 'HR'),
(2, 'IT'),
(3, 'Finance');

INSERT INTO employees (employee_id, first_name, last_name, department_id, salary) VALUES
(1, 'John', 'Doe', 1, 50000),
(2, 'Jane', 'Smith', 2, 60000),
(3, 'Alice', 'Johnson', 2, 70000),
(4, 'Bob', 'Brown', 3, 80000);

现在,我们想要查询所有在 IT 部门的员工。可以使用不相关子查询来实现:

SELECT first_name, last_name
FROM employees
WHERE department_id = (SELECT department_id FROM departments WHERE department_name = 'IT');

运行结果

first_namelast_name
JaneSmith
AliceJohnson

解释

  1. 子查询 (SELECT department_id FROM departments WHERE department_name = 'IT') 先执行,返回 IT 部门的 department_id,即 2

  2. 外部查询 SELECT first_name, last_name FROM employees WHERE department_id = 2 执行,返回所有 department_id 为 2 的员工。

示例2:在SELECT子句中使用不相关子查询

假设我们想要查询每个员工的姓名和他们的部门名称。可以使用不相关子查询来实现:

SELECT 
    first_name, 
    last_name, 
    (SELECT department_name FROM departments WHERE departments.department_id = employees.department_id) AS department_name
FROM employees;

运行结果

first_namelast_namedepartment_name
JohnDoeHR
JaneSmithIT
AliceJohnsonIT
BobBrownFinance

解释

  1. 子查询 (SELECT department_name FROM departments WHERE departments.department_id = employees.department_id) 为每个员工执行一次,返回对应的部门名称。

  2. 外部查询 SELECT first_name, last_name, ... FROM employees 返回每个员工的姓名和部门名称。

示例3:在FROM子句中使用不相关子查询

假设我们想要查询每个部门的平均工资。可以使用不相关子查询来实现:

SELECT 
    department_name, 
    AVG(salary) AS avg_salary
FROM 
    (SELECT 
         departments.department_name, 
         employees.salary
     FROM 
         employees
     JOIN 
         departments ON employees.department_id = departments.department_id) AS dept_salaries
GROUP BY 
    department_name;

运行结果

department_nameavg_salary
HR50000.00
IT65000.00
Finance80000.00

解释

  1. 子查询 (SELECT departments.department_name, employees.salary FROM employees JOIN departments ON employees.department_id = departments.department_id) 返回一个包含部门名称和工资的临时表 dept_salaries

  2. 外部查询 SELECT department_name, AVG(salary) AS avg_salary FROM dept_salaries GROUP BY department_name 对临时表进行分组,计算每个部门的平均工资。

示例4:在HAVING子句中使用不相关子查询

假设我们想要查询平均工资高于 IT 部门平均工资的部门。可以使用不相关子查询来实现:

SELECT 
    department_name, 
    AVG(salary) AS avg_salary
FROM 
    employees
JOIN 
    departments ON employees.department_id = departments.department_id
GROUP BY 
    department_name
HAVING 
    AVG(salary) > (SELECT AVG(salary) FROM employees WHERE department_id = (SELECT department_id FROM departments WHERE department_name = 'IT'));

运行结果

department_nameavg_salary
Finance80000.00

解释

  1. 子查询 (SELECT department_id FROM departments WHERE department_name = 'IT') 返回 IT 部门的 department_id,即 2

  2. 子查询 (SELECT AVG(salary) FROM employees WHERE department_id = 2) 返回 IT 部门的平均工资,即 65000.00

  3. 外部查询 SELECT department_name, AVG(salary) AS avg_salary FROM employees JOIN departments ON employees.department_id = departments.department_id GROUP BY department_name HAVING AVG(salary) > 65000.00 返回平均工资高于 65000.00 的部门。

不相关子查询的优缺点

优点

  1. 灵活性:可以在多个地方使用子查询,如 WHERESELECTFROMHAVING 等子句。

  2. 可读性:对于简单的查询,子查询可以使SQL语句更易读。

缺点

  1. 性能问题:如果子查询返回的结果集很大,可能会导致性能问题。

  2. 复杂性:对于复杂的查询,嵌套的子查询可能会使SQL语句难以理解和维护。

总结

不相关子查询是MySQL中非常强大的工具,可以帮助我们从多个表中获取数据,并根据这些数据进行过滤、计算和分组。通过本文的示例,你应该已经掌握了不相关子查询的基本用法和常见场景。在实际开发中,合理使用子查询可以大大提高SQL语句的灵活性和可读性,但也要注意避免过度嵌套和性能问题。


http://www.kler.cn/a/552643.html

相关文章:

  • axios post请求 接收sse[eventsource]数据的
  • 力扣高频sql 50题(基础版) :NULL, 表连接,子查询,case when和avg的结合
  • Flutter 状态管理库-----GetX(一)
  • 微机控制电液伺服汽车减震器动态试验
  • 淘宝拍立淘按图搜索商品API接口概述及JSON数据示例返回
  • 【核心算法篇七】《DeepSeek异常检测:孤立森林与AutoEncoder对比》
  • 基于SpringBoot畅购行汽车购票系统
  • Qt——连接MySQL数据库之编译数据库驱动的方法详细总结(各版本大同小异,看这一篇就够了)
  • Ubuntu设置docker代理报网络错误
  • 一文读懂Docker之Dockerfile基本使用
  • 【简历优化】性能调优 — 基础概念篇
  • 高子昂医编---23岁,医疗编上岸,正式开启养老生活
  • 网络安全示意图 网络安全路线图
  • 深度学习笔记——LSTM
  • git 如何显示特定作者的提交历史?
  • 机器学习:k近邻
  • 巧用 PasteMate,联合 DeepSeek 与 LaTeX 高效生成 PDF 文档
  • C#中的图形渲染模式
  • 后端生成二维码,前端请求接口生成二维码并展示,且多个参数后边的参数没有正常传输问题处理
  • 个人shell脚本分享