我是靠谱客的博主 踏实星星,这篇文章主要介绍Oracle使用(二)—— 一些常用的SQL命令和基础知识(包含权限、序列、视图、索引、完整性约束、事务等),现在分享给大家,希望可以做个参考。

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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
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; --加锁

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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
--查询数据文件 select * from v$datafile; --查询日志文件 select * from v$logfile; --查询控制文件 select * from v$controlfile; --创建表空间 create tablespace ts_alex datafile 'D:OracleServeroradataorclalex_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:OracleServeroradataorcldata_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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
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
2
3
4
1、grant grant select,update on emp to alex; 2、revoke revoke select,update on emp from alex;

七、事务控制语言(TCL)

关键字:commit、savepoint、rollback

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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;

八、数据完整性约束

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
一、非空约束:限制必须为某个列提供值,默认为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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
一、序列:通常用来自动生成主键或唯一键的值 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;

最后

以上就是踏实星星最近收集整理的关于Oracle使用(二)—— 一些常用的SQL命令和基础知识(包含权限、序列、视图、索引、完整性约束、事务等)的全部内容,更多相关Oracle使用(二)——内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(73)

评论列表共有 0 条评论

立即
投稿
返回
顶部