MySql学习之视图和存储过程(CREATE VIEW 和CREATE PROCEDURE)

一.视图

1.视图是虚拟的表,和普通的数据表不同,视图只包含动态检索的查询。

2.在视图创建以后,可以用与表基本相同的方式处理它们,我们应该是知道的是:
视图仅仅是用来查看存储在别处的数据的一种设施,视图本身不包含数据,因此它们返回的数据是从其他表中检索出来的,其他表的数据发生改变时,视图也会产生相应的改变

3.视图的规则和限制:
1)唯一命名
2)对于可以创建的视图数目没有限制
3)创建视图的前提是具有足够的访问权限
4)视图可以嵌套
5)ORDER BY可以用在视图中,但如果从该视图检索数据SELECT中也含有ORDER BY ,那么该视图中的ORDER BY将被覆盖。
6)视图不能索引,也不能有关联的触发器或默认值
7)视图可以和表一起使用

4.使用视图:
1)视图用CREATE VIEW语句创建
2)使用SHOW CREATE VIEW viewname;来查看创建视图的语句。
3)用DROP删除视图,其语法为DROP VIEW viewname.
4)更新视图时,可以先用DROP再用CERATE,也可以直接使用CREATE OR REPLACE VIEW,如果要更新的视图不存在,则会创建一个视图,如果要更新的视图存在,则替换原有视图。

使用场景:

1.隐藏复杂的SQL,这通常会涉及到联结
例子:

CREATE VIEW productcustomers AS
SELECT cust_name,cust_contact,prod_id
FROM customers,orders,orderitems
WHERE customers.cust_id = order.cust_id
   AND orderitems.order_num=order.order_num;

这条语句的意思是创建一个名为productcustomers的视图,后面的查询语句构成了这个视图。

之后我们就可以用这个视图方便的查询信息了:

SELECT cust_name,cust_contact
FROM productcustomers
WHERE prod_id='TNT2';

可以看出视图在很大程度上简化了SQL语句,利用视图,我们可以一次编写,多次使用。

2.用视图重新格式化检索出的数据
例如:

CREATE VIEW vendorlocations AS
SELECT Concant(RTrim(vend_name),'(',RTRIM(vend_country),')')
        AS vend_title
FROM vendors
ORDER BY vend_name;

然后我们可以使用这个视图:

SELECT * FROM vendorlocations;

3.用视图过滤不想要的数据
例如:

CRATE VIEW customeremaillist AS
SELECT cust_id,cust_name,cust_email
FROM customers
WHERE cust_email IS NOT NULL;

然后使用查询语句来查询:

SELECT * FROM customeremaillist;

4.使用视图和计算字段

CREATE VIEW orderitemsexpanded AS
SELECT order_num,
       prod_id,
       quantity,
       item_price,
       quantity*item_price AS expanded_price
FROM orderitems;

然后使用它:

SELECT * FROM orderitemsexpanded WHERE order_num=2005;

5.更新视图
前面的视图都是用SELECT语句来使用的,难道我们仅仅只限于查询视图吗?
当然不是:
视图是可更新的(我们可以用INSERT,UPDATE,DELETE),然而我们要注意,更新一个视图将更新其基表,实际上我们对视图的操作实质就是对基表的操作。

但是,更新也是有条件的,如果视图定义中有以下操作,则不能更新视图:

分组(使用GROUP BY和HAVING)
联结
子查询

聚集函数
DISTINCT
导出

总结:视图就是一张虚拟的表,它将多张表中的数据检索组成一张新的表来简化我们的SQL语句的编写。

二.存储过程(存储过程编程在workbench编写方便点)

1.定义: 简单来说,存储过程就是为以后的使用而保存的一条或多条MySql语句的集合。

2.为什么要用它:
1)通过把处理封装在容易使用的单元中,简化复杂的操作。
2)如果所有开发人员和应用程序都使用同一存储过程,则出错的可能性就很小。
3)简化对变动的管理。
4)提高性能
5)存在一些只能用在单个请求的MySQL元素和特性,存储过程可以使用它们来编写功能更强大的代码。

简单来说就是:简单,安全,高性能,但对编程人员的素质要求很高。

3.执行存储过程
例子:

CALL productpricing(
@pricelow,
@pricehigh,
@priceaverage);

其中执行名为productpricing的存储过程,它计算并返回产品的最低,最高和平均价格。

4.创建存储过程
例子:

CREATE PROCEDURE productpricing()
BEGIN
   SELECT Avg(prod_price) AS priceaverage
   FROM products;
END;

上面创建的存储过程名为productpricing,如果存储过程要接受参数,我们可以在()中列举出来,
此存储过程没有参数,但我们仍然需要(),BEGIN和END语句用来限定存储过程体,过程体本身是一个简单的SELECT语句。

那么如何使用上面创建的存储过程呢:

CALL productpricing();

上面语句是返回存储过程查询的结果,我们可以看出存储过程实际上是一个函数。

5.删除存储过程
例子:

DROP PROCEDURE productpricing;

6.带参数的存储过程
创建:

CREATE PROCEDURE productpricing(
    OUT pl DECIMAL(8,2),
    OUT ph DECIMAL(8,2).
    OUT pa DECIMAL(8,2)
    )
BEGIN
   SELECT Min(prod_price)
   INTO pl
   FROM products;
   
   SELECT Max(prod_price)
   INTO ph
   FROM products;
   
   SELECT Avg(prod_price)
   INTO pa
   FROM products
END;

此存储过程接受三个参数:pl存储产品最低价格,ph存储产品最高价格,pa存储产品平均价格,每个参数必须具有指定的类型,这里使用的是十进制,关键子OUT指出相应的参数用来从存储过程传出一个值返回给调用者,关键字IN是传递给存储过程,(INOUT是传入和传出),INTO将查询到的值保存到参数中。

调用:

CALL productpricing(
 @pricelow,
@pricehigh,
@priceaverage);

调用时,这条语句并不显示任何数据,它返回以后可以显示的变量。

为了显示我们可以:

SELECT @priceaverage;
SELECT @pricehigh,@pricelow,@priceaverage;

7.建立智能存储过程
目前为止,上面的存储过程基本上都是封装MySQL简单的SELECT语句,只有在存储过程内包含业务规则和智能处理时,它们的威力才真正显示出来(sql编程)
例子:

CREATE PROCEDURE odertotal(  //创建一个名为odertotal的存储过程
   IN onumber INT,   //输入参数onumber,int型
   IN taxable BOOLEAN,//输入参数taxable,布尔类型
   OUT ototal DECIMAL(8,2)//输出参数总长8位,小数为2位的 数
  )COMMENT 'Obtain order total,optionally adding tax'//他不是必须的,但给出将在SHOW PROCEDURE STATUS的结果中显示

 BEGIN//过程体开始标记
   DECLARE total DECIMAL(8,2);//DECLARE语句定义局部变量total
   DECLARE taxrate INT DEFAULT 6;//定义局部变量taxrate,默认值为6

/*
在orderitems表中查找到符合查询的值赋给total
*/
   SELECT Sum(item_price*quaintity)
   FROM orderitems
   WHERE order_num = onumber
   INTO total;

/*
IF语句检查taxable是否为真,如果为真,则执行下面的SELECT语句,
最后用下面的SELECT语句将total复制到输出变量ototal中
*/
   IF taxable THEN
      SELECT total+(total/100*taxrate) INTO tatal;
   END IF;
   SELECT total INTO ototal;
END;//过程体结束标记

显然上面的代码可以成为一个函数了,我们可以用这个函数来进行相关的查询:

CALL ordertotal(20005,1,@total);
SELECT @total;

8.检查存储过程

为显示用来创建一个存储过程的CREATE语句,使用SHOW CREATE PROCEDURE:

SHOW CREATE PROCEDURE ordertotal;

也可以用:

SHOW PROCEDURE STATUS LIKE 'ordertotal';

学习总结自:《MySQL必知必会》

猜你喜欢

转载自blog.csdn.net/c1776167012/article/details/108514051
今日推荐