视图 (view):
视图的作用就是当一个表中的数据并不想对成员全部开放,只针对不同权限的用户开放不同的数据部分,同子图一样,但是子图的修改,父图并
不受影响,而视图,解决了这一问题
依赖于某表创建一个视图
create view empviewas select employee_id id, last_name name, salary salfrom employeeswhere department_id = 80
更改数据
update empviewset salary = 10000where employee_id = 179
(于此同时,employees表中的工号179的人的salary也是10000)
delete from empview where employee_id = 176;
基于多个已存在的表创建视图
create view empview2asselect employee_id id , last_name name, salary sal ,department_name from employees e, departments dwhere e.department_id = d.department_id
修改视图create or replace
create or replace view empview2asselect employee_id id , last_name namefrom employees e, departments dwhere e.department_id = d.department_id
这样就会将原来的视图覆盖
create or replace view empview2asselect employee_id id , last_name namefrom employees e, departments dwhere e.department_id = d.department_idwith read only
这个视图只能读,不能改
create or replace view empview3asselect department_name dept_name,avg(salary) avg_salfrom employees e , departments dwhere e.department_id = d.department_idgroup by department_name
不存在的列必须起一个别名,且在复杂视图中是不可以使用DML的增删改操作,比如说要改一个平均值,改了之后,那么原来的众多salary改哪个才
能使平均值变为更改后的。
简单视图运行增删改,复杂视图由于使用了组函数,不允许增删改
删除视图
drop view empview3;
Top-N分析
top表示前多少个,N是代表多少,比如2014最好看的前10名电影,Top-10
比如百度搜索信息,第一页显示前10个,第二页10-20的数据。
从表中获取工资前10的员工id,姓名(rownum(伪列)当前表对应的行号)
select rownum, employee_id , last_name , salaryfrom ( select employee_id , last_name , salary from employees order by salary desc )where rownum <= 10
这样可以获取前10名,但是麻烦
但是针对于rownum只能是<= 或 < ,而 = ,> ,>=将不能返回任何数据
查询工资排名40-50名之间
select rn , employee_id , last_name , salaryfrom ( select rownum, employee_id , last_name , salary from ( select employee_id , last_name , salary from employees order by salary desc ) )where rn > 40 and rn <50
这样就实现了类似于百度的分页的效果