一、rownum和rowid
rownum是用来找第一个或者找所要求的前几名的,但是如果处于中间太多,个人感觉不太好!
1、rownum是伪列,排序之后可以找到第一个的值
rownum只能从1开始(rownum=2时是无效的)
找出数学最高分的同学的姓名,籍贯
select sname,snativeplace from student where sno in(
select t.sno from (
select * from mark where cid=2001 order by cmark desc)t where rownum=1);
若是要求是求2-6名的话(我是用的差集来算,差集不懂下面有)
查询1班数学的2-6名
select t.* from (
select sname,cname,cmark from student s
join mark m
on s.sno=m.sno and sclass='1班'
join course c
on c.cid=m.cid and cname='数学'
order by cmark desc) t where rownum<=6
minus
select t.* from (
select sname,cname,cmark from student s
join mark m
on s.sno=m.sno and sclass='1班'
join course c
on c.cid=m.cid and cname='数学'
order by cmark desc) t where rownum=1;
2、rowid是伪列,是用来删除重复列的
删除重复列
select * from student order by sno;
delete from student where rowid not in(
select max(rowid) from student group by sno,sname,sage,ssex,snativeplace,smajor,sclass,snative);
(将重复的进行分组,那一组里肯定会有最大值,如果只是一个的话,最大值就是他本身,如果不止一个的话,最大值就是其中一个,然后删除的时候删除非最大值的数)
二、并集(union)、差集(minus)、交集(intersect)
这三种都是上下显示,列没有增加
而且要完成这3种操作,列的个数相等,类别也要一样
下面以最简单的例子举例
1、union
union是会删除重复的,union all是显示所有的
--老师、学生的姓名、性别、年龄
select sname,ssex,sage from student
union all
select tname,tsex,tage from teacher;
2、minus
--求2班的同学
select * from student
minus
select * from student where sclass='1班';
差集的好处是可以减轻计算量,这题不明显
看下面这题
--1000万数据 id 1-1000万 id>7 1000万-7
select * from tt
minus
select * from xx where id in(1,2,3,4,5,6,7);
查找数据一般情况下是直接搜索,可是如果是大数据情况下,效率很低,所以可以采用差集的方式
3、intersect
--求2班的同学
--交集 intersect
select * from student
intersect
select * from student where sclass='1班';
总结:了解rownum,rowid,union,intersect,minus的具体用法。知道用法后还是要多练习语句。
语句的练习可以参考: Oracle的语句练习(本人有的题目尽可能写了多种解法)