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

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介: Oracle数据库对象---你diss了嘛

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,……);

--反向键索引

--位图索引

--索引组织表

 好处:把数据存储在与其关联的索引中

 最大优点:访问数据都是基于组件
 就是教大家创建表

 


相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
16天前
|
SQL Oracle 关系型数据库
【Oracle】玩转Oracle数据库(一):装上去,飞起来!
【Oracle】玩转Oracle数据库(一):装上去,飞起来!
56 7
|
16天前
|
SQL Oracle 关系型数据库
【Oracle】玩转Oracle数据库(七):RMAN恢复管理器
【Oracle】玩转Oracle数据库(七):RMAN恢复管理器
41 5
|
8天前
|
存储 Oracle 关系型数据库
Oracle的模式与模式对象:数据库的“城市规划师”
【4月更文挑战第19天】在Oracle数据库中,模式是用户对象的集合,相当于数据库的城市规划,包含表、视图、索引等模式对象。模式对象是数据存储结构,如表用于存储数据,视图提供不同查看角度,索引加速数据定位。良好的模式与模式对象设计关乎数据效率、安全和稳定性。规划时需考虑业务需求、性能、安全和可扩展性,以构建高效数据库环境,支持企业业务发展。
|
16天前
|
存储 SQL Oracle
【Oracle】玩转Oracle数据库(二):体系结构、存储结构与各类参数
【Oracle】玩转Oracle数据库(二):体系结构、存储结构与各类参数
36 7
|
SQL Oracle 关系型数据库
Oracle 无效对象查询,编译无效对象
编译无效对象 有两种方式: 1、执行sql查询结果 2、脚本编译
|
SQL Oracle 关系型数据库
|
SQL Oracle 关系型数据库
oracle 编译无效对象
1.手动编译 如果无效对象的数量很少,那么你可以逐个编译这些对象. 如 ALTER PACKAGE my_package COMPILE; ALTER PACKAGE my_package COMPILE BODY; ALTER PROCED...
1498 0
|
1月前
|
Oracle 关系型数据库 数据库
|
1月前
|
关系型数据库 分布式数据库 数据库
PolarDB PostgreSQL版:Oracle兼容的高性能数据库
PolarDB PostgreSQL版是一款高性能的数据库,具有与Oracle兼容的特性。它采用了分布式架构,可以轻松处理大量的数据,同时还支持多种数据类型和函数,具有高可用性和可扩展性。它还提供了丰富的管理工具和性能优化功能,为企业提供了可靠的数据存储和处理解决方案。PolarDB PostgreSQL版在数据库领域具有很高的竞争力,可以满足各种企业的需求。

推荐镜像

更多