oracle数据库对象详解(一)——表、视图、同义词、约束、索引

版权声明:转载请注明! https://blog.csdn.net/cyl101816/article/details/83280128

oracle数据库对象是数据库的组成部分。数据库对象包括表,视图,同义词,约束、索引,序列,游标,触发器,函数,变量,(控制块,异常),存储过程,包。对数据库的操作可以基本归结为对数据对象的操作,常常用CREATE命令进行创建,可以使用ALTER命令修改,用DROP执行删除操作等。

一、表
表相当于转载数据的容器,当一张表建立好之后如果需要修改这个容器的结构就要更改表结构了。
1.创建表:

          create table  student(
           id   number ;
           name varchar(10),
           age  number,
           time of enrollment  date,
           class_name varchar(20) ,
           class_id    
          );
2.删除表:drop table students
3.添加表字段:alter table student add age number;
4.删除表字段:alter table student drop column time of enrollment;
5.更改表名称:alter table student rename to students;
6.更改表字段名称:alter table student rename column  name to names;
7.更改表字段类型:alter table student time of enrollment modify  number;
8.更改表字段长度:alter table student name modify varchar(20);

二、视图
    视图是有一个或者多个表组成的虚拟表,这些组成视图的表叫做该视图的基表。视图不占用物理空间,其本身的定于语句还是存储在数据字典里。每次使用时都是重新执行SQL语句,一个视图也可以从另外的一个视图中产生。基于多个表的视图不建议对视图作增删改查。
1.创建视图:create(or replace) view <view_name> view_stu as <select 语句> select * from student;
2.删除视图:drop view <view_name>;
3.授予用户创建视图的权限:grant create view  to cww;
4.通过视图查询数据:select * from view_name;
5.通过视图插入数据:insert into view_stu values('cww','20','2000年10月1日');
6.通过视图修改数据:update view_stu set age = 15 where id = 1;

视图具有以下优点:
1.可以限制用户只能通过视图检索数据。这样就可以对最终用户屏蔽建表时底层的基表。
2.可以将复杂的查询保存为视图。可以对最终用户屏蔽一定的复杂性。
3.限制某个视图只能访问基表中的部分列或者部分行的特定数据。这样可以实现一定的安全性。
4.从多张基表中按一定的业务逻辑抽出用户关心的部分,形成一张虚拟表。

三、同义词
   同义词是一种数据库对象,它是为一个数据库对象定义的别名,使用同义词的主要目的是为了简化SQL语句的书写。Oracle 可以为表、视图、序列、过程、函数、程序包等指定一个别名。同义词有两种类型:

私有同义词:拥有 CREATE SYNONYM 权限的用户(包括非管理员用户)即可创建私有同义词,创建的私有同义词只能由当前用户使用。
公有同义词:系统管理员可以创建公有同义词,公有同义词可以被所有用户访问。
1.创建同义词;
create [or replace] [public] sysnonym [schema.]sysnonym_name for [schema.]object_name;
(1)创建同义词时,如果同义词存在则用新的同义词替换旧的同义词;
(2)一个用户或该用户下所有的数据库对象的集合称为schema(模式或方案),用户名为schema名,一个数据库对象的全称为用户名.对象名,即schema.object_name;同义词作为一种数据库对象,它的相关信息被存储在数据字典中。
2.与同义词有关的数据字典有三个: user_synonyms 、all_synonyms 、dba_synonyms。
其中在数据字典user_synonyms 中记录了当前用户所拥有的同义词。这个表的各列定义及其意义如下所示:
synonym_name 同义词名称
table_owner  所指向的对象属主
table_name   所指向对象的名称
db_link      数据库链接
(注:db_link 列是指在创建同义词synonym时,table_name 是通过dblink获得的。)
3.查询当前用户创建了的同义词,它们各代表哪个用户的哪个对象:
SELECT synonym_name, table_owner, table_name FROM user_synonyms;
在数据字典all_synonyms 中记录了当前用户所能使用的所有同义词,包括私有同义词和公共同义词。
在数据字典dba_synonyms 中记录了数据库中所有的同义词,包括每个用户创建的私有同义词和DBA 创建的公共同义词。
这个视图只有DBA 能够访问,它的结构除了包含数据字典user synonyms的所有列外,还有一个列owner代表同义词的创建者。
如果要在整个数据库范围内查询某个同义词的信息,可以对数据字典dba_synonyms进行查询。
例如:SELECT synonym_name, table_owner, table_name FROM dba_synonyms WHERE owner='SCOTT';
如果要查询用户scott的表dept具有哪些同义词,可以执行下面的SELECT语句:
SELECT synonym_name, table_owner FROM dba_synonyms WHERE owner='SCOTT' AND table_name='EMP';
如果要查询系统中所有的公共同义词,可以执行下面的SELECT语句:
SELECT synonym_name, table_owner FROM dba_synonyms WHERE owner='PUBLIC';
注:table_owner和owner之前的区别:
table_owner是指同义词所指向数据库对象的属主,一般就是指该对象的创建者,而owner是指同义词的创建者 
如果要创建一个远程的数据库上的某张表的同义词,需要先创建一个Database Link(数据库连接)来扩展访问,然后再使用如下语句创建数据库
create synonym table_name for table_name@DB_Link;
当然,你可能需要在user1用户中给当前用户(user2)授权: grant select/delete/update on user2 ;
4.创建数据库链接:
Create database link [数据库链名] connect to [用户名] identified by [密码] using '[要链接的数据库名]';
create database link db_link connect to tpss_bill identified by 123 using 'crmcxdb2';

四、约束
   约束是加在表上的一种强制性规则,是保证数据完整性的一种手段,当向表中插入或修改数据时,必须满足约束说规定的条件。在设计表结构时,需要考虑在表上添加必要的约束。保证数据完整性的方法有三种:使用程序代码,触发器,添加约束。其中添加约束是一种较为灵活的方式,而且性能也比较高,是保证数据完成性的最佳选择,添加约束时最好是在设计表的时候,如果在插入数据后再添加约束,可能会因为数据不满足约束而不能添加。
约束的类型有五种:not null (非空约束)、unique(唯一性约束、primary key(主键约束)、foreifn key(外键约束)、check(检查约束)
1.主键(primary key)是定位表中单个行的方式,可唯一确定表中的某一行,关系型数据库要求所有表都应该有主键,不过Oracle没有遵循此范例要求,Oracle中的表可以没
有主键(这种情况不多见)。关于主键有几个需要注意的点:
(1)键列必须必须具有唯一性,且不能为空,其实主键约束,相当于UNIQUE+NOT NULL
(2)一个表只允许有一个主键
(3)主键所在列必须具有索引(主键的唯一约束通过索引来实现),如果不存在,将会在索引添加的时候自动创建添加主键(约束的添加可在建表时创建,也可在建表后添加,一般推荐建表后添加,灵活度更高一些,建表时添加某些约束会有限制)
alter table student add constraint pk_stu_name primary key(name);
主键约束指定表中的一列或者几列的组合的值在表中具有唯一性。但组合的列最多有16列。例如:将id和name作为主键约束
alter table student add constraint pk_stu_id_name primary key (id,name);
2.唯一性约束(unique)可以作用在一列或多列组合上,用来保证每一行的唯一性。唯一性约束可作用在单列或多列上,对于这些列或列组合,唯一性约束保证每一行的唯一性。
UNIQUE需要注意:
(1)对于UNIQUE约束来讲,索引是必须的。如果不存在,就自动创建一个(UNIQUE的唯一性本质上是通过索引来保证的)
(2)UNIQUE允许null值,UNIQUE约束的列可存在多个null。这是因为,Unique唯一性通过btree索引来实现,而btree索引中不包含null。当然,这也造成了在where语句中用null值进行过滤会造成全表扫描。

添加唯一约束:
create table student add constaint pk_stu_id unique(id);
3.非空约束(not null)非空约束作用的列也叫强制列。强制键列中必须有值,当然建表时候若使用default关键字指定了默认值,则可不输入。
alter table student modify name not null;
4.外键约束(foreifn key)外关键字约束定义了表之间的关系。当一个表中的一个列或多个列的组合和其它表中的主关键字定义相同时,就可以将这些列或列的组合定义为外关键字,并设定它适合哪个表中哪些列相关联。这样,当在定义主关键字约束的表中更新列值,时其它表中有与之相关联的外关键字约束的表中的外关键字列也将被相应地做相同的更新。外关键字约束的作用还体现在,当向含有外关键字的表插入数据时,如果与之相关联的表的列中无与插入的外关键字列值相同的值时,系统会拒绝插入数据。与主关键字相同,不能使用一个定义为 TEXT 或IMAGE 数据类型的列创建外关键字。外关键字最多由16 个列组成。
定义外关键字约束的语法如下:
 constraint constraint_name
 foreign key (column_name1[,column_name2,…,column_name16])
 references ref_table [(ref_column1[,ref_column2,…, ref_column16])]
 [on delete {cascade | no action } ]
 [on update {cascade | no action } ]]
 [not for replication ]
 各参数说明如下:
 references 指定要建立关联的表的信息。
 ref_table 指定要建立关联的表的名称。
 ref_column 指定要建立关联的表中的相关列的名称。
 on delete {cascade | no action} 指定在删除表中数据时,对关联表所做的相关操作。在子表中有数据行与父表中的对应数据行相关联的情况下,如果指定了值cascade,则在删除父表数据行时会将子表中对应的数据行删除;如果指定的是no action,则sql server 会产生一个错误,并将父表中的删除操作回滚。no action 是缺省值。
 not for replication 指定列的外关键字约束在把从其它表中复制的数据插入到表中时不发生作用。
 例如:创建一个课程表,与前面班级表关联
 create table class(
  class_name varchar(20),
  class_id number ,
  teacher_name varchar(20),
  constraint pk_class_id primary key(class_id),
  foreign key pk_class_name_id (class_name,class_id)references student(class_name,class_id)
 ) on primary
5.检查约束(check)可用来实施一些简单的规则,比如列值必须在某个范围内。检查的规则必须是一个结果为true或false 的表达式,比alter table student add constraint stu_sex_ck check(sex in('男','女'));

五、索引
(1)索引是数据库对象之一,用于加快数据的检索,类似于书籍的索引。在数据库中索引可以减少数据库程序查询结果时需要读取的数据量,类似于在书籍中我们利用索引可以不用翻阅整本书即可找到想要的信息;
(2)索引是建立在表上的可选对象;索引的关键在于通过一组排序后的索引键来取代默认的全表扫描检索方式,从而提高检索效率;
(3)索引在逻辑上和物理上都与相关的表和数据无关,当创建或者删除一个索引时,不会影响基本的表;
(4)索引一旦建立,在表上进行DML操作时(例如在执行插入、修改或者删除相关操作时),oracle会自动管理索引,索引删除,不会对表产生影响;
(5)索引对用户是透明的,无论表上是否有索引,sql语句的用法不变
(6)oracle创建主键时会自动在该列上创建索引
1.创建最佳的索引
 create  index index_name on table_name(column_name)
 tablespace tablespace_name
 pctfree 5
 initrans 2
 maxtrans 255
 storage(
 minextents 1
 maxextents 16382
 pctincrease 0);
2.创建基于函数的索引,常常与upper、lower、to_char(date)等函数一起用,例如:
 create index idx_name on student  (to_char(birthday)) tablespace tablespace_name;
3.创建位图索引,对于基数小且基数相对稳定的列建立索引时应该先考虑位图索引,例如:
 create bitmap index  idx_bit_classno on class(classno) tablespace tablespace_name;
4.创建唯一索引
 create unique index idx_uni_stuid student (studentid) tablespace tablespace_name;
5.创建与约束相关的索引
 alter table class
 add constraint pk_primary_key_classid primary key (classid) using index tablespace tablespace_name;
6.使用不等于操作符(<>, !=)
下面这种情况,即使在列dept_id有一个索引,查询语句仍然执行一次全表扫描
select * from dept where staff_num <> 1000;
通过把用 or 语法替代不等号进行查询,就可以使用索引,以避免全表扫描:上面的语句改成下面这样的,就可以使用索引了。
7.使用 is null 或 is not null
使用 is null 或is nuo null也会限制索引的使用,因为数据库并没有定义null值。如果被索引的列中有很多null,就不会使用这个索引(除非索引是一个
位图索引)。在sql语句中使用null会造成很多麻烦。解决这个问题的办法就是:建表时把需要索引的
列定义为非空(not null)
8.使用函数
如果没有使用基于函数的索引,那么where子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引。下面的查询就不会使用索引:
select * from staff where trunc(birthdate) = '01-MAY-82';
但是把函数应用在条件上,索引是可以生效的,把上面的语句改成下面的语句,就可以通过索引进行查找。
select * from staff where birthdate < (to_date('01-MAY-82') + 0.9999);
9.比较不匹配的数据类型
比较不匹配的数据类型也是难于发现的性能问题之一。下面的例子中,dept_id是一个varchar2型的字段,在这个字段上有索引,但是下面的语句会执行全表扫描。
select * from dept where dept_id = 900198;
这是因为oracle会自动把where子句转换成to_number(dept_id)=900198,这样就限制了索引的使用。把SQL语句改为如下形式就可以使用索引
select * from dept where dept_id = '900198';
10.使用like子句
使用like子句查询时,数据需要把所有的记录都遍历来进行判断,索引不能发挥作用,这种情况也要尽量避免。
like 的字符串中第一个字符如果是‘%’则用不到索引
column1 like ‘aaa%’ 是可以的,column1 like ‘%aaa%’用不到。
11.使用in
尽管in写法要比exists简单一些,exists一般来说性能要比in要高的多,
当in的集合比较小的时候,或者用exists无法用到选择性高的索引的时候,用in要好,否则就要用exists
例:select count(*) from person_info where xb in (select xb_id from dic_sex);
select count(*) from n_acntbasic a where shbxdjm =:a and exists(select 1 from person_info where pid=a.pid and …);
假定test表的dt字段是date类型的并且对dt建了索引。
12.如果能不用到排序,则尽量避免排序
用到排序的情况有集合操作。Union ,minus ,intersect等,注:union all 是不排序的。
Order by、Group by、Distinct、In 有时候也会用到排序确实要排序的时候也尽量要排序小数据量,尽量让排序在内存中执行。

猜你喜欢

转载自blog.csdn.net/cyl101816/article/details/83280128