子查询介绍
含义:出现在其他语句中的select 语句,称为子查询或者内查询
外部的查询语句称为外查询或主查询
分类 :
按子查询出现的位置分类:
select 后面
from 后面
支持表子查询
having或者where 后面
支持标量子查询
列子查询
行子查询
exists后面(相关子查询)
按结果集的行列数不同
标量子查询(结果集只有一行一列)
列子查询(结果集只有一列多行)
行子查询(结果集有多行多列)
表子查询(结果集一般为多行多列)
where 和having后面
标量子查询 (单行子查询)
列子查询(多行子查询)
行子查询(多列多行)
特点:1.子查询放在小括号内
2.子查询一般放在条件的右侧
3.标量子查询,一般搭配着单行操作符使用 < > >= <= = <>
列子查询一般搭配着多行操作符使用
in any/some all
4.子查询的执行都优先于主查询,主查询的条件用到了子查询的结果
非法使用标量子查询:子查询的结果不是一行一列
谁的工资比AB高
1.查询AB的工资 select salary from employees where lastname = 'AB'; 2.查询员工信息,需要满足1的结果 select * from employees where employees.salary >( select salary from employees where lastname = 'AB');
返回公司工资最少的员工的lastname job_id salary
1.查询公司中最少工资 select min(salary) from employees; 2.select lastname ,job_id,salary from employees where salary = ( select min(salary) from employees);
查询最低工资大于50号部门的最低工资的部门id和最低工资
1.查询50号部门的工资 select salary from departments where department_id = 50 2.查询每个部门的最低工资 select department_id,min(salary) from employees; group by department_id; 3.在2的基础上筛选1 select department_id,min(select) from departments group by department_id having min(salary)>( select salary from departments where department_id = 50);
列子查询
多行子查询:返回多行、使用多行比较符
操作符 | 含义 |
---|---|
in / not in | 等于列表中的任意一个 |
any / some | 和子查询返回的某一个值比较 |
all | 和子查询返回的所有值进行比较 |
返回local_id中1400或者1700部门中所有的员工姓名
1.select department_id from departments where local_id in (1400,1700); 2.select lastname from employees where department_id in ( select department_id from departments where local_id in (1400,1700));
行子查询
结果集一行多列或者多行多列
查询员工编号最小工资最高的员工信息
select * from employees where(employ_id,salary)= (select min(employ_id),max(salsry) from employees);
放在select的后面
每个部门的员工个数
select d.*,( select count(*) from employees e where e.department_id = d.department_id) 个数 from departments d;
查询员工号为102的员工名
select lastname from employees where employ_id in( select employ_id from employ where local_id = 102);
from后面
将子查询充当一张表,要求起别名
查询每个部门的平均工资的工作等级
select avg(salary),department_id from employees group by department_id select * from job_grade 2.进行连接 select avg.*,g.grade_level from ( select avg(salary) ag,department_id from employees group by department_id ) avg inner join job_grade j on avg.ag between max(salary) and min(salary);
exists后面相关子查询
select exists (select employees_id from employees);
语法:exists(完整查询语句)
结果 :只有1或者0
查询有员工的部门名
select department_name from department d where exists( select * from employees e where d.department_id = e.department_id);