数据库对象,序列,视图,索引

oracle06-数据库对象

一、数据库对象
    1.1 什么是数据库对象
    说白了就是pl/sql软件my objects里面的东西,最基本的可以理解为表。
    数据库对象又称模式对象,是逻辑结构的集合。
      最基本的数据库对象就是表。

    数据逻辑结构:指的是存在一种或多种特定关系的数据元素集合。
    通俗点:就是把数据元素形象地进行了有规则排列,但不用考虑在计算机上如何实现。
    再通俗点:就是数据有规则的排列。表不就是有规则的排列吗?

      数据库对象包括:
      同义词、序列、视图、索引、表、函数、包、过程、触发器等。

    指针

    1.table:基本的数据库对象,由行和列组成
        创建表,数据类型,约束对象,简单的CURD(增删改查)
        了解:手动添加,删除字段,类型,约束
            alter     create drop

    2.view:视图,虚拟表
    3.sequence:序列
    4.index:索引
    5.synonym:同义词
 
    1.2 同义词 synonym

    A  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中没有标识列,所以让序列当作标识列,后期会与触发器配合使用
    
    【案例】创建表  插入数据  使用nextval

    1.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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值