oracle06-数据库对象
一、数据库对象
1.1 什么是数据库对象
说白了就是pl/sql软件my objects里面的东西,最基本的可以理解为表。
数据库对象又称模式对象,是逻辑结构的集合。
最基本的数据库对象就是表。数据逻辑结构:指的是存在一种或多种特定关系的数据元素集合。
通俗点:就是把数据元素形象地进行了有规则排列,但不用考虑在计算机上如何实现。
再通俗点:就是数据有规则的排列。表不就是有规则的排列吗?数据库对象包括:
同义词、序列、视图、索引、表、函数、包、过程、触发器等。指针
1.table:基本的数据库对象,由行和列组成
创建表,数据类型,约束对象,简单的CURD(增删改查)
了解:手动添加,删除字段,类型,约束
alter create drop2.view:视图,虚拟表
3.sequence:序列
4.index:索引
5.synonym:同义词
1.2 同义词 synonymA B
A用户:创建一个表 tb_sb
B用户:能访问A用户的tb_sb同义词是数据库方案对象的一个别名,经常用于简化对象访问和提高对象访问的安全性。
通过创建一个同义词(对象的另外一个名字)来简化对数据库中对象的存取。
缩短了对象的名字的长度
语法:
create [public] synonym 同义词名字 for object;同义词分类:私有同义词&&公有同义词
1.2.1 私有同义词
只能被当前用户访问,而且不能与当前模式的对象相同,就是有的对象有这名字了就不能取了。**创建私有同义词
create sysnonym aa for scott.emp;--aa为名字,可自定义,执行如果出现权限不足错误,可以使用管理员给予权限**给予权限:使用sys登录后,手动点击user找到scott用户,点击编辑,给系统权限加:
create synonym--创建私有同义词
**查看同义词
select * from aa;--使用同义词得到emp表数据,后期有需求再用,先理解制作方式。1.2.2 公有同义词
由一个特殊的用户组Public所拥有。顾名思义,数据库中所有的用户都可以使用公用同义词。
**创建公有同义词
create public synonym bb for scott.emp;--会提示权限不足**解决权限问题:使用sys登录后给予权限
grant create public synonym to scott;**撤销权限
revoke create public synonym from scott;1.3 序列:用于生成唯一、连续序号的值,类似sqlserver中的标识列
概述:
①自动产生唯一的数字
②是一个可以共享的数据库对象
③典型地用于产生数据库表中的主键值
④能够节省应用程序的代码
⑤当缓存在内存中时,能够提高存取的效率。
**创建序列
create sequence seq0212--创建名字
start with 1--开始从1
increment by 1--自增长为1
maxvalue 100--最大值
minvalue 1--最小值nextval:返回下一个可用的序列值,每访问一次,它将产生一个唯一的新值,即使对不同的用户,该值也是唯一的。
currval:返回当前的序列值,只有当nextval被访问之后,currval伪列才能包含一个值。
**使用序列
***取下一个值 值每运行一次增长,相当于于标识列,不能回去。
select scott.seq0212.nextval from dual;
***取当前的值 值回不去 除非删除序列
select scott.seq0212.currval from dual;删除序列
使用drop sequence命令来删除一个数据字典的序列
一旦序列被删除,那么被序列就不可以访问了。
序列的作用:Oracle中没有标识列,所以让序列当作标识列,后期会与触发器配合使用
【案例】创建表 插入数据 使用nextval1.4 视图:存储一个后者多个表数据的虚拟表
【需求】显示dept表和emp表中部门和部门编号,员工和员工薪水,存储到视图中
【注意】需要权限
【需求】求每个部门的平均薪资
【需求】修改数据,如果不是原数据就会失败
概述
视图,就是一张虚拟表,我们可以从这个表中查询数据
视图,就是一个命名的查询的语句create view 视图名称 as select...
删除视图:不会影响原来的数据
drop view 视图名称1.5 索引:相当与书的目录,可以大大的提供我们的速度
--在普通情况下不会有区别,当数据多的情况下,加索引就会提升查询速度,了解一下
--会鼠标创建即可:点击表,右击编辑,可以看到索引,给列添加索引就好了
--PPT上看一下,了解下就可以
--索引的优点:大大提升查询速度
1.5.1 概述
①一个数据库模式对象
②Oracle利用索引来加快对数据行的访问
③依靠索引来快速定位数据,从而 减少了磁盘I/O的次数
④与使用它的表是相互独立的数据库对象
⑤Oracle服务器自动对索引进行维护和使用1.5.2 创建索引的2种方式
①自动创建:Oracle辉自动为主键(primary key)和唯一键(unique)创建索引
自动创建的索引是无法删除的。
alter table emp
add constraints ename_uni unique(ename);alter table emp
drop constraints ename_uni;②可以手动的创建索引,表中什么样的字段应该添加索引?
在查询的时候,经常被用来作为查询添加的字段,应该添加索引。
create index ename_index on emp(ename);select * from emp where ename = 'smith'
③什么时候创建索引?
a.欲创建索引的列在where子句或者连接条件中频繁使用
b.该列所包含的不同值很多
c.该列包含大量的空值
d.表中的数据库行数非常大,而且只有2-4%数据行被查询出来
④什么时候不必创建索引
a.表是空的
b.列在查询条件中不经常使用
c.大多数基于该表的查询,所查询出的数据量远多于2-4%行。
d.表被频繁修改⑤删除索引
drop index 索引名称;
------代码
Oracle 创建视图view 权限不足,无法创建 解决办法
Oracle
在创建用户的时候如果直接给用户DBA权限,那么在B用户中可以直接查询A用户的表,但是在创建视图时就会报无权限,在这种情况下需要再在被访问的A用户里面去给予要访问该表的B用户授权。--创建视图权限,一般网上找都是说的这句,但是光有这句还是无法创建
grant create view to B;--授予查询权限
grant select any table to B;--授予权限
grant select any dictionary to B;
select * from dba_synonyms where table_owner='SCOTT';drop public synonym paaa
给予权限代码
select * from emp;
--给scott用户创建公开同义词的权限
grant create public synonym to scott;
--给scott用户创建私有同义词的权限
grant create synonym to scott;
select * from sb;
--创建用户
create user nb
identified by 123;
--授权
grant connect,resource to nb;
--给予nb这个用户去查询emp表的权限
grant select on scott.emp to nb;
--以SYS的角色给emp表创建私有同义词
create synonym xb for scott.emp;
select * from xb;
select * from sb2;
--视图给予权限
grant create view to scott;
实现详细步骤
--数据库对象
1.能够使用数据定义语言中的create关键来创建的都可以成为数据库对象。
2.Oracle中最基础的数据库对象:表,视图
3.其他:函数,存储过程,触发器,序列,同义词,索引等等。
4.四个数据库对象:同义词,序列,视图,索引
#同义词 synonym
1.对已有的数据表对象起别名。
2.作用:方便其它用户访问
3.同义词:公开同义词 私有同义词
4.公开同义词:所有用户都能被访问(这些用户必须拥有查询的权限)
5.私有同义词:只有当前用户所创建的才能访问。
6.语法
公开同义词: create public synonym 同义词名称 for 表;
私有同义词: create synonym 同义词名称 for 表;
--需求:给scott用户的emp表创建一个公开同义词,以允许其他用户进行访问。
create public synonym sb for emp;
select * from sb;
select * from xb;
--创建私有同义词
create synonym sb2 for emp;
select * from sb2;
drop synonym sb2;
----------------------------------------------------
#序列:sequence
#1.序列:与伪列rownum类似,区别在于:rownum属于自动创建,而序列属于手动创建,序列会生成一连串有顺序的数字,默认从1开始。
#2.重点:序列结合触发器trigger来实现主键的标识列。
#3.语法
create sequence 序列名称;--简单语法
--一般语法
create sequence 序列名称
start with 值--序列值从哪里开始
increment by 值 --序列值每次以指定的值进行增长
maxvalue 值 --最大值
minvalue 值 --最小值
--创建一个序列
create sequence s_demo1;
--认识序列中2个伪列属性
--1.获取当前序列的值 currval
--2.获取当前序列的下一个值 nextval
select s_demo1.nextval from dual;
select s_demo1.currval from dual;
--复制表的结构
create table tb_demo1
as
select empno,ename,sal from emp where 1=0;
--查询
select* from tb_demo1;
--创建序列
create sequence s_demo2
start with 100
increment by 2
maxvalue 10000
minvalue 100
--通过nextval为tb_demo1表中的empno属性复制
insert into tb_demo1
values(s_demo2.nextval,'康康',1);
insert into tb_demo1
values(s_demo2.nextval,'康康2',2);
insert into tb_demo1
values(s_demo2.nextval,'康康3',3);
select * from tb_demo1;
#视图:一张虚拟表,通过sql语句查询的结构进行保存,
#视图相当于一个容器,作用:方便查看结果。
#关键字:view
#语法
create view v_视图名称
as
select|update...
#注意2点:(1)通过视图保存的结果集必须唯一(2)必须保证字段有名字
create view v_demo1
as
select emp.*,dept.dname from emp inner join dept on emp.deptno = dept.deptno
create view v_demo2
as
select max(sal) as "最高工资" from emp;
select * from v_demo2;
drop view v_demo2;
--索引 index
--数据库中一种特定的排布方式 类似课本的目录
--索引的建立:为了提高查询的效率,我们创建表,如果该表中设立了主键约束,自动会给这个主键的字段创建一个唯一索引。
create index 索引名称
on 表(字段)
create index i_demo1
on emp(ename)
select * from emp where ename like 'S%';
--删除索引
drop index i_demo1;