欢迎投稿

今日深度:

Mysql----浅入浅出之视图、存储过程、触发器,m

Mysql----浅入浅出之视图、存储过程、触发器,mysql----浅出


一、视图 VIEW

视图是虚拟的表,本身不存储任何数据。只有运行时,才包含动态检索出来的数据。

eg:SELECT sid, name, sex, s_num FROM  student, school WHERE sid = 2 AND student.sid = scholl.sid ;

这个简单的查询涉及到两个表。所以任何需要这个数据的人都必须熟悉两个表以及之间的关系。想检索其他学生信息,就必须修改WHERE子句。如果可以把整个查询包装成一个虚拟表studentinfo,那么就可以这样得到数据:

eg:SELECT sid, name, sex, s_num FROM studentinfo WHERE sid = 2;

使用视图可以重用sql语句。对于使用的人可以不必知道细节。对原始数据也有保护作用。

视图也有一些限制,比如不能索引,不能有关联的触发器。名字必须唯一。

创建视图:

eg:CREATE VIEW studentinfo AS SELECT sid name, sex, s_num FROM student, school WHERE student.sid = school.sid;

视图也可以更新,但是只在特定的情况下。如果视图有这些定义,则不能更新:分组、联结、子查询、并、聚集函数DISTINCT、计算列。

二、存储过程

当需要处理的业务逻辑很复杂的时候,可以一条条的写sql语句,而且需要考虑到所有的需要处理的细节、数据完整性。可以创建存储过程来代替。它就像一个批处理,包含预先定义好的一条或多条sql语句的集合。但它的作用可不仅限于此。

创建:

eg:CREAT PROCEDURE prostudent() 

BEGIN

SELECT Max(score) AS scoremax FROM student;

END;

删除:

eg:DROP PROCEDURE prostudent;

使用参数:

eg:CREATE PROCEDURE prostudent(OUT scorehigh DECIMAL(8, 2), OUT scorelow DECIMAL(8, 2))

BEGIN

SELECT Max(score) INTO scorehigh FROM student;

SELECT Min(score) INTO scorelow FROM student;

END;

执行:

eg:CALL prostudent(@scorelow, @scorehigh);

SELECT @scorehigh, @scorelow;

执行了名为prostudent的存储过程,并返回了最高成绩和最低成绩。

此外,存储过程还可以写注释、定义临时变量、IN传入参数、流程控制语句。

SHOW CREATE PROCEDURE ****; 可以查看创建存储过程的语句。

SHOW PROCEDURE STATUS;可以查看这个存储过程是何时、由谁创建的。

三、游标

SELECT语句返回的是一个结果集,可能是满足条件的多个航。那我们想对这个结果集的每一行进行一些处理时,或者在第一行、最后一行、前一行等特殊要求时,怎么办呢?这里就用到里游标。mysql中的游标只能用于存储过程,这是与其他数据库的不同。

使用游标需要先定义DECLARE *** CURSOR FOR、然后打开OPEN ***、使用、关闭CLOSE ***。游标的生命周期只在存储过程中,也就是如果你不关闭它,当存储过程END时,会自动关闭。

游标打开后,可以用FETCH取出一行,并在内部指向下一行的位置,当再次FETCH的时候,将取出下一行。

举个例子:现在要将所有sid大于3的学生的成绩加和。

eg: DELIMITER //

CREATE PROCEDURE sumofscore(OUT sum INT)

BEGIN

DECLARE done BOOLEEAN DEFAULT 0;

DELCARE tmp INT;

DECLARE s INT DEFAULT 0;

DECLARE yb CURSOR FOR SELECT score FROM student WHERE sid > 3;

DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

OPEN yb;

REPEAT

FETCH yb INTO tmp;

SET s = s + tmp;

UNTIL done END REPEAT;

CLOSE yb;

SELECT s INTO sum;

END

//

DELIMITER ;

DELIMITER 重定义mysql的结束符。02000是数据未找到的错误码,利用它来判断是否遍历完所有数据。

四、触发器

在某些需求下,想要某些语句在特定事件发生时,自动执行,那么就用到了触发器。mysql触发器只能响应delete、insert和update语句。

创建触发器:

eg:CRESTE TRIGGER newstudent AFTER INSERT ON student FOR EACH ROW SELECT new.sid INTO @s;

触发器名字是newstudent,INSERT指定响应事件是插入操作。AFTER/BEFORE指定是在事件执行前还是事件执行后触发。FOR EACH ROW指定对插入的每一行都进行操作,所以每插入一行,就把这行的sid传给变量s。每个表每个事件只允许有一个触发器,所以每个表最多有6个触发器。一个触发器也只能响应一个事件。

删除触发器:

eg:DROP TRIGGER newstudent;

使用触发器:

在INSERTZHONG ,可引用一个名为NEW的虚拟表,访问被插入的行。在BEFROE INSERT中,也可以引用NEW,甚至可以更新数据,以改变插入数据的内容。

DELETE触发器中,可以引用名为OLD的虚拟表,访问被删除的行。


mysql中的存储过程、触发器、视图的用法

建立存储过程

Create procedure、Create function

下面是它们的格式:
Create proceduresp_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 procedure 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
......余下全文>>
 

sql视图 存储过程 触发器各自的优点是什?

视图的优点:

提高数据安全性,可以不让用户看到表中的某个字段。比如password,你只给他们执行视图的权限,不给执行表的权限,他们就无法查看全部数据。

还有可以建立一个视图,内容包括两个表,更新的时候只需要指定ID,而不用管它来自哪个表,对应表中的数据就会自动更新。

存储过程的优点:

包括视图的所有优点,还可以让不懂数据库的人也能也用数据库,还有就是方便程序计设,比如我负责前台程序设计,你负责写存程,我不用管你是怎么写,最后只接调用,我们分工明确,我也不需要懂你所懂的,这为用不懂语言和不同专业的人在一起合作提供了良好的平台。提高开发效率。

触发器的优点:

保证数据的正确性和逻辑,比如订单表中新增一条数据,对应在库存表中会减少一个产品一样。
还有保证数据的安全性,比如当用户删除表A,我们可以判断他是否为Admin组的用户,如果不是,就会给出错误的提示,并将事务回滚。

我知道的就这么多了。。。嘿嘿。
 

www.htsjk.Com true http://www.htsjk.com/shujukunews/2666.html NewsArticle Mysql----浅入浅出之视图、存储过程、触发器,mysql----浅出 一、视图 VIEW 视图是虚拟的表,本身不存储任何数据。只有运行时,才包含动态检索出来的数据。 eg:SELECT sid, name, sex, s_num...
评论暂时关闭