第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显示版本信息然后退出。