本文共 2192 字,大约阅读时间需要 7 分钟。
子查询是指出现在其他语句(不限于SELECT语句)中的语句,用于完成更复杂的查询任务。
主查询则称为外查询,是指不包含任何嵌套SELECT语句的查询。子查询主要分为以下几种类型:
子查询可以直接用于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);
子查询出现在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);
子查询的结果作为主查询的数据源,需为结果表起别名。
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;
exists子查询用于判断子查询结果是否存在,结果为布尔值。
select department_namefrom departments dwhere exists(select * from employees e where e.department_id = d.department_id);
子查询是SQL语句中的重要功能,常用于动态数据处理和复杂查询。通过合理使用子查询,可以显著提升查询的灵活性和复杂性。在实际操作中,需根据具体需求选择适合的子查询类型,并注意子查询的优化和性能问题。
转载地址:http://vxbfk.baihongyu.com/