oracle从入门到精通第四篇(伪表|伪列|Rownum|联合关键字|序列)
admin
2024-02-08 04:15:01
0

文章目录

    • 伪表(DUAL 表)
    • 伪列(RowID)
    • 行号(Rownum)
    • 联合关键字:
      • union:结果唯一
      • union all:结果不唯一
      • intersect:求交集
      • minus:从第一个查询结果集中减去第二个查询结果中重复的数据
      • in:表示符合查询结果中的任意一个值
      • not in:表示条件不能是查询结果中的任意一个值
      • some/any:这个和in用法相同
      • all:表示比所有值都大,比所有值都小
    • 序列:sequence
      • 查看序列的下一个值:
      • 查看序列的当前值:
      • 查看当前用户下有哪些序列:
      • 如何修改序列:
      • 如何删除序列:

伪表(DUAL 表)

该表主要目的是为了保证在使用SELECT语句中的语句的完整性而提供的。

一般用于验证函数。例如:

select sysdate,to_char(sysdate,'yyyy-mm-dd HH24:mm:ss') from dual

伪列(RowID)

rowid = 是映射数据库中每一条数据物理地址的唯一标识

适用于删除完全重复的数据

delete from lyric where rowid not in (select min(rowid) from lyric group by content);

行号(Rownum)

这是Oracle根据查询结果动态的编号,用来实现分页查询
1)有序的整数列,每多一条自动加1
2)不能和order by在同一个查询语句中,order by会打乱查询的顺序
3)不能使用表名.rownum的写法
4)如果rownum用在where之后,rownum >= 1 rownum<= 任意值

1.实现第一页数据,编号1-10

SELECTrownum,substr( content, 1, 10 ) || '...' 
FROMlyric 
WHERErownum BETWEEN 1 AND 10;
select rownum,content from lyric where rownum between 1 and 10;

2.实现第二页数据,编号11-20

SELECT* 
FROM( SELECT rownum rn, content FROM lyric WHERE rownum <= 20 ) a 
WHEREa.rn >= 11;

3.实现第三页数据,编号21-30

SELECT* 
FROM( SELECT rownum rn, content FROM lyric WHERE rownum <= 30 ) a 
WHEREa.rn >= 21;

4.实现带有排序效果的分页

SELECT* 
FROM( SELECT rownum rn, content FROM ( SELECT * FROM lyric ORDER BY content ) WHERE rownum <= 20 ) a 
WHEREa.rn >= 11;

5.我们常见的分页是如何实现的:
curpage:当前页 2 3
pagesize:每页行数 10 25
当前页的开始数:(curpage -1) * pagesize +1 11 51
当前页的截止数:curpage * pagesize 20 75

联合关键字:

union:结果唯一

select name from school where name like '%大'
union
select name from school where name like '山%';

union all:结果不唯一

select name from school where name like '%大'
union all
select name from school where name like '山%';

intersect:求交集

select * from school where name like '%大'
intersect
select * from school where name like '山%';

minus:从第一个查询结果集中减去第二个查询结果中重复的数据

select * from school where name like '%大'
minus
select * from school where name like '山%';

in:表示符合查询结果中的任意一个值

条件 in (值1,值2…)
相当于:条件 = 值1 or 条件 = 值2 or …

select * from school where id in (select sid from student);

not in:表示条件不能是查询结果中的任意一个值

条件 not in (值1,值2…)
相当于:条件 <> 值1 and 条件 <> 值2 and …

select * from school where id not in (select sid from student);

some/any:这个和in用法相同

in用在无符号的情况
some/any用在有符号的情况

 select * from school where id = some (select sid from student);select * from school where id < any (select sid from student);

all:表示比所有值都大,比所有值都小

select * from school where id > all (select sid from student);

***:

any >min

练习
查询工资高于20号部门某个员工工资的员工的信息

*:因为in的效率较低,所以用exists代替
exists:存在

select * from school where exists (select sid from student where student.sid = school.id);

not exists:不存在

select * from school where not exists (select sid from student where student.sid = school.id);

序列:sequence

一个单独的数据对象,每多一条自动加一
*:Oracle通过调用序列来实现主键自增
*:在一个新的会话中,必须调用下一个值才能查看当前值
*:序列调用下一个值,会作为下次调用的初始值

创建序列:

create sequence seq_test – 序列名
increment by 1 – 一次增长1
start with 1 – 从1开始
minvalue 1 – 最小值
maxvalue 100 – 最大值
cycle – 循环 默认不循环
nocache; --不缓存 默认缓存20

查看序列的下一个值:

select seq_test.nextval from dual;

查看序列的当前值:

select seq_test.currval from dual;

1.消除延迟段创建特性

alter system set deferred_segment_creation = false;

2.创建表

create table test2(id number(3),name varchar2(20));

3.创建序列

create sequence seq_test2;

4.新增数据

insert into test2 values(seq_test2.nextval,'橘子');
insert into test2 values(seq_test2.nextval,'苹果');

5.查询数据

select * from test2;

查看当前用户下有哪些序列:

select * from user_sequences;

如何修改序列:

alter sequence seq_test increment by 50;

如何删除序列:

drop sequence seq_test;

相关内容

热门资讯

消息称百度旗下昆仑芯瞄准500... 6 月 29 日消息,据《The Information》昨日援引知情人士消息,百度旗下 AI 芯片...
打造夏日消费新场景 第35届北... 北京商报讯(记者 翟枫瑞)6月29日消息,第35届北京国际燕京啤酒文化节新闻发布会在京举行。本届啤酒...
社保基金持仓数据出炉,一季度增... 最近各大上市公司一季度财报都公开了,咱们国家社保基金的持仓数据也全部曝光。目前社保拿着比亚迪价值44...
36氪首发 | 海思、中兴团队... 作者 | 乔钰杰 编辑 | 袁斯来 硬氪获悉,广州宸思通讯科技有限公司(以下简称“宸思科技”)近日完...
两天蒸发47亿市值!一纸税务通... 一纸税务通知书,能让一家百亿龙头两天蒸发47亿市值。 6月22日,北大荒(600598.SH)公告称...
SK海力士将投资1100万亿韩... SK集团会长崔泰源6月29日在韩国“三大重大计划”发布会上宣布,公司将投资1100万亿韩元扩大半导体...
两只A股,终止上市! 两家A股公司,即将摘牌。 6月29日,退市沪科(600608.SH)公告称,上海证券交易所将在202...
原创 M... 一家成立近十年的自动驾驶公司,在IPO时吸引了14家基石投资者认购近一半的发行股份,其中不乏奔驰、比...
基金忠言|国寿安保滤镜碎,三年... 图片来源:视觉中国 蓝鲸新闻6月29日讯(记者 祁和忠)保险系基金公司国寿安保总经理换人了。 6月2...
三星电机计划加码玻璃基板!相关... 6月29日,玻璃基板概念股午后有所回升, 华工科技(000988.SZ)逼近涨停, 彩虹股份(600...
拉萨海关持续壮大外贸经营主体 ...   新华网拉萨6月28日电(记者蒋梦辰)近日,记者从拉萨海关获悉,今年前5个月,西藏有进出口实绩的外...
机构:二季报临近,医药生物板块... 6月29日,华源证券发布了一篇医药生物行业的研究报告,报告指出,业绩期临近,产业链景气度有望再次迎来...
每日收评科创50放量涨超4.5... 财联社6月29日讯,三大指数全线收红,创业板指探底回升,科创50指数大涨4.61%。沪深两市成交额3...
6月多地土拍结构性升温:深圳单... 进入2026年6月,不少城市核心区地块集中诞生高溢价宗地,热度突出的城市包含深圳、杭州、长沙。 其中...
业绩炸裂!盛达资源半年预盈3.... 6月29日,贵金属矿山龙头盛达资源(000603.SZ)发布 2026 年半年度业绩预告,上半年业绩...
A股午后拉升三大股指收涨:半导... A股三大股指6月29日开盘涨跌互现。早盘沪强深弱,创指一度跌超2%。半导体午后拉升,带动两市上涨,沪...
原创 空... 前言 大家好,我是老金。 这几天,两幅极度割裂的画面放在一起,把我看笑了。 一边是在持续的热浪下,欧...
澳大利亚审慎监管局拟放宽银行风... 澳大利亚审慎监管局(APRA)6月29日就修改 银行信用风险资本设定公开征求意见,旨在加大信贷投放以...
全民炒股,急踩刹车!韩国股市突... 屈红燕/证券时报网 全民狂欢、交易高度拥挤、杠杆资金猛增、新入市投资者表现激进、大型IPO吸金等现象...