I 预备知识
1.1 组函数
多行函数,输入一组记录,输出一行记录。
max
、min
、avg
、sum
和count
函数。
例子:查询相同姓名的记录
select * from emp where name=(select name from emp where count(name>=2));
1.2 分组查询 group by
- 如果在select之后有某个字段名称,那么此字段必须作为分组的条件之一。
select deptno,max(sal) from emp group by deptno;--在分组查询中,select 之后除了组函数以外,查询的字段名称和个数最好和group by 之后的字段名称和个数一致。
- 过滤分组查询可以使用
having
关键字,having
用于过滤分组之后的结果
select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;--having不能单独使用,它必须出现在group by 之后。
- where 不可接分组函数
- 分组查询的执行顺序: 先执行from,在执行where,或在分组,最好才执行select。
II 子查询
查询中含有查询
2.1 非关联子查询
单列子查询:查询结果是一行一列
单列子查询可以使用比较运算符(<,>,=,!=,<>)
select enamel ,sal rom emp where sal>(select sal from emp where ename='SOTT');
单行子查询:子查询的结果是一行多列
select enamel,sal。deptno from emp where (deptno,sal) in(select deptno,max(sal) from emp group by deptno having deptno=10);
多行子查询:子查询的结果是多行一列
select * from emp where deptno in(select deptno from emp where job='CLERK');
注:=any
跟in
的效果一样,匹配子查询的所有值
>any
大于最小的
<any
小于最大的
<all
小于最小的
>all
大于最大的
多列子查询:子查询的结果是多行多列
select enamel,sal。deptno from emp where (deptno,sal) in(select deptno,max(sal) from emp group by deptno );
2.2 关联子查询(循环主查询)
子查询和主查询进行关联查询
select * from emp out where sal>(select avg(sal) from emp where out.deptno=deptno group by deptno);
--先将主表out的第一条记录的deptno传到子查询,并将查询结果返回到主查询,主查询将符合条件的记录放入到结果集中,依次循环该过程,直到循环到主表的最后一条记录。
例子
select * from emp out where empno in(select mgr from emp);;--查询出所有的领导
select * from emp out where exists(select 'x' from emp where mgr=out.empno);
--exists,假如存在,子查返回的是true,并不关注子查询返回的具体的结果。