MySQL必知必会—概念篇mysql
MySQL必知必会—检索数据篇github
MySQL必知必会—表操做篇segmentfault
视图仅仅是用来查看存储在别处的数据的一种设施,自己不包含数据,返回的数据都是从其余表中检索出来的,视图能更改数据格式和表示,最多见的应用就是重用 SQL 语句,简化复杂的 SQL 操做。安全
CREATE VIEW 建立视图服务器
SHOW CREATE VIEW viewname 查看建立视图的语句函数
DROP VIEW viewname 删除视图性能
更新视图时,能够先 DROP 而后再 CREATE 或者使用 CREATE OR REPLACE VIEW
### 以前有用联表查询 prod_id 是 TNT2的购买用户信息,可是若是还想看 prod_id 是其余值的时,还得从新查一遍,这样的场景就能用到视图了。 ### 建立一个包含 cust_name, cust_contact, prod_id 的视图 CREATE VIEW productcustomers AS SELECT cust_name, cust_contact, prod_id FROM customers, orders, orderitems WHERE customers.cust_id = orders.cust_id AND orderitems.order_num = orders.order_num; ### 如今就能看到 productcustomers 视图能查询的信息了 select * from productcustomers; +----------------+--------------+---------+ | cust_name | cust_contact | prod_id | +----------------+--------------+---------+ | Coyote Inc. | Y Lee | ANV01 | | Coyote Inc. | Y Lee | ANV02 | | Coyote Inc. | Y Lee | TNT2 | | Coyote Inc. | Y Lee | FB | | Coyote Inc. | Y Lee | FB | | Coyote Inc. | Y Lee | OL1 | | Coyote Inc. | Y Lee | SLING | | Coyote Inc. | Y Lee | ANV03 | | Wascals | Jim Jones | JP2000 | | Yosemite Place | Y Sam | TNT2 | | E Fudd | E Fudd | FC | +----------------+--------------+---------+ ### 若是想再查询出 prod_id 为 TNT2 的客户信息就很简单了 SELECT cust_name, cust_contact FROM productcustomers WHERE prod_id = 'TNT2'; +----------------+--------------+ | cust_name | cust_contact | +----------------+--------------+ | Coyote Inc. | Y Lee | | Yosemite Place | Y Sam | +----------------+--------------+
使用存储过程主要有三个好处,简单,安全,高性能。
MySQL 称存储过程的执行为调用,所以 MySQL 执行存储过程的语句为 CALL。CALL 接受存储过程的名字以及须要传递给它的任意参数。
### 建立名为 productpricing 的存储过程 若是存储过程接受参数,它们将在 productpricing () 这个括号中列举出来。 DELIMITER // CREATE PROCEDURE productpricing() BEGIN SELECT Avg(prod_price) AS priceaverage FROM products; END// ### 调用存储过程,仿佛在调用函数 CALL productpricing; +--------------+ | priceaverage | +--------------+ | 16.133571 | +--------------+ ### 删除存储过程 DROP PROCEDURE productpricing; ### 检查存储过程 SHOW CREATE PROCEDURE productpricing;
### 建立存储过程 DELIMITER // 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 // ### 调用存储过程 CALL productpricing(@pricelow,@pricehigh,@priceaverage); ### 查看3个变量 SELECT @pricelow,@pricehigh,@priceaverage; +-----------+------------+---------------+ | @pricelow | @pricehigh | @priceaverage | +-----------+------------+---------------+ | 2.50 | 55.00 | 16.13 | +-----------+------------+---------------+
须要获取订单合计,而且对某些顾客的合计增长营业税。
### 存储过程全过程 DELIMITER // -- Name: ordertotal -- Parameters: onumber = order number -- taxable = 0 if not taxable, 1 if taxable -- ototal = order total variable CREATE PROCEDURE ordertotal ( IN onumber INT, IN taxable BOOLEAN, OUT ototal DECIMAL(8,2) ) COMMENT 'Obtain order total, optionally adding tax' BEGIN -- Declare variable for total DECLARE total DECIMAL(8,2); -- Declare tax percentage DECLARE taxrate INT DEFAULT 6; -- Get the order total SELECT Sum(item_price*quantity) FROM orderitems WHERE order_num = onumber INTO total; -- Is this taxable IF taxable THEN -- Yes, so add taxrate to the total SELECT total+(total/100*taxrate) INTO total; END IF; -- And finally, save to out variable SELECT total INTO ototal; END // ### 调用,看一下 order number 是 20005 订单关于加不加营业税的区别 ### 不加营业税 CALL ordertotal(20005, 0, @total); SELECT @total; +--------+ | @total | +--------+ | 149.87 | +--------+ ### 加营业税 CALL ordertotal(20005, 1, @total); SELECT @total; +--------+ | @total | +--------+ | 158.86 | +--------+
上面代码中作些必要的解释
--
添加注释,在存储过程复杂是,注释颇有必要。DECLARE
定义局部变量,须要指定变量名和数据类型,支持可选的默认值COMMENT
关键字,不是必需的,若是添加了,在 SHOW PROCEDURE STATUS 的结果中显示。SHOW PROCEDURE STATUS
能够列出全部存储过程,也能够使用 LIKE 指定一个过滤模式: SHOW PROCEDURE STATUS LIKE 'ordertotal';
一个持续更新的github笔记,连接地址:Front-End-Basics,能够watch,也能够star。
此篇文章的地址:MySql必知必会