Mysql入门第四课 视图和存储程序

来源:互联网 发布:windows xp pe下载 编辑:程序博客网 时间:2024/05/16 11:46

 1.   视图是一个虚表,它像一个表,但实际上又不包含数据。其实,它是根据表和其他视图来进行定义的,并且提供了另一种查看数据的方式。

使用select 语句来定义视图,查询视图就等效于查询定义它的那条语句,只是视图将细节隐藏起来。视图定义里可以包含表达式计算和连接等操作。

一个基本的视图可以只选择表的部分列。假设经常要从student这个表中只取name, addr, score这3列,但是并不想使用 select  name, addr,score from student.;同时也不想用select *from语句,这个时候你就可以定义一个视图,让它只显示你想要显示的那些列。


CREATE VIEW  vpres AS  SELECT  name, addr, score from student;(大写的为关键字)

通过上面这个视图,你可以只看到你想看到的列。在视图中使用select *from 显示你定义的想看到的列 SELECT *FROM vpres;


如果在查询视图时包含了WHERE字句,可以进一步的对显示的内容进行限制。


SELECT *FROM vpres WHERE name=" lai";


如果添加ORDER BY, LIMIT等字句也可限制。


在默认的情况下,视图里的列名与其SELECT语句里列出的输出列名相同。如果想要显示地改变其他列名,那么需要在视图定义里,紧跟视图名字的后面用括号列出那些新名字:


CREATE VIEW vpres(in, fn) AS SELECT name, score FROM student;


这样定义之后,显示视图就要用SELECT in,fn FROM vpres; 而不能用name, score


有些视图是可更新的,也就是说,可以通过操作视图,对顶层表里的那些行实现插入、更新或删除操作:

//创建一个表,并且定义视图

CREATE TABLE   t   (i  int );

INSERT ONTO   t  (i)  VALUES  (1), (2),(3);

CREATE VIEW   v  AS SELECT  i  FROM   t;

SELECT  i  FROM  v;


//通过视图对底层表的行进行插入与删除


INSERT INTO v (i) VALUES (4);

DELETE FROM v WHERE i<3;

SELECT i FROM v;


//进行更新操作

UPDATE v SET i=i+1;

SELECT i FROM v;


如果想要让一个视图更新,必须让它直接映射到一个表上,它所选择的那些列必须是对表中各列的简单引用,并且对视图某行的任何操作必须与底层表中某一行的操作相对应。例如如果某个视图中有一个聚合函数计算得到的“汇总”列,那么这个行就涉及很多行,不能对其进行更新。


2.如何写复合语句


复合语句有begin 和end 块构成,两者之间可以有任意条语句。以下是一个例子,



在上面复合语句中,在块内的语句之间必须使用分号;进行分隔,但是分号又同时是客户端程序mysql默认语句结束符,因此要用delimiter 语句定义一个mysql的默认语句分隔符,实现mysql不用讲分号解释为结束符,而是将整个复合语句作为一个整体。在定义完存储程序之后,还可以再次更改默认结束符为分号。


分隔符不一定得是美元符号,也可以是其他的。



3.存储函数和存储过程 


存储函数常用在表达式里,它会执行计算并返回一个值,存储过程使用call语句来调用的独立操作,不能用在表达式里。适用于使用存储过程的情况有两种:

只需通过运算来实现某种效果或动作,不需要返回值;

运算结果需要返回多个结果集(函数无法做到这一点)


存储函数可以用CREATE FUNCTION  函数名(变量)

                            RETURNS  type 

                           函数体语句


存储过程可以用CREATE PROCEDURE 名 (变量)

                                      函数体语句



下面是一个例子(注意returns和return)

delimiter $

create function 函数名 (变量声明)

returns  int 或者其他数据类型

begin 

...这里有return语句

end$

函数体中至少要包含一条return语句,用来向调用者返回一个值。将一个计算定义为函数,可以方便执行它,不需要反复写出所以逻辑步骤。


但函数无法返回多个函数值,要让函数返回多个值,一种方法是编写多个函数,然后再同一个语句中调用所以这些函数;另一种办法是使用一个存储过程,通过它的out参数“返回”这些值。


存储过程和存储函数相似,但是存储过程没有返回值。因此它没有任何returns字句或者return语句。它会显示一个结果集,而不是一个表达式计算结果。只能通过call语句来调用它。


存储过程的参数分为3种类型。对于IN 参数,调用者会把一个值传递到过程里。这个过程可以对这个值进行修改,但在过程返回之后任何修改对调用者来说都是不可见。OUT参数则正好相反。过程把某个值赋给这个参数,但在过程返回后该值可以被调用者访问。


显示指定参数类型的方法是,在参数列表里的参数名前面使用IN、OUT或INOUT 。如果没有为参数指定类型,则默认类型是IN  


如果想返回多个结果,用OUT和INOUT。


4.触发器   


触发器是与特定表想关联的存储过程,其定义会在执行表的insert、delete、update语句时,会被自动激活。触发器的定义里包含有一条会在触发器被激活时执行的语句。


CREATE TRIGGER  触发器名称

{ BEFORE| AFTER}    触发器激活的时机

{INSERT|DELETE|UPDATE} 触发器激活的语句

ON  tbl_name 关联表的名字

FOR EACH ROW  trigger_stmt 触发器内容


在下面的这个例子中


create table t (percent int , dt  datetime);

delimiter $

create trigger bi_t BEFORE INSERT ON t 

FOR EACH ROW BEGIN

IF NEW.percent <0 THEN 

   SET   NEW.percent=0;

ELSEIF NEW.percent >100 THEN 

SET NEW.percent=100;

END IF ;

END $  NEW.dt=CURRENT_TIMESTAMP;

END $

delimiter ;


这个触发器将完成两个动作。

如果要插入的百分比值超出了0~100的范围,那么这个触发器将把该值转换成最靠近端的那个值

这个触发器会自动为那个DATETIME列提供一个CURRENT_TIMESTAMP值。


6.事件

MYSQL 有一个事件调度器,它可以定时激活多个数据库操作。事件就是一个与计划相关联的存储程序。





0 0