单行子查询 vs 多行子查询:SQL 查询的强大工具

在这里插入图片描述

在数据库查询中,子查询(Subquery)是指嵌套在其他查询语句中的查询。子查询可以用来获取在主查询中需要使用的临时数据结果。根据返回结果的数量,子查询可以分为单行子查询和多行子查询。

单行子查询

单行子查询是指返回结果集中只有一行数据的子查询。这类子查询通常用于需要一个具体值的地方,如比较条件或赋值。

特点

  • 返回单个值(单行单列)。
  • 常用于 =<><=>=<> 等单值比较运算符。

示例

有以下两个表:

表1:departments

department_iddepartment_name
1IT
2HR
3Sales

表2:employees

employee_idnamedepartment_idsalary
1张三15000
2李四26000
3王五37000
4赵六15500

现在,想要查询工资最高的员工的姓名:

SELECT name FROM employees
WHERE salary = (
    SELECT MAX(salary) FROM employees
);

查询结果:

name
王五

在这个例子中,子查询 SELECT MAX(salary) FROM employees 返回了一个单一的最大工资值,主查询使用这个值来查找对应的员工姓名。

多行子查询

多行子查询是指返回结果集中可能包含多行数据的子查询。这类子查询常用于需要比较多个值的上下文中。

特点

  • 返回多行数据(通常是一列多行)。
  • 常与 INANYALLEXISTS 等运算符结合使用。

示例

仍然使用上面的 departmentsemployees 表,假设想要查找 IT 部门的所有员工姓名。

多行子查询示例1:使用 IN

SELECT name FROM employees
WHERE department_id IN (
    SELECT department_id FROM departments
    WHERE department_name = 'IT'
);

查询结果:

name
张三
赵六

在这个例子中,子查询 SELECT department_id FROM departments WHERE department_name = 'IT' 返回了多个可能符合条件的 department_id 值(这里返回的是单个值 1,但逻辑支持返回多行),主查询再通过 IN 运算符查找符合条件的员工。

多行子查询示例2:使用 EXISTS

假设要查找至少有一个员工的所有部门名称:

SELECT department_name FROM departments d
WHERE EXISTS (
    SELECT 1 FROM employees e
    WHERE e.department_id = d.department_id
);

查询结果:

department_name
IT
HR
Sales

在这个例子中,EXISTS 子查询会检查 employees 表中是否存在与 departments 表中某部门 department_id 相匹配的记录。

子查询使用技巧

  1. 子查询位置:子查询可以出现在 SELECTFROMWHEREHAVING 等不同的 SQL 语句中。例如:

    • SELECT 中使用子查询

      SELECT name,
             (SELECT department_name FROM departments WHERE department_id = e.department_id) AS department_name
      FROM employees e;
      

      这个查询返回每个员工及其所属部门的名称。

    • FROM 中使用子查询

      SELECT e.name, d.department_name
      FROM (SELECT * FROM employees WHERE salary > 5000) e
      JOIN departments d ON e.department_id = d.department_id;
      

      这个查询通过子查询先筛选出工资大于 5000 的员工,然后再与 departments 表进行连接。

  2. 子查询的性能:当数据量较大时,子查询可能会导致性能问题。尽量避免在可替代为 JOIN 的场合中使用子查询,除非逻辑上必须要用子查询。

  3. 相关子查询:有些子查询会引用外部查询中的列。这种子查询称为相关子查询(Correlated Subquery)。相关子查询通常性能较低,因为子查询在外部查询的每一行都要执行一次。

    SELECT name FROM employees e1
    WHERE salary > (
        SELECT AVG(salary) FROM employees e2
        WHERE e1.department_id = e2.department_id
    );
    

    上述查询中,子查询计算每个部门的平均工资,然后在主查询中选出工资高于该平均工资的员工。

子查询在 SQL 中非常强大,能够帮助解决各种复杂的数据问题。理解单行子查询和多行子查询的区别及其适用场景,对于编写高效的 SQL 查询至关重要。

非常感谢您读到这里!如果您觉得这篇文章对您有帮助,可以关注一下博主。关注后,您将第一时间获得最新的AI、云计算、运维(Linux、数据库,容器等)技术,以及更多实用的技能干货。


无论你是AI新手还是AI专家,学习最前沿的AI技术,AI创富俱乐部你值得拥有!

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值