Oracle 笔记(三)

 

Oracle的数据库对象

七大对象:用户、表、约束、序列、视图、同义词和索引

知识点一:用户  -  User  -  账户、管理员-一切对象的宿主

1、创建用户

????

2、授权

????

授权+创建用户  grant create session to 用户名 identified by 密码

3、锁定账户

????

4、解锁账户

????

5、修改用户

????

6、撤销授权

Revoke 权限 from 用户

Revoke 权限 on 对象 from 用户

7、删除账户

????

 

补充知识点一:授权任务—连带系统授权

步骤一:创建账户A,连带系统授权

create user rose identified by 123456;

grant create session to rose with admin option;

步骤二:创建账户B

create user lily identified by 123456;

步骤三:连接账户A,授权给账户B

Conn rose/123456@orcl;

grant create session to lily;

步骤四:链接账户B

conn lily/123456@orcl;

疑问:如果我们回收用户A的权限,那么用户B的权限会被收回吗?不会。

 

 

补充知识点二:授权任务—连带对象授权

步骤一:创建了用户C,并赋予create session权限

create user nacy identified by 123456;

grant create session to nacy;

步骤二:赋予用户A create table权限,并在开放uesrs表空间权限

grant create session,create table to rose;

alter user rose quota 1m on users;

步骤三:建立一个表,并插入一个数据

conn rose/123456@orcl;

create table a(aid number(2));

insert into a values(1);

步骤四:连接用户A并将对象表a的select权限赋予用户B并且进行连带授权

grant select on a to lily with grant option;

步骤五:连接用户B,并将对象表A.a的select权限赋予用户c

conn lily/123456@orcl;

grant select on rose.a to nacy;

步骤六:连接用户C,对rose.a表进行查询

conn nacy/123456@orcl;

select * from rose.a;

疑问:如果我们回收用户B的select权限(对对象表a),那么用户C的权限会被回收吗?会。

 

角色:

3种标准角色:select*from dba_sys_privs where grantee ='CONNECT'
  Oracle为了兼容以前的版本,提供了三种标准的角色(role):connect、resource和dba。
  1. connect role(连接角色)

Grant connect to rose;

2. resource role(资源角色)

Grant connect, resource to rose;

3. dba role(数据库管理员角色) 
  dba role拥有所有的系统权限----包括无限制的空间限额和给其他用户授予各种权限的能力。systemdba用户拥有。 

注意:撤消一个用户的所有权限,并不意味着从oracle中删除了这个用户,也不会破坏用户创建的任何表;只是简单禁止其对这些表的访问。其他要访问这些表的用户可以象以前那样地访问这些表。

 

创建角色

除了前面讲到的三种系统角色----connect、resource和dba,用户还可以在oracle创建自己的role。用户创建的role可以由表或系统权限或两者的组合构成。为了创建role,用户必须具有create role系统权限。

create role命令的实例:

这条命令创建了一个名为student的role:

create role stu;

给student角色授权:

grant create session,create table,create view,create type to stu;

用student角色给用户授权:

grant stu to rose;

删除角色

drop role stu;

注意:指定的role连同与之相关的权限将从数据库中全部删除。自己验证一下???

知识点二:表–  table  -- 维护使用sql语句完成数据存储

1、创建表class  student

createtableclass(

classid number(3),

classname varchar2(50)

)

createtable student(

stuno number(4),

stuname varchar2(20),

stureg date,

stusex varchar2(10),

classid number(3)

)

2、修改表student添加telephone和address两个字段

--修改表student添加telephone和address两个字段

altertable student add(telephone varchar2(11),address varchar2(50))

3、修改student表中telephone这个字段number(8)类型

altertable student modify(telephone number(8))

4、修改student表,删除telephone字段

altertable student drop column telephone

5、设置列不可用

altertable student set unused(address)

6、删除不可用列

altertable student drop unused column

7、修改字段名称

altertable student rename column stuno to sno

8、给表改名字

rename student to stu

9、删除表

Drop table student

 

知识点三:约束– constraint –数据完整性和一致性

大体分类:实体完整性  --  减少数据冗余  -- 主键约束(非空,唯一)

              域完整性   --   数据的准确性  -- check约束(default)

              引用完整性  --  数据的一致性  -- 外键约束

Oracle约束对象5大分类:主键(primary key)、非空(not null)、唯一性(unique)、检查(check)、外键(foreign key)

创建约束的两种方式:create table添加约束、alter table 添加约束

select * from user_constraints;--显示用户拥有的约束的具体内容

select * from user_cons_columns;显示用户拥有的约束具体约束在了表的哪个列上

--创建表的时候添加行级约束

createtable class1(

 classid number(2) primary key,

 classname varchar2(20)notnullunique

)

 

createtable student1(

 stuno number(4) primary key,--主键约束

 stuname varchar2(20)notnull,--非空约束

 stureg datedefaultsysdate,--设定默认值

 stusex varchar2(3)default'男'check(stusex in('男','女')),--检查约束

 classid number(2) references class1(classid)--外键约束

)

 

--创建表的过程中添加表级约束

createtable student2(

stuno number(4),

stuname varchar2(20)notnull,

stureg datedefaultsysdate,

stusex varchar2(10)default'男',

classid number(3),

constraint pk_s2_stuno primary key(stuno),

constraint uq_s2_stuname unique(stuname),

constraint ck_s2_stusex check(stusex in('男','女')),

constraint fk_s2_classid foreign key(classid)  references class1(classid)

)

not null约束没有表级别约束(default默认值也没有表级约束的添加形式)

 

 

 

--创建完成表格后,添加相应的约束

altertableclass add constraint pk_class_classid primary key(classid);

 

altertableclass add primary key(classid);

 

altertableclass modify(classname notnull);

altertablestudent modify(ssexdefault ‘男’);

 

--删除表中的约束

alter table class1 drop constraint SYS_C0011073 ;

alter table class1 drop constraint  pk_class_classid;

altertableclass modify(classname null);

 

 

总结:select * from user_constraints;   select * from user_cons_columns;

 

添加约束【主键、唯一、check、foreign key】

Alter table 表名 add  [constraint 自定义约束名]  

primary key()  | 

unique()  | 

check() |  列名 between 0 and 100  |  列名 in(‘男’,’女’)

foreign key()  references 主键表名(主键列)

 

添加约束【非空、缺省】

Altert table 表名 modify (列名非空 | 缺省)

 

知识点四:序列(sequence)来实现字段的自增长特性

语法:create sequence 序列名

       start with 起始值

              Increment  by 步长

              maxvalue最大值

              minvalue最小值

              Cycle (nocycle)

              Cache 缓存>1的数字

语法:

问题1:建立序列,从1开始每次增加1

create sequence seq_classid

问题2:如何得到序列值?

Selectseq_classid.nextval from dual;

Select seq_classid.currval from dual;

问题3:建立序列,从10开始每次增加3个,最大值20,循环?

create sequence seq_test1

startwith10

increment by3

maxvalue 20

cycle

cache 2

 

create sequence seq_test2

startwith10

increment by3

maxvalue 20

minvalue 10

cycle

cache 2

问题4:minvalue 和startwith关系?

  1. Start with的值大于或者等于minvalue,如果start with小于minvalue,则数据库报错
  2. 如果序列循环,序列从开始值开始增加,没有设定最小值时,循环一次后从1开始,如果设定了最小值,从最小值开始。

问题5:序列的增长超过了maxvalue的结果?

1.          如果序列循环,从最小值或者1开始循环。

2.          如果序列不循环,超过最大值则报错

删除序列:

drop sequence 序列名字;

修改序列?

删除序列重新建立

--利用序列完成class表的classid的数据插入功能

--步骤一:创建表

--步骤二:创建序列

create sequence seq_classid

--步骤三:录入小班、中班、大班

insertintoclassvalues(seq_classid.nextval,'Web')

 

--删除序列

drop sequence seq_classid;

 

 

知识点五:视图view  - 简化查询、提高安全性

语法 : create [or replace] view 视图名

              as

              复杂的select语句

使用:select * from 视图 where  group by having order by

注意:有权限才能创建视图grant  create view  to用户

步骤一:定义视图

--创建视图:查询用户的姓名,所在部门的名称和工资水平

create view vw_eds

as

select emp.ename,dept.dname,salgrade.grade

from emp,dept,salgrade where emp.deptno=dept.deptno

and emp.sal between salgrade.losal and salgrade.hisal

步骤二:使用视图

select * from vw_eds where grade > 3;

步骤三:删除视图

Drop view vw_eds;

 

 

知识点六:同义词(synonym)对象table的别名

语法:create synonym 同义词名称for表名

分类:公有-授权用户可以使用,私有-创建用户可以使用

问题1:创建scott用户下的emp表的私有同义词

--emp创建私有同义词

grant create synonym to scott;

create synonym  syn_emp for emp;

问题2:公有同义词

--emp创建公有同义词

grant create public synonym  to scott;

create public synonym  synp_emp for emp;

 

 

知识点七:索引(index)加快查询速度,择优选择

 在实际工作中,B树索引是Oracle数据库中最常用的一种索引。如在使用Create Index语句创建索引的时候,默认采用的就是B树索引。在B树索引中,是通过在索引中保存排序过的索引列以及其对应的Rowid列的值来实现的。不过对于某些比较特殊的情况,如基数比较小的列,使用这个B树索引反而会降低数据库的查询效率。

 

语法:createindex索引名on(字段名1[字段名2])

 

分类:单列索引:一个列

联合索引:两列以上的索引

问题1:在emp表的hiredate上建立索引idx_h

select*from  scott.emp where hiredate > to_date('1981-01-01','yyyy-mm-dd')

 

 

 

 

 

问题2:索引字段中不能使用函数

select*from scott.emp where to_char(hiredate,'yyyy')='1981'—索引失效

 

select*from emp where hiredate >=to_date('1981-01-01','yyyy-mm-dd')

and hiredate <=to_date('1981-12-31','yyyy-mm-dd')–索引有效

问题3:查询在12000天以前工作的员工

索引不能参与运算

select * from emp where sysdate -hiredate > 12000;--索引失效

 

select*from emp wheresysdate-12000> hiredate;--索引有效

 

 

 

2017-10-31 18:34:59

posted @ 2017-10-31 18:35  Angelye  阅读(305)  评论(0编辑  收藏  举报