mysql高级特性

bytemode · · 846 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

## 视图 视图是虚拟的表,本身不存储数据,而是按照指定的方式进行查询,只包含使用时动态索引数据的查询。 ### 作用 1. 重用sql语句 2. 简化复杂的sql操作 3. 使用表的组成部分而不是整个表 4. 保护数据 5. 更改数据格式和表示 ### 原则 1. 与表名一样视图必须唯一命名 2. 数目没有限制视图可以嵌套 3. ORDER BY可能会被selcect中的覆盖 4. 不能索引不能关联触发器和默认值 5. 可以和表一起使用 ### 使用流程 1. CREATE VIEW 创建 2. DROP VIEW viewname 删除 3. SHOW CREATE VIEWW viewname 查看创建语句 4. CREATE OR REPLACE VIEW 删除并且创建 ``` //创建视图 CREATE VIEW productcustomers AS SELECT cust_name, cust_contact, prod_id FROM customers, orders, orderitems WHERE customers.cust_id = irders.cust_id AND orderitems.order_num = orders.order_num; //从视图索引数据 SELECT cust_name FROM productcustomers WHERE prod_id = 'TNT2'; //使用视图格式化数据 CREATE VIEW fmtlocation AS SELECT Concat(RTrim(vend_name), '(', RTim(vend_country) ,')') AS vend_tittle FROM vendors; SELECT * FROM fmtlocation; //使用视图过滤数据 CREATE VIEW customemil AS SELECT cust_id, cust_name, cust_email FROM customers WHERE cust_email IS NOT NULL; //使用视图作为计算字段 CREATE VIEW expanded AS SELECT order_num,id,name, count, price, count*price AS expand FROM orders; SELECT * FROM expanded WHERE order_num = 2005; ``` ### 视图更新 视图中有分组GROUP BY HAVING、链接、子查询、并、集聚函数、DISTINCT、导出列则不能更新视图,视图主要用于数据检索。 ## 存储过程 存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合。 通过把处理封装在容易使用的单元中,简化复杂的操作。提高性能。因为使用存储过程比使用单独的SQL语句要快。 OUT指定参数有存储存储过程的查询输出,IN指定存储过程的输入,BEGIN END包含多条查询语句,CALL执行存储过程。 INTO 将结果放入OUT参数中返回。 ``` //创建存储过程 CREATE PROCEDURE productpro( IN number INT, OUT p1 DECIMAL(8, 2), OUT ph DECIMAL(8, 2), OUT pa DECIMAL(8, 2), OUT total DECIMAL(8, 2), ) BEGIN SELECT Min(prod_price) INTO p1 FROM products; SELECT Max(prod_price) INTO ph FROM products; SELECT Avg(prod_price) INTO p1 FROM products; SELECT Sum(item_price*quantity) FROM orderitems WHERE order_num = number INTO total; END; //调用存储过程 CALL productpro(20, @pricemin, @pricemax, @priceavg, @total) //检索结果 SELECT @pricemin, @pricemax, @priceavg, @total; //显示创建详情 SHOE CREATE PROCEDURE productpro; //删除存储过程 DROP PROCEDURE productpro; ``` ## 游标 游标(cursor)是一个存储在MySQL服务器上的数据库查询,它不是一条SELECT语句,而是被该语句检索出来的结果集。在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据。 MySQL游标只能用于存储过程(和函数) ``` //DECLARE CURSOR 创建游标, 存储过程处理完后有效小时 CREATE PROCEDURE processorders() BEGIN DECLARE ordernumbers CURSOR FOR SELECT order_num FROM orders; DECLARE o INT; //在处理OPEN语句时执行查询,存储检索出的数据以供浏览和滚动 OPEN ordernumbers; //在一个游标被打开后,可以使用FETCH语句分别访问它的每一行 //它还向前移动游标中的内部行指针,使下一条FETCH语句检索下一行 FETCH ordernumbers INTO o; //游标处理完成后,应当使用如下语句关闭游标 CLOSE ordernumbers; END; ``` ## 触发器 触发器是MySQL响应以下任意语句而自动执行的一条MySQL语句(或位于BEGIN和END语句之间的一组语句):DELETE 、INSERT、UPDATE。 只有表才支持触发器,视图不支持 ``` //创建触发器 CREATE TRIGGER newproduct AFTER INSERT ON products FOR EACH ROW SELECT 'product added';// 触发器将在INSERT语句执行成功后 对每行插入都显示一条文本消息 //在INSERT触发器代码内,可引用一个名为NEW的虚拟表,访问被插入的行; CREATE TRIGGER neworder AFTER INSERT ON orders FOR EACH ROW SELECT NEW.order_num;//触发器返回插入行的order_num //在DELETE触发器代码内,你可以引用一个名为OLD的虚拟表,访问被删除的行; //删除之前将删除的值放入另外一个表 CREATE TRIGGER delleteorder BEFORE DELETE ON orders FOR EACH ROW BEGIN INSERT INTO archive_orders(order_num, order_date, cust_id) VALUES(OLD.order_num, OLD.order_date, OLD.cust_id); END //在UPDATE触发器代码中,你可以引用一个名为OLD的虚拟表访问以前(UPDATE语句前)的值,引用一个名为NEW的虚拟表访问新更新的值,old是readonly CREATE TRIGGER uodateorder BEFORE UPDATE ON orders FOR EACH ROW SET NEW.order_state = Upper(NEW.order_state);//触发器返回插入行的order_num //删除触发器 DROP TRIGGER newproduct; ``` ## 事务 事务处理是一种机制,用来管理必须成批执行的MySQL操作,以保证数据库不包含不完整的操作结果。利用事务处理,可以保证一组操作不会中途停止,它们或者作为整体执行,或者完全不执行(除非明确示)。如果没有错误发生,整组语句提交给(写到)数据库表。如果发生错误,则进行回退(撤销)以恢复数据库到某个已知且安全的状态。 默认的MySQL行为是自动提交所有更改。换句话说,任何时候你执行一条MySQL语句,该语句实际上都是针对表执行的,而且所做的更改立即生效 ``` SET autocommit = 0; //不自动提交 START TRANSACTION; DELECT FROM orders; SELECT * FROM orders; ROLLBACK; //当COMMIT或ROLLBACK语句执行后,事务会自动关闭 START TRANSACTION; DELECT FROM orders; SELECT * FROM orders; COMMIT; SAVEPOINT delete1; //保留点保留点在事务处理完成(执行一条ROLLBACK或COMMIT)后自动释放 DELECT FROM orders; ROLLBACK TO delete1; ```

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

846 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传