mysql高级特性

bytemode · 2019-12-25 20:32:28 · 988 次点击 · 预计阅读时间 5 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2019-12-25 20:32:28 的文章,其中的信息可能已经有所发展或是发生改变。

视图

视图是虚拟的表,本身不存储数据,而是按照指定的方式进行查询,只包含使用时动态索引数据的查询。

作用

  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

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