-
相关子查询:查询员工表中薪水大于本部门平均薪水的员工
select empno ,ename,sal,(select avg(sal) from emp where deptno=e.deptno)avg
from emp e
where sal>(select avg(sal) from emp where deptno=e.deptno);
查看全部 -
行号永远按照默认顺序生成
行号只能使用<,<=;不能使用>.>=;
实例:查询emp表中薪水排行前三的员工信息
select rownum,empno,ename,sal
from (select * from emp order by sal desc) where ROWNUM<=3;
查看全部 -
多表查询和子查询,最好使用多表查询,因为子查询需要访问两次数据库,而多表查询只需访问一次
查看全部 -
group by 后面不能使用子查询
查看全部 -
查询工资比scott高的员工的工资;
select *
from emp
where sal>(select sal from emp where ename='SCOTT');
查看全部 -
层次查询:“connect by prior...”语句
select level, empno,ENAME,sal,MGR
from emp
connect by prior empno=mgr
start with mgr is null
order by 1;
查看全部 -
外链接:
(1)左外连接:“(+)”放在等号的右边;
(2)右外连接:“(+)”放在等号的左边;
查看全部 -
rollup(a,b)函数
查看全部 -
having语句用于过滤group by语句后的结果 放在group bu语句的后面查看全部
-
group by 语句的增强 rollup查看全部
-
使用count函数计算某列的数量时不会算上为空的字段查看全部
-
8.一般先执行子查询,再执行主查询;但相关子查询例外
(1)**相关子查询 (子查询使用了主查询字段)
select 员工号,姓名,工资,
(select avg(工资) from 员工表 where 部门号 = t1.部门号) 部门平均工资
from 员工表 t1
where 工资 > (select avg(工资)
from 员工表
where 部门号 = t1.部门号)
查看全部 -
>>子查询注意的10个问题
1.子查询语法中的小括号
2.子查询的书写风格
3.可以使用子查询的位置:where,select,having,from
4.不可以使用子查询的位置:group by
5.强调:from后面的子查询
6.主查询和子查询可以不是同一张表
7.一般不在子查询中,使用排序;但在Top-N分析问题中,必须对子查询排序
8.一般先执行子查询,再执行主查询;但相关子查询例外
9.单行子查询只能使用单行操作符;多行子查询只能使用多行操作符
10.注意:子查询中是null值得问题
查看全部 -
>>子查询注意的10个问题
1.子查询语法中的小括号
2.子查询的书写风格
3.可以使用子查询的位置:where,select,having,from
(1) select 必须是单行子查询
select 工号,姓名,工资,(select 职位 from 员工表 where 工号='100')
from 员工表
(2) having
select 部门号,ags(工资)
from 员工表
group by 部门号
having ags(工资) > (select max(工资)
from 员工表
where 部门号 = 30)
(3)from
select *
from(select 员工号,姓名,工资
from 员工表)
4.不可以使用子查询的位置:group by
5.强调:from后面的子查询
select *
from (select 员工号,姓名,工资 月薪,工资*12 年薪 from 员工表)
6.主查询和子查询可以不是同一张表
--子查询
select *
from 员工表
where 部门号 = (select 部门号
from 部门表
where 部门名称 = '销售部')
--多表查询
select t1.*
from 员工表 t1,部门表 t2
where t1.部门号 = t2.部门号
and t2.部门名称 = '销售部'
7.一般不在子查询中,使用排序;但在Top-N分析问题中,必须对子查询排序
**rownum 行号,伪列
*行号永远按照默认的顺序生成
*行号只能使用 <,<=;不能使用 >,>=
select rownum,员工号,姓名,工资
from 员工表
(1)top-n 前三名
select rownum,员工号,姓名,工资
from(select *
from 员工表
order by 工资 desc)
where rownum <= 3
8.一般先执行子查询,再执行主查询;但相关子查询例外
(1)**相关子查询 (子查询使用了主查询字段)
select 员工号,姓名,工资,
(select avg(工资) from 员工表 where 部门号 = t1.部门号) 部门平均工资
from 员工表 t1
where 工资 > (select avg(工资)
from 员工表
where 部门号 = t1.部门号)
--
select 员工号,姓名,工资
from 员工表 t1
where 工资 > (select 部门号,avg(工资)
from 员工表
group by 部门号
having 部门号 = t1.部门号)
--
select t1.员工号,t1.姓名,t1.工资,t2.部门平均工资
from 员工表 t1,
(select 部门号,avg(工资) 部门平均工资
from 员工表
group by 部门号) t2
where t1.部门号 = t2.部门号
and t1.工资 > t2.部门平均工资
9.单行子查询只能使用单行操作符;多行子查询只能使用多行操作符
多行操作符 in/any/all
--in
--any
select *
from 员工表
where 工资 > any(select 工资
from 员工表
where 部门号 = 30)
--等价
select *
from 员工表
where 工资 > (select min(工资)
from 员工表
where 部门号 = 30)
--all
select *
from 员工表
where 工资 > all(select 工资
from 员工表
where 部门号 = 30)
--等价
select *
from 员工表
where 工资 > (select max(工资)
from 员工表
where 部门号 = 30)
10.注意:子查询中是null值得问题
单行子查询null值问题
多行子查询null值问题
**not in
a not in (10,20,null)
a != 10 and a != 20 and a != null
all
select *
from 员工表
where 员工号 not in (select 老板号
from 员工表
where 老板号 not null)
查看全部 -
select *
from emp
where sal>(select sal
from emp
where ename='SCOTT');
查看全部
举报