--rowid 与 rownum
--都做伪列存在
--rowid : 行记录的地址,行的唯一标识,数据插入到表中的是决定
--可以实现去重: 对没有主键|唯一字段的表中多条完全重复的数据,根据rowid实现去重
--去重: 如果表中存在主键或者唯一字段,直接 根据主键或者唯一字段去重
select rowid,rownum from dept;
/*
insert into tb_student values(1,'张三','语文',81);
insert into tb_student values(2,'张三','数学',75);
insert into tb_student values(3,'李四','语文',81);
insert into tb_student values(8,'李四','英语',90);
insert into tb_student values(4,'李四','数学',90);
insert into tb_student values(5,'王五','语文',81);
insert into tb_student values(6,'王五','数学',100);
insert into tb_student values(7,'王五','英语',90);
commit;
*/
select id,name,course,score from tb_student;
--查询到要保留的数据
select max(rowid) from tb_student group by id,name,course,score; --要保留的8条数据的rowid
select *
from tb_student
where rowid in
(select max(rowid) from tb_student group by id, name, course, score);
--查询到要删除的数据
select *
from tb_student
where not rowid in
(select max(rowid) from tb_student group by id, name, course, score);
--删除这些数据
delete from tb_student
where not
rowid in
(select max(rowid) from tb_student group by id, name, course, score);
--rownum 结果集的序号
--规律: 从1开始,每次+1
select * from (select empno,ename,job,mgr,rownum num from emp) where num >=5;
--一个select查询语句就有一个结果集,每一个结果集中数据都有自己的序号-->rownum
--注意: 当需要使用rownum进行一些判定,需要对一个已经确定的结果集的rownum进行判定
--rownum与排序:
/*
一般规律为:
根据非主键字段排序,先确定rownum再排序
根据主键字段排序,先排序,后确定rownum
*/
select empno,ename,sal,rownum from emp order by sal;
select deptno,dname,loc,rownum from dept order by deptno desc;
--如何实现在有排序存在的情况下,保证rownum是规律的,从小到大的
select empno,ename,sal,n,rownum num from (select empno,ename,sal,rownum n from emp order by sal);
--分页
select *
from (select empno, ename, sal, rownum num
from (select empno, ename, sal from emp order by sal))
where num >= 7
and num <= 9;
--真分页
--假分页
--视图与索引
--视图 : 表与结果集之间
--逻辑视图: 不会存储数据,数据来资源原始表结构,起到封装,简化,提高复用性的作用
--物理视图: 真实存储数据
--作用: sql语句的封装与简化,提高复用性,安全性
视图:建立在表|结果集|视图上的虚拟表,有以下作用
1. 简化:select 查询语句
2. 重用:封装select语句 命名
3.