Orcale学习笔记(五)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ky415/article/details/80839198

本笔记包含:约束,视图,TOP-N,序列,索引
一、约束——约束是表级的强制规定
创建时间是建表的同时,建表之后。约束分为两类:
表级约束——可以作用在多个列上,列级约束——只能作用在一个列上
1)NOT NULL——非空约束,只能定义在列上
Create Table table_name(
column_1 Number(6),
column_2 Varchar2(15),
column_3 Data NOT NULL,
column_4 Varchar2(10)
CONSTRAINT table_name_column_4_nn
NOT NULL,
……………);
当没有显示声明约束名时,系统会自动指定约束名
2)UNIQUE——唯一标识约束,只能定义在列上
Create Table table_name(
column_1 Number(6) UNIQUE,
column_2 Varchar2(15),
column_3 Data NOT NULL,
column_4 Varchar2(10) NOT NULL UNIQUE,
………………
CONSTRAINT table_name_column_2 UNIQUE(column_2));
Prinmary Key 拥有自定义的唯一标识约束
3)Primary Key——主键,唯一标识约束
Create Table table_name(
column_1 Number(6) NOT NULL PRIMARY_KEY ,
column_2 Varchar2(15) UNIQUE,
column_3 Data NOT NULL,
column_4 Varchar2(10) ,
………………
–CONSTRAINT table_name_column_1_pk PRIMARY_KEY(column_1));
主键必须包含唯一的值,主键列不能包含 NULL 值。
每个表都应该有一个主键,并且每个表只能有一个主键。
4)Foreign Key——外键
Create Table table_name(
column_1 Number(6) NOT NULL PRIMARY_KEY ,
column_2 Varchar2(15) UNIQUE,
column_3 Data NOT NULL,
column_4 Varchar2(10) FOREIGN KEY REFERENCES table_name1(column_x),
………………
–CONSTRAINT table_name_column_4_fk FOREIGN_KEY(column_4) REFERENCES table_x(column_y));
FORFOREIGN KEY: 在表级指定子表中的列 REFERENCES: 标示在父表中的列
数据库外键定义了一个可选项,用来设置当主键表中的被参考列的数据发生变化时,外键表中响应字段的变换规则的。
update 则是主键表中被参考字段的值更新,delete是指在主键表中删除一条记录:on update 和 on delete 后面可以跟的词语有四个
no action , set null , set default ,cascade
no action 表示 不做任何操作, set null 表示在外键表中将相应字段设置为null; set default 表示设置为默认值
cascade 表示级联操作,就是说,如果主键表中被参考字段更新,外键表中也更新,主键表中的记录被删除,外键表中改行也相应删除
eg: constraint table_fk foreign key(column_x) references table_y(column_z) on delete cascade
5)Check——定义每一行必须满足的条件
Create Table table_name(
column_1 Number(6) NOT NULL PRIMARY_KEY ,
column_2 Varchar2(15) UNIQUE,
column_3 Data NOT NULL,
column_4 Number(3) check (column_4 > 0 and column_4 < 999),
………………
);
二、视图——基于 SQL 语句的结果集的可视化的表
对视图进行操作会对原有基础表的数据进行修改,其中当视图定义时包含以下元素之一时,不能使用DML语句,但是在定义视图的时候,使用 with read only 可以屏蔽DML操作。
组函数 GROUP BY DISTINCT(去重) ROWNUM(伪列)
列的定义为表达式(不能进行 update 和 insert)
表中非空的列在视图定义中未包括(不能进行insert)
1)创建视图
Create View table_name12_vu(column_1, column_2,column_3)
AS Select tn1.column_x, MIN(tn2.column_y), AVG(tn1.column_z)
From table_name1 tn1, table_name2 tn2
Where condition
Group By tn1.column_x
With Read Only
2)修改视图
Create Or Replace View table_name12_vu(column_1, column_2,column_3)
AS Select tn1.column_x, MIN(tn2.column_y), AVG(tn1.column_z)
From table_name1 tn1, table_name2 tn2
Where condition
Group By tn1.column_x
With Read Only
3)删除视图
DROP VIEW view_name;
删除视图只是删除视图的定义,并不会删除基表的数据
三、TOP-N分析——分页查询
Select *
From(
Select ROWNUM as rn1, column_x, column_y, column_z ……
From (Select column_x, column_y, column_z …… From table_name
Order By column_x

)
Where rn1 <= 50 and rn1 >= 40
注意:ROWNUM伪列,是Oracle数据库对查询结果自动添加的一个伪列,编号从1开始。
ROWNUM在物理上(查询目标表中)并不存在,是每一次查询过程中动态生成的,所以称为“伪列”。
对 ROWNUM 只能使用 < 或 <=, 而用 =, >, >= 都将不能返回任何数据。where中不能使用外层rownum列的别名
通常情况下,内层排序,外层设定范围。子查询和主查询分别会产生各自的ROWNUM伪列,而此处用的是主查询自己的伪列。
当进行分页查询的时候,通常需要进行三层Select。
最里层进行排序,中间层产生用于选择的伪劣,最外层将中间层的伪劣变成实列。
四、序列——生成主键
1)创建序列:
Create SEQUENCE sequence_name
Start with 1 –开始值
Increate by 1 –增量
Minvalue 1 | Nominvalue –最小值 | 没有最小值
Maxvalue 999 | Nomaxvalue –最大值 | 没有最大值
Cycle | Nocycle –循环 | 不需要循环
Cache 20 | Nocache –内存中 sequence 的数量 | 不在内存中放入序列值
注意:当设置了cache后,能够增加系统的处理效率,但是当数据库发生异常重启后,内存中的 sequence 会丢失
序列出现裂缝的情况,1)回滚, 2)系统异常, 3)多个使用了同一个序列
当创建的序列可以循环的时候,序列达到最大值时,会从最小值开始新的循环
2)使用序列
使用序列的场合:
- 不包含子查询、snapshot、VIEW的 SELECT 语句
- INSERT语句的子查询中
- INSERT语句的values中
- UPDATE 的 SET中
Insert table_name(id,name,……) values(sequence_name.nextval, ‘xxx’, ……)
3)修改序列:
Alter SEQUENCE sequence _name Maxvalue 999999
Alter SEQUENCE sequence_name Increate by 2
………………
注:只能修改序列的增量、最大值、最小值、是否循环、是否放入内存,并且修改只对以后产生的序列有效
修改最大值,新的最大值需要比之前的最大值要大,若要修改开始值需要删除序列再重建
4)删除序列
Drop SEQUENCE sequence_name
五、索引——加快数据库查询速度
1)创建索引
Creat [UNIQUE] | [BITMAP] INDEX index_name –UNIQUE 唯一索引 BITMAP 位图索引
On Table_name(column_x[ASC | DESC],column_y,…………) –ASC升序(缺省值) DESC降序
创建规则: 1)应该创建在Where子句,连接条件,Group By,Order By语句中常用的列上
2)表经常被访问且表的数据量大,访问的数据大概占总量的2%~4%
3)Orcale在创建具有主键约束和唯一性约束的时候自动生成唯一索引
4)经常进行DML语句的列,不适合创建索引,因为每次DML操作都需要维护索引
5)对于按范围查找的列,数据量很大时,最好建立索引,因为建立索引的时候就已经排序好了
6)在多个列上建立索引(复合索引)是,只有在Where语句中,包含建立索引时第一个列才会使用索引
2)修改索引
Alter Index index_name0 rename to index_name1; –重命名索引
Alter Index index_name coalesce; –合并索引
Alter Index index_name rebuild; –重建索引
注:合并索引是整理数据库中的冗余空间,然后合并。
重建索引是将旧的索引进行删除,然后生成新的索引。
3)删除索引
Drop Index index_name
六、SQL优化
1)SQL语句最终执行效果的顺序是:From -> Where -> Group By -> Order By
在From中,对表的解析是从右到左,需要将小表放在右边,使得生成的基础表成本更低
在Where中,对条件的解析也是从后往前,需要优先将能过滤更多的数据的条件放在后面
2)在查询条件(where)语句中,使用索引,并且在语句中尽量避免索引失效 ,索引会失效的情况如下:
–发生了隐式条件转换 –进行了算术运算(+,-,*,/) –对生成了索引的列使用了函数
–使用<>,not in, not exist, !=, or –在like中’%_’在前 –使用复合索引时,单独引用了非第一列的索引列
–当字符型数据为全数字,在where中引用时未添加”单引号 –将空的变量值直接与运算符(符号)进行比较(应采用IS NULL, IS NOT NULL, ISNULL()函数进行操作)
3)用 exists 代替 in eg:select cloumn_x from table_namea where num in (select cloumn_x from table_nameb)
–> select column_x from table_namea where exists(selcet 1 form table_nameb where a.column_x = column_x)
4)使用 union 代替 or eg:select cloumn_x from table_name where clolumn_y = yyy or cloumn_z = zzz
–> select cloumn_x from table_name where cloumn_y = yyy union all (select cloumn_x from table_name where cloumn_z = zzz)
5)任何地方都不能使用 select * from table_name …………操作,用具体的字段代替 “ * ”
6)多使用 commit 语句, 使用 truncate 代替 delete ,使用 where 代替 having , 使用 >= 代替 >

猜你喜欢

转载自blog.csdn.net/ky415/article/details/80839198
今日推荐