博客
关于我
mysql之子查询
阅读量:793 次
发布时间: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优化相关
    查看>>
    MySql优化系列-优化版造数据(存储过程+函数+修改存储引擎)-2
    查看>>
    MySql优化系列-进阶版造数据(load data statment)-3
    查看>>
    MySql优化系列-造数据(存储过程+函数)-1
    查看>>
    MySQL优化配置详解
    查看>>
    Mysql优化高级篇(全)
    查看>>
    mysql会员求积分_MySql-统计所有会员的最高前10次的积分和
    查看>>
    mysql会对联合索性排序优化_MySQL索引优化实战
    查看>>
    MySQL作为服务端的配置过程与实际案例
    查看>>
    Mysql使用命令行备份数据
    查看>>
    MySQL保姆级教程(SQL语法基础篇)从小白到高手的进阶指南,收藏这一篇就够了
    查看>>
    MySQL修改root密码的各种方法
    查看>>
    MySQL修改root密码的多种方法
    查看>>
    mysql修改一列属性
    查看>>
    MySQL修改密码报错ERROR 1396 (HY000): Operation ALTER USER failed for ‘root‘@‘localhost‘
    查看>>
    Mysql全局优化参数
    查看>>
    MySQL全文索引实现简单版搜索引擎
    查看>>
    MySQL全面瓦解:安装部署与准备
    查看>>
    mysql共享锁与排他锁
    查看>>