【IT168 服务器学院】使用集合操作
UNION
select employee_id,job_id from employees
union
select employee_id,job_id from job_history;
两个表的并集,但不显示重复行。
执行的时候要先排序再剔重,所以结果集是有序的。
union all
也是两个表的并集,而且显示重复行。
语法同上。
intersect
select employee_id,job_id from employees
intersect
select employee_id,job_id from job_history;
minus
select employee_id,job_id from employees
minus
select employee_id,job_id from job_history;
e-j=e-e与j的交集;
j-e=j-j与e的交集;
注:
在select 列表中的表达式必须有同样的数目和类型。
匹配 SELECT 语句
select employee_id,job_id,salary from employees
union
select employee_id,job_id,0 from job_history;
括号可以用拉修改序列的执行顺序。
ORDER BY 子句:
只能在整个集合的最后出现;
可以按照第一个 SELECT 语句中的列名,别名或者位置号排序。
GROUP BY 子句的增强
CUBE 操作符的 GROUP BY
在 GROUP BY 子句中使用 ROLLUP 或者 CUBE 来产生分组小计;
ROLLUP 分组产生包括规则的分组结果和小计的结果的组合;
GROUP BY [ROLLUP](col_name_list)
ROLLUP:
a ab abc
abc
ab ab
a a a
all all all
CUBE 分组产生包括 ROLLUP 产生的结果和交叉分组小计。
cube:
a ab abc
a ab abc
all a ab
b ac
all bc
a
b
c
all
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