mysql 存储过程 视图_MySQL视图和存储过程

视图

视图是虚拟的表,只包含使用时动态检索数据的查询。

视图作用:重用SQL语句;简化复杂的SQL操作;使用表的组成部分;保护数据;更改数据格式和表示。

CREATE VIEW创建视图;SHOW CREATE VIEW viewname查看创建视图语句;DROP VIEW viewname删除视图。

CREATE VIEW productcustomers AS

SELECT cust_name, cust_contact, proid_id

FROM customers, orders, orderitems

WHERE customers.cust_id = orders.cust_id

AND orderitems.order_num = order.order_num;

视图可以用来过滤数据,和计算字段结合使用。

并非所有视图是可更新的,对视图增删,实际上是对基表增删。如果视图含有以下操作,则不能视图更新:

分组group by ,having

联结

子查询

聚集函数min() count() sum()

存储过程

保存一条或者多条SQL语句的集合,可以视为批处理。

MySQL执行存储过程的语句为CALL,CALL接受存储过程的名字以及需要传递给它的任意参数

CALL productpricing(@pricelow,@pricehigh,@priceaverage);//执行存储过程,计算返回产品最低最高平均价格

返回产品平均价格的存储过程

CREATE PROCEDURE productpricing()

GEGIN

SELECT Avg(prod_price) AS priceaverage

FROM product;

END;

删除存储过程 DROP PROCEDURE productpricing;

CREATE PROCEDURE ordertotal(

IN onumber INT,

OUT ototal DECIMAL(8,2)

)

BEGIN

SELECT Sum(item_price*quantity)

FROM orderitems

WHERE order_num = onumber

INTO ototal;

END;

//调用存储过程

CALL ordertotal(20005, @total);

SELECT @total;//查询存储过程结果

游标

游标是一个存储在MySQL服务器上的数据库查询,不是SELECT语句,而是被该语句检索出来的结果集。存储游标后,可以根据需要滚动浏览其中数据。

游标主要用于交互式应用,用户需要滚动屏幕上的数据。在MySQL游标只能用于存储过程和函数。

游标用DECLARE创建

CREATE PROCEDURE processorders()

BEGIN

DECLARE ordernumbers CURSOR

FOR

SELECT order_num FROM orders;

END;

OPEN CURSOR打开游标,CLOSE CURSOR;关闭游标。在游标被打开后,可以使用FETCH语句分别访问每一行。

CREATE PROCEDURE processorders()

BEGIN

-- Declare local variables//注释

DECLARE o INT;

-- Declare the cursor

DECLARE ordernumbers CURSOR

FOR

SELECT order_num FROM orders;

-- Open the cursor

OPEN ordernumbers;

--Get order number

FETCH ordernumbers INTO o;

--Close the cursor

CLOSE ordernumbers;

END;

触发器

创建触发器,需要给出4条信息:唯一的触发器名;触发器关联的表;触发器应该相应的活动(DELETE INSERT UPDATE);触发器何时执行。

CREATE TRIGGER newproduct AFTER INSERT ON products FOR EACH ROW SELECT 'Product added'//每个成功的插入都会显示Product added消息

只有基表支持触发器,视图不支持。每个表最多6个触发器,INSERT前后,UPDATE前后,DELETE前后。

CREATE TRIGGER newworder AFTER INERT ON orders FOR EACH ROW SELECT NEW.order_num;//NEW表示新插入行

INSERT INTO orders(order_date, cust_id)

VALUES (Now(), 10001);

//输出order_num 20010

DELETE触发器,可以引用OLD的虚拟表,只读不能更新。

UPDATE触发器,可以引用OLD的虚拟表访问以前的值,引用NEW访问新的更新值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值