博客
关于我
mysql之子查询
阅读量:789 次
发布时间: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中实现rownum,对结果进行排序
    查看>>
    mysql中对于数据库的基本操作
    查看>>
    Mysql中常用函数的使用示例
    查看>>
    MySql中怎样使用case-when实现判断查询结果返回
    查看>>
    Mysql中怎样使用update更新某列的数据减去指定值
    查看>>
    Mysql中怎样设置指定ip远程访问连接
    查看>>
    mysql中数据表的基本操作很难嘛,由这个实验来带你从头走一遍
    查看>>
    Mysql中文乱码问题完美解决方案
    查看>>
    mysql中的 +号 和 CONCAT(str1,str2,...)
    查看>>
    Mysql中的 IFNULL 函数的详解
    查看>>
    mysql中的collate关键字是什么意思?
    查看>>
    MySql中的concat()相关函数
    查看>>
    mysql中的concat函数,concat_ws函数,concat_group函数之间的区别
    查看>>
    MySQL中的count函数
    查看>>
    MySQL中的DB、DBMS、SQL
    查看>>
    MySQL中的DECIMAL类型:MYSQL_TYPE_DECIMAL与MYSQL_TYPE_NEWDECIMAL详解
    查看>>
    MySQL中的GROUP_CONCAT()函数详解与实战应用
    查看>>
    MySQL中的IO问题分析与优化
    查看>>
    MySQL中的ON DUPLICATE KEY UPDATE详解与应用
    查看>>