触发器视图存储过程
‘壹’ 他们的优点和缺点分别是什么: 视图、索引、存储过程、触发器
1、索引的优缺点
1)优点:可以大大提高系统的性能。它不仅可以加快数据检索的速度,还能在检索数据的过程中提高系统的性能,并且可以加速表与表之间的连接。
2)缺点:占用更多的磁盘空间,并且降低添加、删除和更新行的速度。虽然在大多数情况下,索引所带来的数据检索速度的优势远远超过了它的缺陷,但过多的索引不一定能提高数据库的性能。
2、视图优点
1)集中用户数据
2)简化用户操作
3)提高数据安全性
4)降低应用程序对底层表的依赖性
3、存储过程优点
1)提高执行效率:存储过程的执行速度比批处理的执行速度快。
2)增加系统编程能力:存储过程使用编程设计模块化。
3)减少网络通信量:在客户计算机上执行存储过程时,网络中传送的只是该执行语句,而不用传送组成该存储过程中的sql语句,从而大大减少了网络流量。
4)保证系统安全:系统管理员通过对执行某一存储过程的权限进行限制,从而能够实现对相应的数据访问权限的限制,避免非授权用户对数据的访问,保证数据的安全。
4、触发器优点
1)强化约束:强制复杂业务的规则和要求,能实现比check语句更为复杂的约束。
2)跟踪变化:触发器可以侦测数据库内的操作,从而禁止数据库中未经许可的更新和变化。
3)级联运行:侦测数据库内的操作时,可自动地级联影响整个数据库的各项内容。
4)嵌套调用:触发器可以调用一个或多个存储过程。触发器最多可以嵌套32层。
缺点:性能较低。因为在运行触发器时,系统处理的大部分时间花费在参照其他表的处理上,这些表既不在内存中也不在数据库设备上,而删除表和插入表总是位于内存中。
‘贰’ mysql中的存储过程、触发器、视图的用法
建立存储过程
Create procere、Create function
下面是它们的格式:
Create proceresp_Name ([proc_parameter ])
routine_body
这里的参数类型可以是 IN OUT INOUTT ,意思和单词的意思是一样的,IN 表示是传进来的参数,
OUT 是表示传出去的参数,INOUT 是表示传进来但最终传回的参数。
Create functionsp_Name ([func_parameter ])
Returns type
Routine_body
Returns type 指定了返回的类型,这里给定的类型与返回值的类型要是一样的,否则会报错。
下面给出两个简单的例子来说明:
1、 显示 Mysql 当前版本
执行结果
mysql> use welefen;
Database changed
mysql> delimiter // #定义//作为结束标记符号
mysql> create procere getversion(out param1 varchar(50)) #param1为传出参数
-> begin
-> select version() into param1; #将版本的信息赋值给 param1
-> end
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> call getversion(@a); #调用getversion()这个存储过程
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> select @a;
-> //
+--------------------------+
| @a |
+--------------------------+
| 5.1.14-beta-community-nt |
+--------------------------+
1 row in set (0.00 sec)
2、 显示”hello world”
执行结果
mysql> delimiter //
mysql> create function display(w varchar(20)) returns varchar(50)
-> begin
-> return concat('hello ‘,w);
-> end
-> //
Query OK, 0 rows affected (0.05 sec)
mysql> select display("world");
-> //
+------------------+
| display("world") |
+------------------+
| hello world |
+------------------+
1 row in set (0.02 sec)
其他操作存储过程的语句
前面我们已经知道了怎么创建存储过程,下面看看其他常用的用于操作存储过程的语句。
Alter {procere | function} sp_Name []
Alter 语法是用来改变一个过程或函数的特征,当你想改变存储过程或者函数的结构时可以使
用它。当然你也可以先 drop 它再 create。
Drop {procere | function} [if exists] sp_Name
Drop 语法即用来删除一个存储程序或者函数,当你创建的一个存储过程或者函数的名字已经存
在时,你想把以前的给覆盖掉,那么此时你就可以使用 drop ,然后在创建。
Show create {procere | function } sp_Name
Show 语法用来显示创建的存储过程或者函数的信息。这里的 show 用法跟数据表中的 show 用
法是很相似的。
Show {procere | function} status [like 'partten']
它返回子程序的特征,如数据库,名字,类型,创建者及创建和修改日期。如果没有指定样式,
根据你使用的语句,所有存储程序和存储函数的信息都被列出。
看了以上的几个语法,你是不是感觉跟对表的操作很相象,那你就想对了,他们确实是很相似
的。带着一份激动心情我们继续往下看,你会发现很简单。
Begin ... End 语句
通过 begin end 可以来包含多个语句,每个语句以“;”结尾。
Declare
用Declare 来声明局部变量
Declarevar_Name type defaulevaule
Delare 条件
Declarecondition_Name CONDITION FOR condition_value
调用存储过程
Call
格式:
Callsp_Name [parameter ]
这里的 sp_Name 必须是由 create procere 创建的名称。它可以通过声明的参数来传回值,
它也返回受影响的行数,在 MySQL 中可以通过 mysql_affected_rows() 来获得。
流程控制语句
IF 语句
IFsearch_condition THENstatement_list
[ELSEIFsearch_condition THENstatement_list]
[ELSEstatement_list]
END IF
CASE 语句
CASE case_value
WHEN when_value THENstatement_list
WHEN when_value THENstatement_list]
ELSEstatement_list]
END CASE
LOOP 语句
[begin_label:] LOOP
statement_list
END LOOP [end_label]
LOOP 实现了一个简单的循环,通过 LEAVE 来退出
LEAVE 语句
LEAVE lable
退出语句,一般可以用在循环中。
ITERATE 语句
ITERATE lable
ITERATE 一般出现在 LOOP、REPEATE、WHILE 里,意思是再次循环。
REPEATE 语句
[begin_label:] REPEAT
statement_list
UNTILsearch_condition
END REPEAT [end_label]
REPEAT 语句内的语句或语句群被重复,直至 search_condition 为真。
WHILE 语句
[begin_label:] WHILEsearch_condition DO
statement_list
END WHILE [end_label]
WHILE 语句内的语句或语句群被重复,直至 search_condition 为真。
运用实例
下面通过几个例子来讲述他们的应用:
对网站用户的操作
为了简单,用户表只有用户名和密码的信息.在服务端,我们建立如下的表:
代码片段
Drop table if exists user;
Create table user(
Id int unsigned not null auto_increment,
Name varchar(20) not null,
Pwd char(32) not null,
Primary key(Id)
);
添加用户的存储过程:
代码片段
Delimiter //
Create procere insertuser(in username varchar(20),in userpwd varchar(32))
Begin
Insert into welefen.user(Name,Pwd) values (username,md5(userpwd));
End
//
验证用户的存储过程:
代码片段
Delimiter //
Create procere validateuser(in username varchar(20),out param1)
Begin
Select Pwd into param1 from welefen.user where Name=username;
End
//
修改密码的存储过程:
代码片段
Delimiter //
Create procere modifyPwd(in username varchar(20),in userpwd varchar(32))
Begin
Update welefen.user set Pwd=md5(userpwd) where Name=username;
End
//
删除用户的存储过程:
代码片段
Delimiter //
Create procere deleteuser(in username varchar(20))
Begin
delete from welefen.user where Name=username;
End
//
在客户端,我们给出如下的程序:
代码片段
文件名:ProcereUser.php
<?php
if (!mysql_connect("localhost","root","welefen")){
echo "连接数据库失败";
}
if (!mysql_select_db("welefen")){
echo "选择数据库表失败<br>";
}
$insert_user=array("welefen","welefen");//这里的welefen分别为用户名、密码
if (mysql_query("call insertuser('$insert_user[0]','$insert_user[1]')")){
echo "添加用户$insert_user[0]成功<br>";
}else {
echo "添加用户$insert_user[0]失败<br>";
}
$validate_user=array("welefen","welefen");//这里的welefen分别为用户名、密码
mysql_query("call validateuser('$validate_user[0]',@a)");
$Pwd=mysql_query("select @a");
$result=mysql_fetch_array($Pwd);
if ($result[0]==md5($validate_user[1])){
echo "用户$validate_user[0]验证正确<br>";
}else {
echo "用户$validate_user[0]验证错误<br>";
}
$modify_Pwd=array("welefen","weilefeng"); //welefen为用户名weilefeng为新密码
if (mysql_query("call modifyPwd('$modify_Pwd[0]','$modify_Pwd[1]')")){
echo "用户$modigy_Pwd[0]的密码修改成功<br>";
}else {
echo "用户$modigy_Pwd[0]的密码修改失败<br>";
}
$delete_user=array("welefen"); //welefen为用户名
if (mysql_query("call deleteuser('$delete_user[0]')")){
echo "用户$delete_user[0]删除成功<br>";
}else {
echo "用户$delete_user[0]删除失败<br>";
}
?
程序运行的结果:
执行结果
添加用户welefen 成功
用户welefen 验证正确
用户welefen 的密码修改成功
用户welefen 删除成功
以上的这个程序简单的说明了Mysql 中的存储过程结合PHP 的应用,当然在实际应用要比这个
复杂的多。
验证角谷猜想
角谷猜想:给定一个整数x,若x%2=1,则x=3*x+1,否则x=x/2,如此循环下去,经过有限步骤必
能得到1。
例 如 : 初 始 整 数 为 9 , 则
9->28->14->7->22->11->34->17->52->26->13->40->20->10->5->16->8->4->2->1
为了说明存储过程中一些语法的应用,我们通过存储过程来实现它:
执行结果
mysql> delimiter //
mysql> create procere jgguess(in number int)
-> begin
-> declare param1 int default 1;
-> set @a=concat(number);
-> jiaogu:loop #循环开始
-> set param1=number%2;
-> if param1=1 then set number=number*3+1; #number 为奇数,将它乘3加 1
-> else set number=number/2;
-> end if;
-> set @a=concat(@a,'->',number);
-> if number>1 then iterate jiaogu; #number 不为 1,继续循环
-> end if;
-> leave jiaogu; #退出循环
-> end loop jiaogu;
-> end
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> call jgguess(11);
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> select @a//
+-------------------------------------------------------+
| @a |
+-------------------------------------------------------+
| 11->34->17->52->26->13->40->20->10->5->16->8->4->2->1 |
+-------------------------------------------------------+
1 row in set (0.02 sec)
在这个存储过程中,你传入的参数不能超过int 型数据的范围,否则就会报错。
触发器
触发器是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。例如当我们向
某个表插入一行数据时发生一个事件或者删除某个记录时触发某个事件。
语法:
CREATE TRIGGER trigger_Name trigger_time trigger_event
ON tbl_Name FOR EACHROW trigger_stmt
trigger_time 是触发器的动作时间。它可以是 BEFORE 或 AFTER ,以指明触发器是在激活它的
语句之前或之后触发。
trigger_event 指明了激活触发器的语句的类型。trigger_event 可以是下述值之一:
INSERT:将新行插入表时激活触发器,例如,通过 INSERT、LOADDATA 和 REPLACE 语句;
UPDATE:更改某一行时激活触发器,例如,通过UPDATE语句;
DELETE:从表中删除某一行时激活触发器,例如,通过 DELETE 和 REPLACE 语句。
例如当我们向上面的user 表中增加一个用户名为“welefen ”时,我们把记录用户数的表的值增
加 1;
代码片段
Create table numuser(
Num int not null default 0
);
Delimiter //
Create trigger testnum after insert on welefen.user for each row
Begin
Update welefen.numuser set Num=Num+1;
End
//
视图
当我们想得到数据表中某些字段的信息,并想把他们保存时我们就可以用视图。
语法:
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_Name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
例如我们想对上面的用户表使用视图,可以这样:
Create viewwelefen.userview as select * fromwelefen.user;
查看视图的信息可以使用:
Select * fromwelfen.userview;
‘叁’ 请问下mysql怎么创建视图,存储过程,触发器及他们 的作用,为什么要创建
定义视图,方便快捷查询
create
view
v_user
as
select
*
from
table_user
定义过程,定义好业务逻辑
一次编译,反复执行,效率高,速度快
create
procere
p_find_user(
sname
varchar)
as
begin
select
pss
from
table_user
where
name
=sname;
end
;
定义触发器,方便对插入数据的整理,约束,或建议其他关联关系。
create
trigger
tri_table
before
insert
on
table_name
for
each
row
begin
:new.id:=seq_table_name.nextval;
end
;
‘肆’ JAVA用代码操作数据库创建表,视图,触发器,存储过程等。
create
or
replace
trigger
trg_delete_count
before
delete
on
student
for
each
row
begin
delete
from
成绩表
where
成绩表.学号=:old.学号;
commit;
end;
想要实现类似的功能,不一定要用触发器的,可以设置两个表的主键和外键,设置级联删除关系,删除主键时,外键表中的记录也会自动删除。
‘伍’ 存储过程、索引、视图、触发器 的区别
视图:只是一种预先把语句编写好的一种快照,在使用中,真正执行的还是这个语句问题;
索引:主要是考虑到操作性能的优化
存储过程:是数据库的逻辑块处理
触发器:主要考虑连带性;
这4个种功能都不一样;没有什么好比较的
‘陆’ sql视图存储过程触发器各自的优点是什么
视图的优点:
提高数据安全性,可以不让用户看到表中的某个字段。比如password,你只给他们执行视图的权限,不给执行表的权限,他们就无法查看全部数据。
还有可以建立一个视图,内容包括两个表,更新的时候只需要指定ID,而不用管它来自哪个表,对应表中的数据就会自动更新。
存储过程的优点:
包括视图的所有优点,还可以让不懂数据库的人也能也用数据库,还有就是方便程序计设,比如我负责前台程序设计,你负责写存程,我不用管你是怎么写,最后只接调用,我们分工明确,我也不需要懂你所懂的,这为用不懂语言和不同专业的人在一起合作提供了良好的平台。提高开发效率。
触发器的优点:
保证数据的正确性和逻辑,比如订单表中新增一条数据,对应在库存表中会减少一个产品一样。
还有保证数据的安全性,比如当用户删除表A,我们可以判断他是否为Admin组的用户,如果不是,就会给出错误的提示,并将事务回滚。
我知道的就这么多了。。。嘿嘿。
‘柒’ 触发器的特点及和存储过程的区别
触发器在数据库里以独立的对象存储,它与存储过程不同的是,存储过程通过其它程序来启动运行或直接启动运行,而触发器是由一个事件来启动运行。即触发器是当某个事件发生时自动地隐式运行。并且,触发器不能接收参数。所以运行触发器就叫触发或点火(firing)。ORACLE事件指的是对数据库的表进行的INSERT、UPDATE及DELETE操作或对视图进行类似的操作。ORACLE将触发器的功能扩展到了触发ORACLE,如数据库的启动与关闭等。
‘捌’ 数据库里面的表、触发器、存储过程、视图这些都是什么东西
表:里面存储的都是真实的数据
视图:就是一个表或者多个表的一个映射,一般只做查询使用。比如你想要的数据存在两个表里,但你查询时不想每次都写关联,那么你创建一个视图,以后只查询这个视图就可以(查询时视图与查询表语法一样)。
触发器:做数据库操作的时候,还希望相关的数据同步操作就用触发器,比如想要向A表插入数据的时候,同时向B表插入,这样写过触发器每次向A表插入数据之后就会自动向B表插入。
存储过程:这个一般是沉淀数据使用的,当你需要查询的数据不能用一个sql语句查出或者sql语句查询速度特别慢,想要提高效率,就会用到存储过程,先把需要的数据沉淀到结果表里然后直接查询结果表就能提高效率。
‘玖’ 存储过程,触发器,视图之间的关系,有经验的人请详细的说一下!
这是oracle入门知识啊,存储过程和触发器是一类的;
存储过程 : 执行一个任务,该任务包括了一系列的SQL语句,存储在数据库中,成为数据库一个对象。
例子:创建一个简单的存储过程
CREATE OR REPLACE PROCEDURE xs_proc
IS
BEGIN
NULL;
END;
/
触发器:触发器是一个特殊的存储过程。区别就是在于, 存储过程需要去调用,而触发器无需调用,在执行某些操作的时候,会自动执行。一般当表或者视图执行 增,删,改 操作的时候,就会自动执行触发器中的SQL 语句块。还有一个区别, 创建触发器是不带参数的, 而 存储过程 可带可不带 参数。
例子:触发器需要具体的实例才能讲清,如果需要具体说明,我给你邮件。
视图和表是一类的,视图就是一个对表的查询语句,方便对表的查询。
例子:创建一个简单的视图
CREATE VIEW a AS SELECT * FROM a;
‘拾’ 在数据库中什么是储存过程,视图以及触发器
存储过程就好象一个批处理文件一样,你可以在里面执行很多的SQL,来得到你最好需要的结果 ,或者说类似于一个函数,调用存储过程后,T-SQL一次执行很多命令,最终给你个结果
视图是虚拟表,比如要查询的东西在两个表里,那么可以把两个表连接成一个视图,这样就可以查询并显示两个表里的内容了,具体还分左右外连接
触发器是个特殊的存储过程,它的执行不是人工操作的,而是由某事件的发生而引发的
你明白了吧
插红旗 吼吼