子查询

出现在其它语句中的select语句称为子查询或内查询,内部嵌套其它select语句,外部的查询语句,称为主查询或外查询

分类
按子查询出现的位置:

  • select 后面:仅仅支持标量子查询
  • from后面:支持查询
  • where 或者 having 后面:标量子查询、列子查询、行子查询
  • exists 后面(相关子查询查询

结果集的行数不同:

  • 标量子查询(结果集只有一行一列)
  • 列子查询(结果集只有一列多行)
  • 行子查询(结果集只有一行多列)
  • 查询(结果集一般为多行多列)

一、where 或having后面

1.标量子查询(单行子查询)
2.列子查询(多行子查询)

3.行子查询(多行多列)
特点:
1.子查询放在小括号内
2子查询一般放在条件右侧
3.标量子查询,一般搭配这单行操作符使用 > < >= <= <>
列子查询一般搭配这单行操作符使用
in any/some all
1.标量子查询
查询谁的工资比Abel的工资高
a.查询Abel的工资

select salary from employees where last_name = 'Abel'

select salary from employees 
where salary>
(select salary from employees where last_name = 'Abel');

一个查询中可以放多个子查询
子查询可以放分组函数

查询公司最低工资的员工名,工资,job_id

select salary ,last_name,job_id from employees where salary=(select min(salary) from employees );

多行子查询:一般要搭配操作符(in,not in, any,some, all)
a.返回location_id 是1400或1700的部门编号

select department_id from departments where location_id in(1400,1700);

b.查询员工姓名,要求是上面部门编号列表中的一个(sql 格式)

select last_name 
from employees
 where department_id in (
select department_id
 from departments
  where location_id in(1400,1700));

返回其它工种中 比job_id 为‘IT_PROG’工种任一工资低的员工的工号、姓名、job_id 以及salary
(这个案例的问题有点长,可以把他拆开来做)
a.查询’IT_PROG‘部门的员工的工号姓名job_id salary

select distinct salary 
from employees 
where job_id='IT_PROG';

b.查询员工号、姓名、job_id、salary<上面列表中的任意一个

select last_name,employee_id,job_id,salary
FROM employees 
where salary < any(
select distinct salary 
from employees 
where job_id='IT_PROG'
)and job_id<>'IT_PROG';

3.行子查询(一行多列,多行多列)很少使用
查询()

二、select 后面

案例:查询每个部门员工的个数

select d.*,(
select count(*)
from employees e
where d.department_id=e.department_id
) from departments d;

from 后面

例如:查询每个部门平均工资等级

select ag_dep.*,g.grade_level
from(
select avg(salary) ag,department_id
from employees
GROUP BY department_id
) ag_dep 
inner join job_grades g
on ag_dep.ag BETWEEN lowest_sal and highest_sal;

exists后面(相关子查询)

exists 语法
exists (完整的语句) 结果为1或0;
select exists (select employee_id from employees );

分页查询

语法:
select 查询列表
from 表
(join type join 表2
on 连接条件
where 筛选条件
group by 分组条件
having 筛选条件
order by 排序条## 标题件)
limit 起始索引,size ;
特点:limit 放在查询语句的最后;

显示前5条数据

select * from employees limit 0,5;
select * from employees limit 5;

显示11到25条数据

select * from employees limit 10,15;

联合查询

union 联合 合并:将多条查询语句的结果合并成一个结果
例如:查询部门编号>90 或邮箱包含a的员工信息
union 默认去重,使用union all 可以保留重复项

select * from employees where email like '%a%' or department_id>90;
select * from employees where email like'%a%'
union 
select * from employees where department_id >90;