Oracle数据库对象---你diss了嘛

1.数据库对象
2.同义词
3.序列
4.视图
5.索引


Oracle中比较有特色的:同义词、序列

1.数据库对象
  又称模式对象,是逻辑结构的集合。
  最基本的数据库对象就是表。

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

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

2.同义词synonym
    同义词——现有对象的一个别名。
    (同义司对网管而言是个非常霸气的东西)
    Oracle只有一个数据库,用户的访问是通过表空间分隔开的,一般来说两个用户之间不能相互访问,但现在A用户要B用户分享某个表中的数据,那B的表空间就要给A分配个权限

    如果只共享表空间中的某个表中的一部分数据,怎么共享?
    ----将某个表共享,但这也向其他用户曝露了表,存在安全问题。因此,我们给要共享的表设置个同义词(别名),将同义词共享给其他用户。

    举例:
    同义词就好比我们要给这个对象取别名,也就是我们所称的“外号”,比如张新宇你们叫他“锤子”,“锤子”就是他的外号;如果某天来个IS来找“锤子”,他找得到么?找不到,“锤子”是不是很安全?IS找门卫问这里有个叫“锤子”的没有?门卫当他傻啊,如果说要找张新宇,找不找得到?找得到。


    同义词分类:
    1.私有同义词;--  只有自己使用; 只能在其模式内访问,且不能与当前模式的对象同名。
    2.公有同义词;--  搞个别名给大家使用;公有同义词可被所有的数据库用户访问。

    同义词作用
    1. 提高安全性
    2. 主要用于资源共享。

    
    模式==对象


1.私有同义词
  语法:
    Create [or replace]  Synonym  syn_emp  For  scott.emp;
    --Synonym   同义词
    --syn_emp   指scott.emp表的同义词(别名)
    --scott.emp 是模式名(对象名),其中emp是表名。
            如果当前是用scott账户在操作,则可以省略scott.

  
2.公有同义词
  语法:
    create public  synonym  syn_emp  for  scott.emp;
    --syn_emp  同义词名(别名)


注意:
  在创建私有同义词时,发现scott也没有权限创建,要让scott有创建的权限,就需要用管理员权限给scott授权。

  为某个账户授权同义词:
    grant create synonym to scott;

  注意:权限授出后,一定要收回(取消授权),否则会乱套。
  取消授权:
    revoke create synonym from scott;


  以上是授权私有同义词,那么公有的同义词呢?
  公有的同义词不能授权,也就是普通账户不能创建公有同义词,除非是管理员账户。
  
  

3.同义词的操作

调用:
    select * from syn_emp;
    --syn_emp 为同义词名(别名)

删除:
    Drop Synonym  syn_emp;        --删除私有同义词
    Drop Public Synonym  syn_emp;    --删除公有同义词


创建或替换(修改):
    create or replace sysnonym syn_emp for scott.emp;

三、序列
    oracle中没有标识列,就是序列,标识列可以做好多东西,有替代品---序列,比标识列麻烦的多。  序列+触发器


    什么是序列?
    序列是用于生成唯一的连续的序号 的对象
    序列有升序和降序。一般都是升序。
1,2,3,4,5,6,7,8

    序列有什么用?
    能为我们生成一组连续的,永远不重复的一组数字。
    主要用于提供主键值,做分页。

    序列就是我们所学的sql server中的标识列:
    标识种子——从什么数字开始,常用1
    标识增量——每次增加的数

1.创建序列语法<色'昆死>
    create sequence 序列名称
        [start with 1]               -- (种子)从n开始计数
        [increment by 1]             -- (增量)每次递增n,负数为递减  <英'克瑞门特>
        [maxvalue n | nomaxvalue]    --  最大值
        [minvalue n | nominvalue]    --  最小值,(没太多含义)
        [cycle | nocycle]             --  循环/不循环<塞叩>
        [cache n | nocache];         --  分配并存入到内存中


--案例:    
create sequence seq_110
start with 1
increment by 1
maxvalue 99999
minvalue 1;


2.使用序列
    通过序列的伪列来访问序列的值。
    nextval——返回序列的下一个值(一直往下,永远不回头,取下一个,指针在下一个值上面)
    currval——返回序列的当前值(取当前的,指针永远在当前值上面)

id    1,2,3,6,4,5,


--案例:
    --查下一个(显示的值不会回头,没有回头的,有回头程序就有问题了)
    select seq_110.nextval from dual;
    (显示的值1,2,3,4,5,……,永远不会回头,显示相同的数字)

    --查当前
    select seq_110.currval from dual;
  


注意!!!:
1.序列不要轻易的删掉
  在SQL Server中,有标识列1,2,3,4的数据,如果删除标识列4的,再增加一条记录,标识列是5。
  在Oracle中,如为某表定义了序列,删除中间的某条记录,情况和SQL Server中一样,但是如果把该表的序列删掉,再创建序列,那么情况就不一样了。


学生信息表
  1,2,3,4,5 , 6, 7,8,9, 10, 11, 13 ,1 ,2 ,3

  序列,currval   nextval  13

   学号为7的学生成绩表  7,90  80

  1,2,3,4,5,6,7,8,9

  所以创建序列这里就不能用:create or replace sequence seq_110;

2.create sequence seq_110; 不写了,可不可以?结果会是什么?
  就是标识列,默认的属性,种子1,递增1,最大值?我也不知道,无聊你们自己去试。


   



    思考:
        既然序列是一组唯一、有序的数字,那在触发器insert时,把序列当做id插入,是否就可以达到了标识列的效果呢?
  


insert into tb_name(tid,tname,tprice)
   values(1,'张三',100);
insert into tb_name(tid,tname,tprice)
   values(2,'李四',100);
insert into tb_name(tid,tname,tprice)
   values(3,'李四',100);
insert into tb_name(tid,tname,tprice)
   values(4,'李四',100);


create sequence seq_110;  //创建一个序列

insert into tb_name(tid,tname,tprice)
   values(seq_110.nextval,'张三',100);  --序列当前值的下一个值

insert into tb_name(tid,tname,tprice)
   values(seq_110.nextval,'李国',100); 


select seq_110.currval from dual;  --序列当前值

要搞清楚这个思路
    在往表里插入一条或多条数据时,会自动执行insert的触发器,
    那么我在编写insert触发器时,手动的将序列放入到触发器,
    每次执行插入一条数据时,添加了一个序列进去。

    不过有些麻烦,要在oracle中做成标识列,要触发器。

(每次插入时搞个触发器,然后在他插入之前,去修改一下他插入的那张临时表inserted,把表里的值就调用这个序列的nextval,这样看上去就看是个标识列。)

    比oracle要麻烦,要强大,有前触发,有后触发。

    思考:如果有100个表,要写多少个序列?1个还是100个?都行,没有标准的。
    如果写一个,100个表共用一个序列,那会造成每个表中的标识列不连贯,比如:
    A表:
    序列1,2,3,4,9,10,11,……
            1,2,3,4,5,6,7,8
    B表:
    序列5,6,7,8,12,13,14,……
         1,2,3,4,

    注意!!!:尽量做到一个表一个触发器一个序列。

    A表  seq_110
        序列1,2,3,5。。。。。。

    B表  seq_120
    序列1,2,3,4,5


4.更改和删除序列
    更改序列:
    alter sequence seq_110 maxvalue 5000 cycle;
    注意:不能更改序列的start with参数
        尽量不要修改,一旦修改会出问题,如果实在要改,先删了再创建序列。

    删除序列:
    drop sequence seq_110;


四、视图
    通过定制的方式显示来自一个或多个表的数据。
    说白了:视图就是一个虚拟表,就是一段查询的SQL语句。
    好处:安全性,降低了程序的复杂程度

--例如:emp查询每个员工的名字、薪水、奖金、收入、部门名称dept


--建议:先写查询语句,再去搞视图
--第1步写查询语句:
select a.ename 姓名,a.sal 薪水,a.comm 奖金,(a.sal+nvl(a.comm,0)) 收入,b.dname 部门 from emp a
inner join dept b
on a.deptno=b.deptno;

是不是每个人都要写这么长段代码?不用,我们根据这需求创建个视图,以后别人要看,就直接调用这个视图名就行了。

--创建这个需求的视图
create or replace view v_emps
as
select a.ename 姓名,a.sal 薪水,a.comm 奖金,(a.sal+nvl(a.comm,0)) 收入,b.dname 部门 from emp a
inner join dept b
on a.deptno=b.deptno;


注意!!!:如果这时运行报错:没有权限,则要通过sys或system账户给scott赋view的权限
    grant create view to scott;


--调用视图:
select * from v_emps;

思考:
--1. 视图是否可以调用视图?(肯定)
--案例:我现在只要姓名,薪水,奖金3个列
create or replace view v_empb
as
select 姓名,薪水,奖金 from v_emps;


--2. 视图是否可以无限次嵌套?(应该不行,SQL Server最多是32层,Oracle中应该也差不多)

--3. 视图的数据是否可以直接修改?(视图的数据保存在表里,视图只是一张虚拟的表)
    理论上来说是可以修改的,这个修改是在修改基表上的数据;
    但有一种合成、聚合的数据,比如“收入”是由薪水+奖金,是不能被修改的。

-------联接视图(要操作)
关于+的,+号在右--->左联 left outer join
        +号在左--->右联 right outer join 
        左右都有+号--->全联  full outer join


-------视图上的DML语句


-------视图中的函数


五、索引
    是数据库内部编排数据的一种方法。
    优点:提高查询速度

--创建索引
Create Index index_name on Tablename(colname,colname...)
tablespace 表空间名;
    --不能使用or replace

--重建索引(修改)
Alter Index index_name Rebuild;

--删除索引
Drop Index index_name;

--唯一索引
Create Unique Index index_name On Tablename(colname);

--组合索引
create index index_name on tablename(colname1,colname2,……);

--反向键索引

--位图索引

--索引组织表
  好处:把数据存储在与其关联的索引中
  最大优点:访问数据都是基于组件
  就是教大家创建表


 

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瑶大头*^_^*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值