Oracle使用(二)—— 一些常用的SQL命令和基础知识(包含权限、序列、视图、索引、完整性约束、事务等)

一、使用SQLPLUS连接数据库并切换或解锁账号

sqlplus  sys/123@orcl as sysdba(只用于dba) --初次连接

conn system/123@orcl  --切换帐号

conn sys/123@orcl as sysdba  --切换帐号

show user  --显示当前帐户

alter user scott account unlock;  --解锁

alter user scott account lock;  --加锁 

二、表空间、用户、角色、系统权限和对象权限

--查询数据文件
select * from v$datafile;

--查询日志文件
select * from v$logfile;

--查询控制文件
select * from v$controlfile;

--创建表空间
create tablespace ts_alex
datafile 'D:\Oracle\Server\oradata\orcl\alex_file.dbf' --数据文件的后缀名无固定类型,可随意编写
size 10M --指定数据文件的初始容量,单位可以是K(千字节)和M(兆字节)
autoextend on--设置初始空间使用完毕之后是否自动增加容量,on表示打开,off表示关闭
next 10M --当打开容量自动增加时,使用next设置每次增加的大小
maxsize 100M; --表示允许为数据文件分配的最大空间,不设置表示无限制

--创建临时表空间
crate temporary tablespace ts_alex_temp
...  --同上

--查询所有表空间
select * from v$tablespace;

--修改表空间
alter tablespace ts_alex 
add datafile 'D:\Oracle\Server\oradata\orcl\data_file2.dbf'
...  --同上

--删除表空间
drop tablespace ts_alex including contents and datafiles;

--查询所有用户
select * from all_users;

--创建用户(新创建的用户没有任何功能,不能连接数据库,这时要赋予角色或权限)
create user alex
identified by 123
default tablespace ts_alex; --tmporary tablespace ts_alex_temp

--修改用户
alter user alex
identified by alex123;

--修改用户表空间
alter user alex
default tablespace system
temporary tablespace ts_alex_temp;

--删除用户
drop user alex cascade; 

--角色:是一组权限的集合,常用的系统角色有:connect、resource、dba
connect --连接数据库
resource --使用数据库的表空间
dba --系统管理员的所有权限

--查看所有的角色
select * from user_role_privs;

--创建角色
create role alex;

--删除角色
drop role alex;

--权限:
--系统权限:表示在任何oracle帐号中执行指定的语句,如:create/drop/alter等DDL语句
--对象权限:是由用户赋予的访问或操作数据库对象的权限,如:insert/update/select等DML语句
--查询当前用户下的系统权限
select * from user_sys_privs;

--查询某个角色下的系统权限
select * from dba_sys_privs where grantee='CONNECT';

--查询对象权限
select * from user_tab_privs;

--查询当前用户下的表
select * from user_tables;

--系统权限传递
grant create user to scott with admin option;

--对象权限传递
grant create user to scott with grant option;

--角色权限
--将connect/resource/dba角色赋予alex角色
grant connect,resource,dba to alex;

--赋予alex角色对scott.emp表的查询、修改权限
grant select,update on scott.emp to alex;

--回收alex角色的dba角色
revoke dba from alex;

--回收alex角色中对scott.emp表的修改权限
revoke update scott.emp from alex;

--将角色alex赋予用户scott
grant alex to scott;

--回收用户scott的alex角色
revoke alex from scott;

--授予用户scott无限表空间权限
grant unlimited tablespace to scott;

--用户权限同上

--查询表的伪列
select e.*,rownum from emp e;

--复制一个新的表
create table emp3 as select * from emp where 1=1;

三、数据类型

1、字符类型

①  char类型:表示固定长度的字符串,它的列长度是1-2000个字节,未定义时默认占用一个字节,若用户输入的值小于指定长度,

则在值后用空格补全,若用户输入的值大于指定的长度时则返回错误报告;

②  varchar2类型:表示可变长度的字符串,它的列长度是1-4000个字节;

③  long类型:用来存储可变长度的字符串,最多能存储2GB,它可以用来存储varchar2类型不能存储的长文本信息,其长度受计算机

上可用存储空间的限制,设置long数据类型时需遵循以下原则:

a.一个表只能有一个列可以为long数据类型;

b.long列不能定义为唯一约束或主键约束;

c.long列上不能建立索引;

d.过程或存储过程不能接受long数据类型的参数

2、数值类型

number类型可以存储正数、负数、零、定点数和精度为38位的浮点数,用法如下:

①  列名  number	默认值(P=38,S=0)

②  列名  number(P)	使用定点数

③  列名  number(P,S)	使用浮点数

P为精度表示数字的有效位数,值在1-38之间,S为范围表示小数点右边的位数,值在-84~-127之间


3、日期时间类型

①  date类型:用于存储表中的日期和时间类型的数据,date类型的存储空间是固定的7个字节,每个字节分别存储世纪、年、月、日

小时、分钟、秒

sysdate  代表当前的系统时间

②  timestamp类型:用于存储年、月、日、小时、分钟、秒(精确到小数点后6位),同时包含时区信息

4、RAW和LONG RAW类型(存储的是二进制数据值)

①  raw类型:用于存储基于字节的数据,些类型最多存储2000个字节,该类型没有默认大小,使用时应指定大小,可建立索引

②  long raw:用于存储可变长度的二进制数据,最多存储2GB,不可建立索引,long类型受到的所有限制对long raw类型也同样有效

5、LOB数据类型(大对象数据类型,可存储4GB的非结构化信息)

① clob(字符lob),它能存储大量字符数据,可用于存储非结构化的xml文档;

② blob(二进制lob),它能存储较大的二进制对象,如图片、视频、音频等;

③ bfile(二进制文件),它能将二进制文件存储在数据库外部的操作系统文件中

6、伪列

伪列就像是oracle中的一个表的列一样,它并未存储在表中,伪列可以从表中查询,但不能添加、修改、删除等

1、rowid:数据库中的每一行都有一个行地址,rowid返回该行的地址,用途如下:

①  能以最快的方式访问数据表的一行数据

②  能显示数据表的行是如何存储

③  可以作为数据表中的唯一标识

select rowid,ename from emp where empno="6300";

2、rownum:返回一个数值表示行的次序,通过rownum可以限制查询返回的行数

select * from emp where rownum<51;

四、数据定义语言(DDL)

关键字:create、alter、drop、truncate

1、create table

--创建表
create table tb_user(
  u_no number primary key,
  u_name varchar2(20),
  u_sex char(2),
  u_birthday date
);

--添加注释举例
comment on table emp is '员工表';  --给表添加注释
comment on column emp.empno is '员工编号';  --给列添加注释

2、alter table

--修改列的定义
alter table tb_user modify u_name varchar2(50);

--修改列名
alter table tb_user rename column u_name to uname;

--添加新列
alter table tb_user add (phone number(11));

--删除列
alter table tb_user drop column phone;

--修改表名
alter table tb_user rename to t_user;

--修改表所在的表空间
alter table tb_user move tablespace system;

--为表中的某一列添加唯一约束
alter table tb_user add constraint my_unique unique(u_name);

3、truncate table(可删除表中所有的行,不删除表的结构,并释放表使用的存储空间,由于使用事务处理,因此不能回滚)

truncate table tb_user;

4、drop table

--删除表及其全部数据
drop table tb_user;

--删除表以及所有引用这个表的视图、约束或触发器
drop table tb_user cascade constrains;


--查询数据字典视图来了解该表被删除后是否在回收站中
select object_name,original_name from recyclebin where original_name="TB_USER";

--恢复被删除的表(在回收站中)
flashback table tb_user to before drop;

五、数据操纵语言(DML)

关键字:insert、update、delete、select

1、insert

--向表中添加数据
insert into tb_user values(1,'alex','男',sysdate);

--向表中指定列添加数据(没有添加值的列必须是可以为null的列)
insert into tb_user (u_no,u_name) values(1,'alex');

--向表中添加日期数据类型的值
a.insert into tb_user(u_date) values(to_date('2017-7-10 12:12:12','yyyy-mm-dd hh24:mi:ss'));

b.insert into tb_user(u_date) values('31-1月-09');--默认格式

c.insert into tb_user(u_date) values(date'2017-7-10');

2、delete

--删除表中的行数据(可以回滚)
delete from tb_user where u_no=1;

--删除表中的全部数据(可以回滚)
delete from tb_user;

3、update

--更新表中某一列的值
update tb_user set u_name='alex' where u_no=1;

--更新表中所有行某一列的值
update emp set sal=sal*1.2;

update emp set sal=(select avg(sal) from emp where job='MANAGER') where sal<2000;

4、select

select语法:

select{[distinct|all]columns|*} 	--用于选择数据表、视图中的列(select语句中可以对数字数据和日期数据使用算术表达式)
[into table_name]			--用于将原表的结构和数据插入新表中
from{tables|views|other select}		--用于指定数据来源,包括表,视图和其他select语句
[where conditions]			--用于对检索的数据进行筛选
[group by columns]			--用于对检索的结果进行分组显示
[having conditions]			--用于从使用group by子句分组后的查询结果中筛选数据行
[order by columns]			--用来对结果集进行排序(包括升序和降序)

①简单查询

--查询emp表
select * from emp;

--查询scott用户下的emp表
select * from scott.emp;

--查询多个数据表
select * from emp,dept;

--查询emp表中的指定列(显示顺序可以跟表中列的顺序不同)
select job,ename,empno from emp;

--查询emp表中的sal列将值调整为原来的1.2倍
select sal*1.2 ,sal from emp;

--为emp表的指定列指定别名
select empno "员工编号",ename "员工名称" from emp e;

--显示emp表中的job列,要求显示的job记录不重复
select distinct job from emp;



②筛选查询(where 子句中不能使用聚合函数)

a.比较筛选

--比较筛选的六种情况:

A=B:比较A与B是否相等

A<>B:比较A与B是否不相等(!不可用)

A>B:比较A是否大于B

A<B:比较A是否小于B

A>=B:比较A是否大于或等于B	

A<=B:比较A是否小于或等于B

--查询emp表中工资大于1500的员工信息
select empno,ename,sal from emp where sal>1500;

--使用all关键字查询emp表中工资同时不等于3000、950、800的员工记录
select * from emp where sal<>all(3000,950,800);


b.特殊关键字筛选(可以在关键字前面加上not来表示否定的判断)

1.like关键字:字符串模糊查询,它需要使用通配符在字符串内查找指定的模式,常用的通配符"_",它代表任意一个字符,

"%"代表任意数量的字符,比如:"K%"表示以字母开头的任意长度的字符串,"%M%"表示包含字母M的任意长度的字符串,

"_MRKJ"表示5个字符长度且后面4个字符是MRKJ的字符串

--在emp表中使用like关键字匹配以字母S开头的任意长度的员工名称
select * from emp where ename like 'S%';

2.in关键字:测试一个数据值是否匹配一组目标值中的一个,该关键字可以用来指定列表搜索条件

--在emp表中使用in关键字查询职务为"PRESIDENT"、"MANAGER"、"ANALYST"中任意一种的员工信息
select * from emp where job in('PRESIDENT','MANAGER','ANALYST');

3.between关键字:需要返回某一个数据值是否位于两个给定的值之间时,可以使用between...and来指定范围条件,指定的第一个值必须小于第二个值,

因为between...and实质是“大于等于第一个值,并且小于等于第二个值”的简写形式,等价于比较运算符(>=...<=)

--在emp表中查询工资在2000到3000之间的员工信息
select * from emp where sal between 2000 and 3000;

4.is null关键字:空值(NULL)从技术上来说就是未知的、不确定的值,但空值与空字符串不同,空值是不存在的值,而空字符串是长度为0的字符串

--查询emp表中comm为null的员工
select * from emp where comm is null;

c.逻辑筛选(可以把多个筛选条件组合起来,便于用户获取更加准确的数据记录)

1.and(逻辑与的关系)

--在emp表中使用and运算符查询工资在2000到3000之间的员工信息
select * from emp where sal>=2000 and sal<=3000;

2.or(逻辑或的关系)

--在emp表中使用or运算符查询工资小于2000或工资大于3000的员工信息
select * from emp where sal<2000 or sal>3000;

3.not(逻辑非的关系)


③分组查询

a.group by子句:基于指定列的值将数据集合分为多个组,也可以基于多列值分为多个分组

--在emp表中按部门编号进行分组查询
select deptno from emp group by deptno;

b.group by子句与聚合函数:查询列表中非聚合函数列表都应包含在group by列表中

--在emp表中通过分组的方式计算每个部门的平均工资
select deptno 部门编号,avg(sal) 平均工资 from emp group by deptno;

c.having子句:对group by子句选择出来的结果进行再次筛选,having子句中可以包含聚合函数

--在emp表中通过分组的方式计算每个部门的平均工资,再通过having子句筛选出平均工资大于2000的部门信息
select deptno 部门编号,avg(sal) 平均工资 from emp group by deptno having avg(sal)>2000;


④排序查询:关键字asc表示升序(默认),关键字desc表示降序

a.order by子句:多组排序时,第一个排序项是主要排序依序,其次那些是次要的排序依据

--查询emp表中的所有员工信息,按照部门编号、员工编号进行排序
select * from emp order by deptno,empno;

b.排名

1.有并列,不连续的排名

--根据工资对员工进行排名
select e.*,rank() over(order by sal desc) 名次 from emp e;

--根据部门对每个部门的员工进行排名
select e.*,rank() over(partition by deptno order by sal desc) 名次 from emp e;

2.有并列,有连续的排名

--根据工资对员工进行排名
select e.*,dense_rank() over(order by sal desc) 名次 from emp e;

--根据部门对每个部门的员工进行排名
select e.*,dense_rank() over(partition by deptno order by sal desc) 名次 from emp e;

3.无并列,有连续的排名

--根据工资对员工进行排名
select e.*,row_number()over(order by sal desc,empno asc) 名次 from emp e;

--根据部门对每个部门的员工进行排名
select e.*,row_number()over(partition by deptno order by sal desc,empno asc) 名次 from emp e;

⑤多表关联查询

a.表别名(from子句最先执行,然后才是where子句和select子句)

--查询出job为"MANAGER"的员工信息和部门编号
select e.*,d.deptno from emp e,dept d where e.deptno=d.deptno and e.job='MANAGER';

b.内连接:join...on(join表示两个表之间的连接,on表示实现内连接的“连接条件”,查询结果中,所有的记录行都是满足连接条件的)

--查询出job为"MANAGER"的员工信息和部门编号
select e.*,d.deptno from emp e join dept d on e.deptno=d.deptno where job='MANAGER';

c.外连接:外连接扩展了内连接的结果集,除了返回所有匹配的行外,还会返回一部分或全部不匹配的行

1.左外连接:left join...on(以左表为主)

--使用左外连接查询emp表和dept表的员工信息
select e.*,d.* from emp e left join dept d on e.deptno=d.deptno;

2.右外连接:right join...on(以右表为主)

--使用右外连接查询emp表和dept表的员工信息
select e.*,d.* from emp e right join dept d on e.deptno=d.deptno;

3.完全外连接:full join...on(会先执行一个完整的左外连接和右外连接查询,然后将查询结果合并,并消除重复的记录行)

--使用完全外连接查询emp表和dept表的员工信息
select e.*,d.* from emp e full join dept d on e.deptno=d.deptno;

d.自连接

--查询所有emp表中所有管理者的下属员工
select e1.empno,e1.ename,e2.empno,e2.ename from emp e1 join emp e2 on e1.empno=e2.mgr;

--找出员工为7788的上司信息
select e2.* from emp e1 join emp e2 on e1.mgr=e2.empno where e1.empno=7788;


⑥子查询:子查询中不能包含order by子句

--在emp表中查询部门名称为"RESEARCH"的员工信息
select * from emp e where e.deptno=(select d.deptno from dept d where d.dname='RESEARCH');

--在emp表中查询部门名称为"RESEARCH"的员工信息
select e.* from emp e join dept d on e.deptno=d.deptno where d.dname='RESEARCH';

a.单行子查询

--在emp表中查询既不是最高工资,也不是最低工资的员工信息
select * from emp where sal>(select min(sal) from emp) and sal<(select max(sal) from emp)

b.多行子查询:使用多行子查询时,必须使用多行运算符(in、any、all、exists)

1.in运算符:只要子查询中任何一个匹配成功,外查询都会返回记录

--在emp表中查询不是销售部门"SALES"的员工信息
select * from emp where deptno in(select deptno from dept where dname<>'SALES');

2.any运算符:必须与单行比较运算符结合使用,并且返回行只要匹配子查询的任何一个结果即可

--在emp表中查询工资大于部门编号为10的任意一个员工工资的其他部门员工信息
select * from emp where sal>any(select sal from emp where deptno=10) and deptno<>10;

3.all运算符:必须与单行比较运算符结合使用,并且返回行必须要匹配所有子查询结果

--在emp表查询工资大于部门编号为30的所有员工工资的员工信息
select * from emp where sal>all(select sal from emp where deptno=30)

4.exists运算符:匹配后面的子句是否为真,为真就返回

--emp表和dept表关联并判断当deptno>20时的员工信息
select * from emp e where exists(select * from dept d where e.deptno = d.deptno and deptno > 20)

注:in和exists的区别

    使用exists时,oracle首先会检查主查询,然后运行子查询,找到匹配项就返回。而在执行in查询时,
先将主表挂起,然后执行子查询,并将获得的结果列表放在一个加了索引的临时表中,当子查询结束后再
去进行主表查询,所以当表的数据量比较大时,exists查询比in查询要快。

c.关联子查询

--查询工资大于同职位平均工资的员工信息
select * from emp e where sal>(select avg(sal) from emp where job=e.job) order by e.job;

⑦ 分页查询

--对emp表进行分页查询
select * from (select e.*,rownum rn from emp e) where rn>=6 and rn<=10

六、数据控制语言(DCL) 

关键字:grant、revoke

1、grant

grant select,update on emp to alex;

2、revoke

revoke select,update on emp from alex;

七、事务控制语言(TCL)

关键字:commit、savepoint、rollback

1、事务

commit --提交事务

rollback --回滚当前未被提交的操作

savepoint a  --设置保存点

rollback to a  --回滚到保存点

注:当使用rollback取消事务时,会取消所有的事务变化、结束事务,删除所有保存点并释放锁

2、锁

锁是数据库用来控制共享资源并发访问的机制,在提交或回滚事务之前,oracle会锁定正被修改的数据,在用户完成或回滚事务之后,锁

会自动释放,只有在提交或回滚事务之后,其他用户才可以更新这些数据

①  行级锁:只对用户正在访问的行进行锁定,如果该用户正在修改某行,那么其他用户只能更改同一个表中的其它数据。行级锁是一种

排他锁,防止其他事务修改此行,但是不会阻止读取此行的操作,在使用insert,update,delete时,oracle会自动应用行级锁

--使用行级锁为多行上指定列上锁
select * from emp where deptno=20 for update of sal,comm;

②  表级锁:表级锁会限制对整个表的访问,用来限制对表执行添加,更新和删除等操作,锁定模式如下:

a.行共享(row share,rs):允许其他用户访问和锁定表,但是禁止排他模式锁定整个表

b.行排他(row exclusive,rx):与行共享模式相同,同时禁止其他用户在此表上使用共享锁

c.共享(share,s):锁定表,仅允许其他用户查询表中的行,但不允许插入、更新和删除行

d.共享行排他(share row exclusive,syx):执行比共享锁更多的限制,防止其他用户在表上应用共享锁,共享行排他锁以及排他锁

e.排他(exclusive,x):对表执行最大限制,除了允许其他用户查询该表的记录,排他锁防止其他用户对表做任何更改或在表上应用任何类
型的锁

例:lock table emp in share mode nowait;

八、数据完整性约束

一、非空约束:限制必须为某个列提供值,默认为null(可以为空)

1、创建表并添加非空约束

create table tb_user(
  u_no number(4) not null,
  u_name varchar2(20) not null,
  u_sex varchar2(3) not null,
  u_phone varchar2(11)
);

2、为tb_user表中的u_phone列添加非空约束:如果该列中已经存在null则无法向该列添加not null约束

alter table tb_user modify u_phone not null;

3、删除tb_user表中u_phone列的非空约束(就等于修改列的值可以为空)

alter table tb_user modify u_phone null;


二、主键约束:可以由一个列组成(行级约束),也可以由两个以上的列组成(联合主键,表级约束),主键约束同时具有非空约束的特性

1、创建表并为该表定义主键约束user_pk(主键列为u_no)

create table tb_user(
  u_no number(4),
  u_name varchar2(20),
  u_sex varchar2(3),
  u_phone varchar2(11),
  constraint user_pk primary key(u_no)	--创建主键和主键约束(如果主键约束的列有多个,多个列之间使用“,”分隔即可)
);

2、如果创建表时未定义主键约束,为表添加主键约束

alter table tb_user add constrant user_pk primary key(u_no);

3、系统自动分配名称的主键约束

create table tb_user(
  u_no number(4) primary key,
  u_name varchar2(20),
  u_sex varchar2(3),
  u_phone varchar2(11)
);

4、如果创建表时未定义主键约束,为表添加系统自动分配名称的主键约束

alter table tb_user add primary key(u_no);

5、删除主键约束

alter table tb_user drop constraint user_pk;


三、唯一性约束:强调所在列不允许有相同的值,但它所在的列允许有空值(主键约束不允许有空值),如果唯一约束列添加了

not null约束,该列唯一约束就相当于主键约束

1、创建tb_user表并为表添加唯一约束

create table tb_user(
  u_no number(4) primary key,
  u_name varchar2(20),
  u_sex varchar2(3),
  u_phone varchar2(11) constraint phone_uk unique	--设置为unique约束
  (u_phone varchar2(11) unique)			--系统自动分配名称的unique约束
);

2、为tb_user表添加唯一约束

alter table tb_user add constraint phone_uk unique(u_phone);	--(如果主键约束的列有多个,多个列之间使用“,”分隔即可)

3、删除列的唯一约束

alter table tb_user drop constraint phone_uk;


四、外键约束:外键是指“当前表”引用“另一个表”的某个列或某几个列,而“另一个表”中被引用的列必须具有主键或者唯一约束

1、创建tb_emp并参照tb_dept表添加外键约束

create table tb_dept(
  dept_no number primary key
);
create table tb_emp(
  emp_no number primary key,
  emp_name varchar2(20),
  emp_age number,
  dept_no number	(references tb_dept)--系统自动分配名称的外键约束
);

alter table tb_emp add constraint emp_fk foreign key(dept_no) references tb_dept(此为参照列名,与此表外键列名相同时省略);

2、当尝试删除被引用表中的一条记录时,通过引用行为可以确定如何处理外键表中的外键列,引用行为的类型分以下3种:

①定义外键约束时,使用了no action关键字:当删除被引用表中被引用列的数据时,违反外键约束,该操作将被禁止,系统默认

②定义外键约束时,使用了set null关键字:当删除被引用表中被引用列的数据时,外键表中的外键列将被设置为null

(外键列必须支持null值)

③定义外键约束时,使用了cascade关键字:当删除被引用表中被引用列的数据时,外键表中对应的数据也将被删除,这种删除方式

通常称作“级联删除”

示例:级联删除

create table tb_dept(
  dept_no number primary key
);

insert into tb_dept values(10);

create table tb_emp(
  emp_no number primary key,
  emp_name varchar2(20),
  emp_age number,
  dept_no number	(references tb_dept on delete cascade)--系统自动分配名称的外键约束
);

insert into tb_emp values(1,'alex',25,10);

alter table tb_emp add constraint emp_fk foreign key(dept_no) references tb_dept on delete cascade;

delete tb_dept where dept_no=10;

3、删除tb_emp表的外键约束

alter table tb_emp drop constraint emp_fk;

五、默认约束

sex char(3) default '男'	--默认约束

六、检查约束

age number check(age>18)	--检查约束

五、禁用和激活约束:约束默认是激活的

1、在定义约束时禁用

create table tb_emp(
  emp_no number primary key disable,		--加上disable代表禁用
  emp_name varchar2(20),
  emp_age number,
  dept_no number
);

2、禁用已经存在的约束

alter table tb_emp disable constraint emp_fk;

注:

①在禁用主键约束时,oracle会默认删除约束对应的唯一索引,而在重新激活约束时,oracle将会重新建立唯一索引,如果希望在

删除时保留对应的唯一索引,可以在禁用约束时使用关键字keep index(通常放在约束名称的后面)

②在禁用唯一性约束或主键约束时,如果有外键约束正在引用该列,则无法禁用唯一性约束或主键约束,这时可以先禁用外键约束,然后

再禁用唯一约束或主键约束;又或者在禁用唯一性约束或主键约束时使用cascade关键字,这样可以级联禁用引用这些列的外键约束

3、激活已经禁用的约束

alter table tb_emp enable constraint emp_fk;

九、视图、索引和序列

一、序列:通常用来自动生成主键或唯一键的值

1、创建序列

create sequence seq_stu
start with 0	--指定要生成的第一个序列号,升序序列默认为最小值,降序序列默认为最大值
increment by 1	--指定序列号之间的间隔,默认为1
maxvalue 100	--指定序列可以生成的最大值
minvalue 0	--指定序列的最小值,必须小于等于start with的值,必须小于maxvalue
nocycle/cycle	--指定序列在达到最大值或最小值后是否继续从头开始生成值,默认为nocycle
cache/nocache;	--预先分配一组序列号,将其保留在内存中,可以更快的访问序列号,用完时,oracle会生成另一组数组,保留在缓存中,系统默认是缓存20个序列号

2、访问序列号

a.nextval:创建序列后第一次使用时,将返回该序列的初始值,后面在引用时将使用increment by子句的值来增加序列值,并返回新值

select seq_stu.nextval from dual;

b.currval:返回序列的当前值,即最后一次引用nextval时返回的值,没有引用nextval时不会返回

select seq_stu.currval from dual;

3、更改序列

alter sequence ...

alter sequence seq_stu
maxvalue 1000;

4、删除序列

drop sequence ...

drop sequence seq_stu;


二、视图:获取查询的输出结果,并将其作为表来处理,它是一种虚拟表,创建视图所依据的表被称为“基表”

1、创建视图

create or replace (force/noforce) view view_emp 	--or replace 如果视图已存在,此选项将重新创建该视图,如果使用force关
键字,则无论基表是否存在,都将创建视图,默认为noforce
as 
select e.*,d.dname,d.loc from emp e inner join dept d on e.deptno=d.deptno
(with read only);	--此选项确保不能在视图上执行任何修改操作

2、删除视图

drop view view_emp;


三、索引

1、索引简介

    数据库的索引有多种类型,常见的索引包括顺序文件上的索引、B+树索引、散开索引、位图索引等。

A.顺序文件上的索引

    它是针对按指定属性值升序或降序存储的关系,在该属性上建立一个顺序索引文件,索引文件由属性值和相应的元组指针组成。

B.B+树索引

    它是将索引属性组织成B+树形式,B+树的叶结点为属性值和相应的元组指针,B+树具有动态平衡的优点。

C.散列索引

    它是建立若干个索引桶,将索引属性值按照散列函数值映射到相应的桶中,桶中存储索引属性值和相应的元组指针。

D.位图索引

    它是用位向量记录索引属性中可能出现的值,每个位向量对应一个可能的值。

2、创建索引

create unique/bitmap(位图索引) index ind_ename 	
on emp(ename,sal)	--列名必须
(where 条件表达式);

3、修改索引

alter index ind_ename rebuild;	--重建索引

alter index ind_ename coalesce;	--合并索引

4、删除索引

drop index ind_ename; 

猜你喜欢

转载自blog.csdn.net/alexshi5/article/details/80358534
今日推荐