一、非常用sql命令
- any和all
- any/some:表示至少一个满足条件
如:列出工资高于B003分中至少一位员工工资的所有员工
select * from staff
where salary > some(select salary from staff where branch_no = 'B003');
- all:表示满足所有条件
如:列出工资高于B003分中所有员工工资的所有员工
select * from staff
where salary > all(select salary from staff where branch_no = 'B003');
- intersect和except
intersect:取相同字段两表或子查询的交集
except:取相同字段两张表,A表与B表的差集,即在A表中存在且不再B表中存在的数据
二、视图
- 视图在DBMS中只存储视图的定义,不存储实际的数据,通过视图访问库数据时,存在一个“视图分解”的过程。
- 视图创建:
create view viewname
as subselect [with[cascaded|local]check option]
- 其中subselect为定义视图的查询语句;
- 使用with check option创建视图,则以下情况的修改是不被允许的:
update更新后,通过视图无法查询出来的数据
insert更新后,通过视图无法查询出来的数据
- 视图删除
drop view viewname [restrict|cascade]
- 删除时如指定cascade,则删除是所有依赖改视图的视图全部都会删除;
- 删除时如指定restrice,则删除时不会删除依赖的视图
- 视图的局限
- 如果视图中某个列是基于聚合函数的,那么在访问改视图的查询语句中,该列只能出现在select和order by子句中
例如:视图staff中一个列cnt是基于聚集函数count,则下述查询会失败
select count(cnt) from staff;//失败
select * from staff where cnt > 2;//失败
- 视图的可更新性
视图的可更新性是指可以通过更新视图对基表数据进行更新,但更新存在一些充分必要条件:
- 没有指定distinct;
- 定义的查询中的所有列名均为表列名,不能为常量、表达式或聚集函数,且列明出现次数不可重复。
- from子句只能指定一个表
- where子句不能包括含有from子句的嵌套select
- 定义的查询中不能包括group by 或having子句
- 视图物化
当普通视图比较复杂且查询频繁时,每次查询时进行驶入分解会影响查询的执行效率,这种情况可以通过将视图查询的数据存入临时表的方式提升查询速度,基表数据进行更新时也需要对临时表数据进行更新。