一、分组函数:
常用的分组函数:AVG-平均值,SUM-总和,MIN-最小值,MAX-最大值,COUNT-计数,WM_CAONCAT-行转列
1>行专列(wm_concat)
2>分组函数会自动忽略空值
处理方式:使用NVL函数
例:第一种书写方式会忽略空值,第二三种书写方式正确
3、group by子句的书写规范:select列表中所有未包含在分组函数中的列都应该包含在group by子句中;group by子句中的列不必包含在select列表中
4、where 和having的区别:不能再where子句中使用分组函数,可以在having子句中使用分组函数;在没有分组函数的情况下,都可使用,但是考虑sql优化,使用where的效率会更高。
原因:where :先过滤再分组 having :先分组再过滤。
5、group by子句的增强:group by +rollup(a,b,..)= group by a,b +group by a +group by (null)
6、多表查询:
等值连接
不等值连接
外连接:核心:把对于条件不成立的记录包含在最后记录中 ,使用(+) 可实现
自连接:核心:通过别名的方式,将一张表视为多张表。
存在问题:不适合操作大表(2的n次方) 解决方案:使用层次查询
层次查询:connect by
level 标识数的深度
7、子查询:
使用位置:where 、having 、select ,from
不可使用在group by子句中。
子查询一般不使用排序,除非在top-n分析问题中。
rownum:行号永远按照默认的顺序生成,行号只能是<,<=,不能使用>,>=
多行子查询: in 包含 any:和集合中的任何一个值比较 all:和集合中的所有值比较
子查询和主查询是同一张表时,是采用多表连接的形式还是采用子查询的形式,取决于:from表后的个数、表记录数量(笛卡尔集)
自查询的null值问题: 单行子查询为null,不返回结果;多行子查询为null,不返回结果
原理: d in (a,b,null)<=> a=d and b=d and null=d
8、查看执行计划:
explain plan for +select 子句
select * from table (dbms_xplan.display) ---固定写法
视频详解:请点击