Oracle知识点
1、索引:(可以大大加快数据的检索速度这也是创建索引的最主要原因,表中索引的数量越多相对检索速度会越慢, 如果返回的行数目较大,使用全表扫描的性能较好)。
创建索引可以大大提高系统的性能:
第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
第四,在使用分组和排序 子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
增加索引也有许多不利的方面:
第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
索引是建立在数据库表中的某些列的上面。因此,在创建索引的时候,应该仔细考虑在哪些列上可以创建索引,在哪些列上不能创建索引。一般来说,应该在这些列上创建索引,例如:
在经常需要搜索的列上,可以加快搜索的速度;
在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;
在经常用在连接的列上,这 些列主要是一些外键,可以加快连接的速度;
在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;
在经常需要排序的列上创 建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;
具体举例:
1. 在一个表中定义的语句级的触发器,当这个表被删除时,程序就会自动执行触发器里面定义的操作过程。这个就是删除表的操作就是触发器执行的条件了。
第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
第四,在使用分组和排序 子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
增加索引也有许多不利的方面:
第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
索引是建立在数据库表中的某些列的上面。因此,在创建索引的时候,应该仔细考虑在哪些列上可以创建索引,在哪些列上不能创建索引。一般来说,应该在这些列上创建索引,例如:
在经常需要搜索的列上,可以加快搜索的速度;
在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;
在经常用在连接的列上,这 些列主要是一些外键,可以加快连接的速度;
在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;
在经常需要排序的列上创 建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;
在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。
创建索引的SQL
CREATE INDEX IDX_TEST ON TABLENAME(COLUMNAME)
查询索引的SQL
SELECT * FROM TABLENAME WHERE COLUMNAME=('实际内容')
例如
select
*
from
ltest
where
name
=
'zhangsan'
注释:创建列的索引后,在对该表的列进行检索时,速度比没有创建索引要快。
2、触发器
触发器是一种特殊类型的存储过程,触发器主要通过事件触发而被执行的,触发器的优点:
①.强化约束,触发器能够提供比CHECK约束。
②.跟踪变化,触发器可以跟踪数据库内的操作,从而不允许未经允许许可的更新和变化。
③.
联级运算,比如某个表上的触发器中包含对另一个表的数据操作,而该操作又导致该表上的触发器被触发。
触发器的定义就是说某个条件成立的时候,你触发器里面所定义的语句就会被自动的执行。因此触发器不需要人为的去调用,也不能调用。
然后,触发器的触发条件其实在你定义的时候就已经设定好的了。这里面需要说明一下,触发器可以分为语句级触发器和行级触发器。详细的介绍可以参考网上的资料,简单的说就是语句级的触发器可以在某些语句执行前或执行后被触发。而行级触发器则是在定义的了触发的表中的行数据改变时就会被触发一次。具体举例:
1. 在一个表中定义的语句级的触发器,当这个表被删除时,程序就会自动执行触发器里面定义的操作过程。这个就是删除表的操作就是触发器执行的条件了。
2. 在一个表吕定义了行级的触发器,那当这个表中一行数据发生变化的时候,比如删除了一行记录,那触发器也会被自动执行了。
创建触发器的一般语法是:
CREATE
[OR REPLACE]
TRIGGER
trigger_name
{BEFORE | AFTER }
{ INSERT | DELETE | UPDATE [OF column [, column …] ]}
[OR {INSERT | DELETE | UPDATE [OF column [, column …] ]}...]
ON [schema.] table_name | [schema.] view_name
[REFERENCING {OLD [AS] old | NEW [AS] new | PARENT as parent}]
[FOR EACH ROW ]
[WHEN condition]
{BEFORE | AFTER }
{ INSERT | DELETE | UPDATE [OF column [, column …] ]}
[OR {INSERT | DELETE | UPDATE [OF column [, column …] ]}...]
ON [schema.] table_name | [schema.] view_name
[REFERENCING {OLD [AS] old | NEW [AS] new | PARENT as parent}]
[FOR EACH ROW ]
[WHEN condition]
PL
/
SQL_BLOCK
|
CALL procedure_name;
例如:
create
or
replace
trigger
tr_del_emp_his
before
delete
--指定触发器为删除操作前触发(也可以
INSERT OR DELETE OR UPDATE一起使用,只能用or连接)
on
test.emp_his--用户名.表名 也可以是 用户名.视图名
for
each
row
--说明创建的是行级触发器
begin
--将修改前数据插入到日志记录表 del_emp ,以供监督使用。
insert
into
emp_del
(
id
,
name
)
values
(:
old.id
,:
old.name
);
end
;
要想删除触发器去trigger中找到要删除的触发器名称右键删除即可
知识拓展:
union和union all 的区别
UNION用的比较多union all是直接连接,取到得是所有值,记录可能有重复 union 是取唯一值,记录没有重复 1、UNION 的语法如下:
[SQL 语句 1]
UNION
[SQL 语句 2]
2、UNION ALL 的语法如下:
[SQL 语句 1]
UNION ALL
[SQL 语句 2]
效率:
UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。
1、对重复结果的处理:UNION在进行表链接后会筛选掉重复的记录,Union All不会去除重复记录。
2、对排序的处理:Union将会按照字段的顺序进行排序;UNION ALL只是简单的将两个结果合并后就返回。
[SQL 语句 1]
UNION
[SQL 语句 2]
2、UNION ALL 的语法如下:
[SQL 语句 1]
UNION ALL
[SQL 语句 2]
效率:
UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。
1、对重复结果的处理:UNION在进行表链接后会筛选掉重复的记录,Union All不会去除重复记录。
2、对排序的处理:Union将会按照字段的顺序进行排序;UNION ALL只是简单的将两个结果合并后就返回。
从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用UNION ALL。
简单说就是
union去重且排序,效率低
union all 不去重不排序,效率高
3、视图
备注:不能直接更新,删除视图。视图实际是一张虚表,不是实际的表,要对视图更新或者删除,只能对组成视图的表来进行操作!
视图是一种虚拟表,虚拟表具有和物理表相同的功能。 可以对虚拟表进行增、查操作,视图通常是一个或多个表的行或列的子集,视图的结果更容易理解(修改视图对基表不影响),获取数据更容易(相比多表查询更方便),限制数据检索(比如需要隐藏某些行或列),维护更方便。
知识点拓展:当创建视图时,可能会提示权限不足,也就是没有创建视图的权限。这是因为没有给当前用户赋予创建视图的权限。需要到system用户中为当前用户赋权限,登录到system中输入
grant
create
any
view
to
test--test是当前用户名
然后再执行SQL创建视图(两个表之间的)
①、 create
or
replace
view
lydwww
as
select
a.id
,
a.name
,
a.age
from
lydtest a
union
all
select
b.id
,
b.name
,
b.age
from
lydviewtest b
②、create or replace view mettinginfo as
select
h1.id as sheetid, --将
h1的id命名成视图中sheetid
h1.meeting_name as hybt,
h1.meeting_time as hysj,
h1.MEETING_HOST_ID as zcrid,
h1.MEETING_PLACE as hydd,
h1.BUFF as status
from ZW_HYGL_CWHY_HYB h1