Oracle 数据库的高级查询

一、分组函数:

    常用的分组函数: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)   ---固定写法

视频详解:请点击

猜你喜欢

转载自blog.csdn.net/hjinping/article/details/80157522