博客
关于我
mysql之子查询
阅读量:792 次
发布时间:2023-02-11

本文共 2192 字,大约阅读时间需要 7 分钟。

一 定义

子查询是指出现在其他语句(不限于SELECT语句)中的语句,用于完成更复杂的查询任务。

主查询则称为外查询,是指不包含任何嵌套SELECT语句的查询。

二 子查询分类

子查询主要分为以下几种类型:

  • 标量子查询:子查询返回单一值(如标量值),通常用于条件判断或计算。
  • 列子查询:子查询返回多行数据,常用于筛选满足条件的记录。
  • 行子查询:子查询返回单一记录,通常用于精确匹配特定条件。
  • select后面的子查询:子查询出现在SELECT列表中,用于动态获取数据。
  • from后面的子查询:子查询的结果作为主查询的数据源,需为结果表起别名。
  • exists后面的子查询:用于判断是否存在满足条件的记录,结果为布尔值。
  • 三 子查询详解

    1. where或having 后面的子查询

    子查询可以直接用于where或having的条件中,用于动态获取值。

    1. 标量子查询

    子查询返回单一值,常用于比较或计算。

    • 案例1:查询工资高于Abel的员工信息。

      select * from employeeswhere salary > (select salary from employees where last_name = 'Abel');
    • 案例2:查询特定员工的部门信息。

      select department_namefrom departmentswhere department_id = (select department_id from employees where employee_id = 141);

    2. 列子查询(多行子查询)

    子查询返回多行数据,用于筛选满足条件的记录。

    • 案例1:查询特定部门的员工姓名。

      select last_namefrom employeeswhere department_id in (select department_id from departments where location_id in (1400, 1700));
    • 案例2:查询其他工种的最低工资低于IT-PROG的员工信息。

      select employee_id, last_name, job_id, salaryfrom employeeswhere salary < (select max(salary) from employees where job_id = 'IT_PROG')and job_id != 'IT_PROG';

    3. 行子查询

    子查询返回单一记录,用于精确匹配特定条件。

    • 案例:查询员工编号最小且工资最高的员工信息。
      select *from employeeswhere employee_id = (select min(employee_id) from employees)and salary = (select max(salary) from employees);

    2. select后面的子查询

    子查询出现在SELECT列表中,用于动态获取数据。

    • 案例1:查询每个部门的员工数。

      select d.department_id, (select count(*) from employees where department_id = d.department_id) as employee_countfrom departments d;
    • 案例2:查询特定员工所属的部门名称。

      select (select department_name from employees e where employee_id = 102) as department_namefrom departments dwhere d.department_id = (select department_id from employees where employee_id = 102);

    3. from后面的子查询

    子查询的结果作为主查询的数据源,需为结果表起别名。

    • 案例:查询每个部门的平均工资等级。
      select department_id, avg_salary, grade_levelfrom (  select department_id, avg(salary) as avg_salary  from employees  group by department_id) avg_depinner join job_grades on avg_salary between lowest_sal and highest_sal;

    4. exists后面的子查询(相关子查询)

    exists子查询用于判断子查询结果是否存在,结果为布尔值。

    • 案例:查询存在员工的部门名。
      select department_namefrom departments dwhere exists(select * from employees e where e.department_id = d.department_id);

    总结

    子查询是SQL语句中的重要功能,常用于动态数据处理和复杂查询。通过合理使用子查询,可以显著提升查询的灵活性和复杂性。在实际操作中,需根据具体需求选择适合的子查询类型,并注意子查询的优化和性能问题。

    转载地址:http://vxbfk.baihongyu.com/

    你可能感兴趣的文章
    mysql 两列互转
    查看>>
    MySQL 中开启二进制日志(Binlog)
    查看>>
    MySQL 中文问题
    查看>>
    MySQL 中日志的面试题总结
    查看>>
    MySQL 中随机抽样:order by rand limit 的替代方案
    查看>>
    MySQL 为什么需要两阶段提交?
    查看>>
    mysql 为某个字段的值加前缀、去掉前缀
    查看>>
    mysql 主从 lock_mysql 主从同步权限mysql 行锁的实现
    查看>>
    mysql 主从互备份_mysql互为主从实战设置详解及自动化备份(Centos7.2)
    查看>>
    mysql 主键重复则覆盖_数据库主键不能重复
    查看>>
    mysql 优化器 key_mysql – 选择*和查询优化器
    查看>>
    MySQL 优化:Explain 执行计划详解
    查看>>
    Mysql 会导致锁表的语法
    查看>>
    mysql 使用sql文件恢复数据库
    查看>>
    mysql 修改默认字符集为utf8
    查看>>
    Mysql 共享锁
    查看>>
    MySQL 内核深度优化
    查看>>
    mysql 内连接、自然连接、外连接的区别
    查看>>
    mysql 写入慢优化
    查看>>
    mysql 分组统计SQL语句
    查看>>