一.视图
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必知必会》