第23章 使用存储过程 (粗略了解了存储过程,并没有深入理解)
23.1 存储过程
并非所有操作都和这本书之前介绍的那么简单,有些操作会比较复杂,因此需要将先插到的存起来,以供以后的语句使用。
23.2 为什么使用存储过程
简单(只用操作存储过程的数据即可)、安全(只需更改存储过程的数据即可)、高性能(使用存储过程比单独的SQL语句快)。缺点是存储过程的编写比基本SQL语句复杂,并且用户一般只能使用,但不允许创建存储过程。
23.3 使用存储过程
23.1 执行存储过程
CALL 是执行语句
CALL prductpricing(@pricelow, @pricehigh, @priceaverage); //执行这个prductpricing存储过程,其中有三个过程,计算并返回最低、最高和平均价格
23.2 创建存储过程
CREATE PROCEDURE productpricing() BEGIN SELECT Avg(prod_price) AS priceaverage FROM products; END; //上面的只是创建,使用时的语句如下。只是没有传递具体参数 CALL prductpricing();
23.3 删除存储过程
DROP PROCEDURE productpricing; //如果指定的过程不存在会报错,因此可以这么写 DROP PROCEDURE productpricing IF EXISTS;
23.4 使用参数
CREATE PROCEDURE productpricing( OUT p1 DECIMAL(8,2), OUT ph DECIMAL(8,2), OUT pa 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 pa FROM products; END; //三个参数,p1,ph,pa //调用,并重新指定了3个名字 CALL prductpricing(@pricelow, @pricehigh, @priceaverage); //调用后,进行查询。就会显示平均价格 SELECT @priceaverage; SELECT @pricelow, @pricehigh, @priceaverage;//这句话查3个值 //第二个示例 CREATE PROCEDURE productpricing( IN ounumber INT, OUT ototal DECIMAL(8,2) ) BEGIN SELECT Sum(item_price*quantity) FROM orderitems WHERE order_num = onumber INTO ototal; END: //两个参数,一个select语句 //使用过程如下,需要传入两个参数。第一句启动,第二句查询第二个参数的结果 CALL ordertotal(20005,@total); SELECT @total;
23.3.5 建立智能存储过程(功能更强大)
23.3.6 检查存储过程
SHOW CREATE PROCEDURE ordertotal; SHOW PROCEDURE STATUS LIKE 'ordertotal';//可以获得更具体信息
第24章 使用游标 (有理解不到位的地方)
24.1 游标(cursor)
在查出的结果中,想拿到第五行的结果,然后再拿第七行的结果,显然SQL是做不到的,此时就是游标,指向结果。注意,MySQL游标只能用于存储过程(和函数)
24.2 使用游标
24.2.1 创建游标
CREATE PROCEDURE processorders( ) BEGIN DECLARE ordernumbers CURSOR //这句是定义游标 名字是ordernumbers FOR SELECT order_num FROM orders; END:
24.2.2 打开和关闭游标
OPEN ordernumbers; CLOSE ordernumbers; //关闭后,必须打开才能使用。如果不关闭游标,MySQL将达到END时自动关闭
24.2.3 使用游标数据
在游标打开后,使用FETCH语句将游标进行移动。
这里截图了,偷个懒
找到FETCH行,意思是让游标移动到结果是o的地方。
下面是更复杂的示例
语句的大致意思是:创建一个存储过程,声明三个本地变量,声明了一个游标,声明了一个循环操作的结束标志,然后是一个创建表的操作,这个表将保持存储过程生成的结果,然后打开游标,然后进入一个循环过程,在这个循环过程中,游标移动到含有0的那行,然后声明开启存储过程,存储过程的动作是插入数据,然后有一个循环操作的终止判断,然后进行关闭游标的操作。最终END结束。
简言之,在一个存储过程中,又开启了另一个存储过程,然后利用游标能移动,不断的在游标最下面插入数据,循环操作,直到满足条件,退出循环终止。(不知道自己理解是否正确)
第25章 使用触发器
25.1 触发器
达到某个条件时,自动自行某个动作。(一般是删除,插入,更新动作触发)
25.2 创建触发器
用CREATE TRIGGER语句创建触发器。
CREATE TRIGGER newproduct AFTER INSERT ON products FOR EACH ROW SELECT 'Product added'; //指定触发器名字是newproduct,在插入动作后执行,执行时,为每行都执行, //插入的文本将对每个插入的行显示一次
25.3 删除触发器
DROP TRIGGER newproduct;
25.4 使用触发器(本节是通过三种行为,观察触发触发器后的效果,故略)
25.4.1 INSERT触发器
25.4.2 DELETE触发器
比如在delete前,设置一个触发器,将要删除的数据放到其他地方,这样为设计事物的回滚有帮助(我猜的)
25.3 UPDATE触发器
第26章 管理事务处理
26.1 事务处理
MyISAM和InnoDB是两种最常使用的引擎。前者不支持明确的事务处理管理,而后者支持。
事务(transaction)指一组SQL语句;
回退(rollback)指撤销指定SQL语句的过程;
提交(commit)指将未存储的SQL语句结果写入数据库表;
保留点(savepoint)指事务处理中设置的临时占位符(placeholder),你可以对它发布回退(与回退整个事务处理不同)。
26.2 控制事务处理
26.2.1 使用ROLLBACK
A;B;START TRANSACTION;C;D;ROLLBACK;E; //回滚时,CD都取消执行,回到B执行完了的状态
26.2.2 使用COMMIT
一般MySQL都含有隐含提交,但是在事务中不会,只有COMMITt后,才会提交。
26.2.3 使用保留点
更复杂的事务,可能不应该全部回滚,所有此时使用保留点标记。
26.2.4 更改默认的提交行为
SET autocommit = 0; //不自动提交
第27章 全球化和本地化(略)
第28章 安全管理
28.1 访问控制
也即是用户的权限控制
28.2 管理用户
28.2.1 创建用户账号 (CREATER USER + 名字)(重命名是RENAME)
28.2.2 删除用户账号 (DROP USER + 名字)
28.2.3 设置访问权限
SHOW GRANTS FOR + 名字是看权限 GRANTS SELECT ON AA.* TO BB //用户BB有权限看AA数据库的所有数据 REVOKE SELECT ON AA.* FROM BB//撤销你的权限 GRANTS ALL 和REVOKE ALL是整个服务器的授权 ON 库名.* 是库所有数据授权 ON 表名.* 是某个表的授权
28.2.4 更改口令
就是改密码了 SET PASSWORD FOR AA = Password('填要改的密码')
第29章 数据库维护
CHECK TABLE用来针对许多问题对表进行检查。在MyISAM表上还对索引进行检查。ANALYZE TABLE,用来检查表键是否正确。
CHECK TABLE用来针对许多问题对表进行检查。在MyISAM表上还对索引进行检查。
--help显示帮助——一个选项列表;
--safe-mode装载减去某些最佳配置的服务器;
--verbose显示全文本消息(为获得更详细的帮助消息与--help
联合使用);
--version显示版本信息然后退出。