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拥有所有的系统权限----包括无限制的空间限额和给其他用户授予各种权限的能力。system由dba用户拥有。 
注意:撤消一个用户的所有权限,并不意味着从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) ) l 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关系? | 
 | 
| 问题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

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号