SELECT必知必会_引擎,PROCEDURE,事务处理
书接上文,之前说了Mysql的SELECT部分,本片文章会重点介绍关于MySql的其他一些知识,也会是MySql必知必会的最后一篇。
首先,是Mysql中的增删改操作,对于测试岗来说,这部分知识相对来说不是那么重要,我一次性把一些基础部分贴一下。
1.INSERT
INSERT into table(id,name,small_name,age,sex)
values(1,'aa','bb',NULL.NULL) 插入一整行数据
values(......) 插入多行,多个values,只需要一个INSERT
INSERT INTO table(a,b,c)
SELECT (a,b,c)
FROM table_01 将所选数据导入table表
2.UPDATE
UPDATE table
SET name='aa',age=24
WHERE id ='1';
3.DELETE
DELETE FROM table
WHERE id =1;
4.CREATE
CREATE TABLE table_name(
id int NOT NULL AUTO_INCREMENT, 代表本列每新增一行,自动增加1
name char(10) NOT NULL , char是定长,varchar是不定长
sex char(4) NOT NULL,
PRIMARY KEY (id) 主键值必须唯一,如果使用多个列,则这些列的组合必须唯一
)
ENGINE = XXX引擎;
如果id不设置AUTO_INCREMENT的话,那就是用SLEECT COUNT然后再加以,这样浪费时间和资源。
同时,若有多个用户同时对表进行增加操作可能会出问题。
5.修改表
ALTER TABLE table_01 ALTER TABLE常用来定义外键
ADD name VARCHAR(50)
FOREIGN KEY (aaa) REFERENCE xxx(aaa)
一个表创建好之后最好轻易不要改动,除非增加外键
6.删除/重命名 表
DROP TABLE aaa;
RENAME TABLE aaa to bbb;
引擎
使用CREATE的时候,调用引擎创建表,在执行SELECT等操作时,该引擎会帮忙处理请求
不同的引擎有不同的特性
三种引擎:
InnoDB 可靠事务处理引擎,不支持全文本搜索 (事务处理:成批量的操作删除等等)
MEMORY 数据存在内存里,速度快,适用于临时表
MyISAM 性能高,支持全文本搜索,不支持事务处理
存储过程(PROCEDURE)
很多时候,实际中的处理过程,一条SQL语句完全无法满足要求,比如一个订单,要能正确处理,首先要保证库存中有货,其次有货的话要预定,确保这个物品不会重复售卖,订单成功后商品数量要减少,库存中没有物品要及时订货。
以上的情况是需要多条SQL语句来完成整个步骤的。多条SQL语句的组合,这就是存储过程。
存储过程一半是要比一条一条的执行其中的每条sql语句更快的。
创建存储过程:
CREATE PROCEDURE aa 创建一个叫aa的存储过程
BEGIN
SELECT **
WHERE ...;
END;
调用存储过程:
CALL aa(); 调用存储过程aa
删除存储过程:
DROP PROCEDURE aa;
存储过程也可以传参:
游标
在 MySQL 中,存储过程或函数中的查询有时会返回多条记录,而使用简单的 SELECT 语句,没有办法得到第一行、下一行或前十行的数据,这时可以使用游标来逐条读取查询结果集中的记录。游标在部分资料中也被称为光标。
CREATE PROCEDURE aa()
BEGIN
DECLARE ordernum CURSOR
FOR 为下面的SELECT定义一个游标,游标是被该SELECT检索出来的结果集
SELECT....
END;
OPEN/CLOSE ordernum; //打开,关闭游标
触发器
触发器是响应INSERT/DELETE/UPDATE后而自动触发的一条SQL语句,可以与PROCEDURE结合在一起
CREATE TRIGGER XXX AFTER/BEFORE INSERT ON product
FOR EACH ROW SELECT… 每一行都要执行操作
触发器不能更新或者覆盖,要更新,必须删了重新创建
DROP TRIGGER
事务处理
事务处理是一种机制。用来管理必须成批执行的SQL操作,确保不会在所有的操作执行完成前有中断操作。若整组sql无问题那就执行到底,若中间出错则会执行相应的回退。
前面说过两个引擎,MYISAM不支持事务处理,InnoDB支持
START TRANSACTION
SELECT...
DELETE..
UPDATE..
ROLLBACK; 回退START到ROLLBACK之间的所有语句
可以把ROLLBACK换成COMMIT,如果语句都执行成功,COMMIT不生效,如果中间有句子执行报错,ROLLBACK会自动执行回滚功能
用户权限分配
CREATE USER shaoqiang;
GRANT SELECT ON database_aa TO shaoqiang; 给用户database_aa下所有表的查询权限
SHOW GRANTS FOR shaoqiang; 查询权限
REVOKE SELECT ON database_aa TO shaoqiang; 撤销权限