博客
关于我
mysql之子查询
阅读量:795 次
发布时间: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学习总结(42)——MySql常用脚本大全
    查看>>
    Mysql学习总结(43)——MySQL主从复制详细配置
    查看>>
    Mysql学习总结(44)——Linux下如何实现mysql数据库每天自动备份定时备份
    查看>>
    Mysql学习总结(45)——Mysql视图和事务
    查看>>
    Mysql学习总结(46)——8种常被忽视的SQL错误用法
    查看>>
    Mysql学习总结(48)——MySql的日志与备份还原
    查看>>
    Mysql学习总结(49)——从开发规范、选型、拆分到减压
    查看>>
    Mysql学习总结(4)——MySql基础知识、存储引擎与常用数据类型
    查看>>
    Mysql学习总结(50)——Oracle,mysql和SQL Server的区别
    查看>>
    Mysql学习总结(51)——Linux主机Mysql数据库自动备份
    查看>>
    Mysql学习总结(52)——最全面的MySQL 索引详解
    查看>>
    Mysql学习总结(53)——使用MySql开发的Java开发者规范
    查看>>
    Mysql学习总结(54)——MySQL 集群常用的几种高可用架构方案
    查看>>
    Mysql学习总结(55)——MySQL 语句大全再温习
    查看>>
    Mysql学习总结(56)——MySQL用户管理和权限设置
    查看>>
    Mysql学习总结(57)——MySQL查询当天、本周、本月、上周、本周、上月、距离当前现在6个月数据
    查看>>
    Mysql学习总结(58)——深入理解Mysql的四种隔离级别
    查看>>
    Mysql学习总结(59)——数据库分库分表策略总结
    查看>>
    Mysql学习总结(5)——MySql常用函数大全讲解
    查看>>
    Mysql学习总结(60)——并发量大、数据量大的互联网业务数据库设计规范总结
    查看>>