服务器 频道

PL/SQL学习笔记之十二

  GROUPING 函数
  参数一定是在CUBE或ROLLUP里进行分组排序的字段或表达式之一。

  通过1或0来判断结果集中的空值是由于本身列的值是空的,还是由于使用CUBE或ROLLUP产生的空值。
  1 代表是由于分组产生的空值,没有参与分组。
  0 代表是由于列本身产生的空值,参与了分组,但分组中没有包含它。

  GROUPING SETS

  可以使用 GROUPING SETS 在同一个语句中定义多个组集。

  只需要访问一次基表。
  不需要写很复杂的UNION语句。
  GROUPING SETS 子句中组合的元素越多,语句的执行性能就越好。

  group by GROUPING SETS((abc),(ab),(bc),(a),(b))

  组合列:

  是一个列的组合,在分组计算时被作为一个单元处理。

  高级子查询

  成对子查询:
  行内视图的性能比成对子查询的性能高。

  相关子查询:
  主查询的字段在子查询里做条件(特征)。
  主查询先执行,取出第一条数据,把该数据传入子查询做比较,返回查询结果给主查询,主查询根据这个结果再做查询
  依次类推
  直到主查询中没有可查询列为止。

  EXISTS操作符

  EXISTS 操作符测试子查询的结果是否存在;
  返回 TRUE 或 FALSE
  查询机制:

  如果一个子查询找到了结果:

  在内部子查询中不在继续执行
  条件被设为TRUE

  如果一个子查询没有找到结果:
  条件被设为FALSE

  select col_list from table_name tab_alias

  where exists (select ''x'' from table_name where col=tab_alias.col);
  用的是相关子查询

  NO EXISTS操作符

  和NOT IN 相对应,速度要快,性能好。

  UPDATE 中的相关子查询

  update emp e
  set department_name in(select d.department_name from departments d where e.department_id=d.department_id);

  delete 中的相关子查询

  层次查询

  select [level],column,expr from table [where condition]
  [start with]起点(自底向上/自顶向下)
  [connect by prior + 主键/外键=外键/主键]//看你往哪个方向查

  自顶向下 左边放主键,右边放外键

  select employee_id,last_name,salary,job_id,manager_id
  from employees
  start with manager_id is null
  connect by prior employee_id=manager_id;

  自底向上 右边放主键,左边放外键

  level(伪列)
  层次的级别:不固定值。

  使用 level 和 LPAD 层次化格式的显示

  修剪分支

  Oracle 9i 对DML和DDL语句的扩展

  多表插入的 INSERT 语句

  insert .... select 语句可以被用来在单个DML语句中向多个表插入数据。

  多表插入语句:

  无条件INSERT

  条件 ALL INSERT

  条件 FIRST INSERT

  轮巡 INSERT

0
相关文章