MySQL必知必会知识点整理

文章目录

    • 本文关键字
    • 检索
      • 检索不同的行: DISTINCT
      • 限制结果: LIMIT
    • 排序
      • ORDER BY
      • 排序方向
    • 过滤数据
      • 使用WHERE子句
      • 操作符
      • 组合WHERE子句
      • `IN`操作符
      • `NOT`操作符
    • 用通配符进行过滤
      • `LIKE`操作符
      • 技巧
    • 用正则表达式进行搜索
    • 创建计算字段
      • 拼接
      • 执行算术计算
    • 使用数据处理函数
      • 函数类型
      • 文本处理函数
      • 日期和时间处理函数
      • 数值处理函数
    • 汇总数据
      • 聚集函数
      • 聚集不同值
    • 分组数据
      • 创建分组: GROUP BY
      • 过滤分组: HAVING
      • 分组和排序
      • SELECT子句顺序
    • 使用子查询
      • 利用子查询进行过滤
      • 作为计算字段使用子查询
    • 联结表
      • 联结
      • 创建联结
        • WHERE子句的重要性
        • 内部联结
        • 联结多个表
    • 创建高级联结
      • 使用表别名
      • 自联结
      • 外部联结
    • 组合查询
    • 全文本搜索
      • 启用全文本搜索支持
      • 进行全文本搜索
      • 使用查询扩展
      • 布尔文本搜索
      • 全文本搜索的使用说明
    • 插入数据
      • 插入行
      • 插入多个行
      • 插入检索出的数据
    • 更新和删除数据
      • 更新数据
      • 删除数据
    • 创建和操纵表
      • 创建表
        • 创建
        • 使用NULL值
        • 主键
        • 自增
        • 默认值
        • 引擎类型
      • 更新表
        • 添加列
        • 删除列
        • 添加外键
      • 删除表
      • 重命名表
    • 视图
      • 规则和限制
      • 使用视图
      • 视图的用途
      • 更新视图
    • 存储过程
      • 使用
        • 执行存储过程
        • 创建存储过程
        • 删除存储过程
        • 使用参数
        • 建立智能存储过程
        • 检查存储过程
    • 游标
      • 说明
      • 使用游标
        • 创建游标
        • 打开和关闭有白哦
        • 使用游标数据
    • 触发器
      • 创建触发器
      • 删除触发器
      • 使用触发器
        • INSERT触发器
        • DELETE触发器
        • UPDATE触发器
    • 管理事务处理
      • 事务处理术语
      • 控制事务处理
        • 使用ROLLBACK
        • 使用COMMIT
        • 使用保留点
        • 更改默认的提交行为
    • 全球化和本地化
    • 安全管理
      • 管理用户
        • 创建用户账号
        • 删除用户账号
        • 设置访问权限
        • 更改口令
    • 数据库维护
      • 备份数据
      • 进行数据库维护
      • 诊断启动问题
      • 查看日志文件
    • 改善性能

本文关键字

  • MySQL
  • 入门
  • 笔记
  • 手册
  • 参考

检索

检索不同的行: DISTINCT

  • 使用: SELECT DISTINCT vend_id FROM products;
  • 此关键字指定MySQL只返回不同的值
  • 必须直接放在列名的前面
  • 不能部分使用DISTINCT, 会作用到所有的列

限制结果: LIMIT

  • 使用: SELECT prod_name FROM products LIMIT 5;
  • LIMIT 5指定MySQL返回不多于5行
  • 可以有两个参数, 如: LIMIT 5, 5指示MySQL返回从行5(包括)开始的5行, 第一个数为开始位置, 第二个数为要检索的行数
  • MySQL的行从0开始
  • LIMIT 5 OFFSET 5等同于 LIMIT 5, 5

排序

ORDER BY

  • 使用: SELECT prod_name FROM products ORDER BY prod_name;
  • 可以是多个列, 逗号隔开

排序方向

  • 默认为升序 ASC
  • DESC 降序
  • 可以对多个列指定不同的排序方向: ORDER BY prod_price DESC, prod_name;
  • LIMIT 1结合可以找出一个列中最高或最低的值, ORDER BY prod_price LIMIT 1;
  • 在字典排序中, A被视为与a相同, 这是MySQL的默认行为, 可以设置

过滤数据

使用WHERE子句

  • 使用: SELECT * from products WHERE prod_price = 2.50;
  • 返回符合WHERE子句条件的数据
  • ORDER BY需要放在WHERE之后

操作符

  • 所有操作符: =等于, <>or!=不等于, <小于, <=小于等于, >大于, >=大于等于, BETWEEN在指定的两个值之间(包括两个值)
  • 范围值检查, BETWEEN用法如下: SELECT prod_price FROM products WHERE BETWEEN 5 AND 10;
  • 空值检查: SELECT prod_name FROM products WHERE prod_price IS NULL;

组合WHERE子句

  • 操作符: 用来联结或改变WHERE子句中的关键字, 也成为逻辑操作符
  • AND操作符:
    • 检索满足所有给定条件的行
      • 使用`WHERE vend_id = 1003 AND prod_price <= 10;
    • OR操作符:
      • 检索匹配任一条件的行
      • 使用同AND
  • 计算次序: 优先处理AND和圆括号

IN操作符

  • WHERE vend_id IN (1002, 1003)
  • WHERE vend_id = 1002 OR vend_id = 1003
  • 更简洁直观, 执行比OR更快

NOT操作符

  • 否定它之后所跟的任何条件
  • WHERE vend_id NOT IN (1002, 1003)

用通配符进行过滤

LIKE操作符

  • 通配符
    • 用来匹配值的一部分的特殊字符, 要使用通配符必须使用LIKE
    • %:
      • 任何字符出现任意次数(除了NULL)
        • WHERE prod_name LIKE 'jet%';
    • _:
      • 任何字符出现一次

技巧

  • 少用
  • 效率低, 如果可以, 使用其它方式代替
  • 放在搜索模式的开始处是最慢的

用正则表达式进行搜索

  • LIKE的区别: 除非LIKE中使用通配符, 否则是完全匹配, 正则中则是包含
  • 使用: WHERE prod_name REGEXP '1000', 匹配所有包含1000的值
  • 默认不区分大小写, 可使用BINARY关键字: WHERE prod_name REGEXP BINARY 'Jet'
  • 测试是否匹配: SELECT 'hello' REGEXP '[0-9]';, 返回0(没有匹配), 若匹配则返回1
  • |: OR匹配, [多个字符]: 匹配其中之一, [0-9]: 匹配范围, 等同于[0123456789], \\: 转义, ^表达式$: 开始和结束, 完全匹配, 还有, 不一一列举了

创建计算字段

计算字段并不实际存在于数据库表中, 计算字段是运行时在SELECT语句内创建的

拼接

  • SELECT Concat(vend_name), ' (', vend_country. ')') AS vend_title FROM vendors;
  • Concat: 拼接串, 需要一个或多个指定的串, 各个串之间用逗号分隔
  • AS: 使用vend_title作为字段别名, 同样可以用来重命名字段

执行算术计算

  • SELECT quantity*item_price AS expanded_price FROM orderitems;
  • 算术操作符: + - * /
  • 测试用: SELECT 3*2; => 返回6, 省略了FROM

使用数据处理函数

函数没有SQL的可移植性强, 但可以提高编码效率, 使用函数需做好代码注释

函数类型

  • 用于处理文本串的文本函数
  • 用于在数值数据上进行算术操作的数值函数
  • 用于处理日期和时间并从这些值中提取特定成分的日期和时间函数
  • 返回DBMS正使用的特殊信息的系统函数

下面列出常用的函数

文本处理函数

  • Left(): 返回串左边的字符
  • Length(): 返回串的长度
  • Locate(): 找出串的一个子串
  • Lower(): 将串转换为小写
  • LTrim(): 去掉串左边的空格
  • Right(): 返回串右边的字符
  • RTrim(): 去掉串右边的空格
  • Soundex(): 返回串的SOUNDEX值(同音值)
  • SubString(): 返回子串的字符
  • Upper(): 将串转换为大写

日期和时间处理函数

  • 无论什么时候指定一个日期, 不管是插入或更新表值还是用WHERE子句进行过滤, 日期必须为格式yyyy-mm-dd
  • WHERE Date(order_data) = '2005-09-01';
  • 检索2005年9月下的所有订单: `SELECT cust_id, order_num FROM orders WHERE orders WHERE Year(order_date) = 2005 AND Month(order_date) = 9;

数值处理函数

  • Abs(): 返回一个数的绝对值
  • Cos(): 返回一个角度的余弦
  • Exp(): 返回一个数的指数值
  • Mod(): 返回除操作的余数
  • Pi(): 返回圆周率
  • Rand(): 返回一个随机数
  • Sin(): 返回一个角度的正弦
  • Sqrt(): 返回一个数的平方根
  • Tan(): 返回一个角度的正切

汇总数据

聚集函数

运行在行组上, 计算和返回单个值的函数(高效)
利用标准的算术操作符, 所有聚集函数都可用来执行多个列上的计算

  • AVG(): 返回某列的平均值, 忽略列值为NULL的行
  • COUNT(): 返回某列的行数, COUNT(*)对表中所有行(包含NULL)计数, COUNT(列名)忽略NULL
  • MAX(): 返回某列的最大值, 忽略列值为NULL的行, 用于文本数据时, 如果数据按相应的列排序则返回最后一行
  • MIN(): 返回某列的最小值, 忽略列值为NULL的行, 用于文本数据时, 如果数据按相应的列排序则返回最前面的行
  • SUM(): 返回某列值之和, 也可以用于合计计算值, 如: SUM(item_price*quantity)

聚集不同值

  • ALL: 默认
  • DISTINCT:
    • 只考虑不同的值
    • 使用: AVG(DISTINCT prod_price)

分组数据

创建分组: GROUP BY

  • SELECT vend_id, COUNT(*) AS num_prods FROM products GROUP BY vend_id [WITH ROLLUP];
  • 上面的例子按vend_id分组并计算每个分组的行数
  • []代表可选
  • 使用WITH ROLLUP可以得到每个分组一集每个分组汇总级别的值

过滤分组: HAVING

  • 使用: SELECT cust_id, COUNT(*) AS orders FROM orders GROUP BY cust_id HAVING COUNT(*) >= 2;
  • HAVING支持所有WHERE操作符: 通配符等
  • WHERE在数据分组前进行过滤, HAVING在数据分组后进行过滤
  • 同时使用WHEREHAVING: SELECT vend_id, COUNT(*) AS num_prods FROM products WHERE prod_price >= 10 GROUP BY vend_id HAVING COUNT(*) >= 2;

分组和排序

  • 区别
    ORDER BY | GROUP BY
    —|---
    排序产生的输出 | 分组行, 但输出可能不是分组的顺序
    任意列都可以使用 | 只可能使用选择列或表达式列, 而且必须使用每个选择列表达式
    不一定需要 | 如果与聚集函数一起使用列(或表达式), 则必须使用
  • ORDER BY子句加在后面进行排序

SELECT子句顺序

子句 说明 是否必须使用
SELECT 要返回的列或表达式
FROM 从中检索数据的表 仅在从表选择数据时使用
WHERE 行级过滤
GROUP BY 分组说明
HAVING 组级过滤
ORDER BY 输出排序顺序
LIMIT 要检索的行输

使用子查询

子查询最常用的使用是在WHERE子句和IN操作符中, 以及用来填充计算列

利用子查询进行过滤

  • SELECT cust_id FROM orders WHERE order_num IN (子查询语句);
  • 在SELECT语句中, 子查询总是从内向外处理
  • 列必须匹配

作为计算字段使用子查询

  • SELECT cust_name, cust_state, (相关子查询) AS orders FROM customers ORDER BY cust_name;
  • 相关子查询: 涉及外部查询的子查询
  • 列名可能有多义性就必须使用完全限定列名: 表名.列名

联结表

联结

  • 主键: 可以是ID或任何其他唯一值
  • 外键: 为某个表中的一列, 它包含另一个表的主键值, 定义了两个表之间的关系
  • 维护引用完整性: 仅在关系列中插入合法的数据
  • 使用联结表的好处:
    • 信息不重复, 不浪费时间和空间
    • 如果信息改动, 可以只更新单个记录, 相关表中的数据不用改动
    • 处理数据更简单

创建联结

WHERE子句的重要性

  • 例子: SELECT vend_name, prod_name, prod_price FROM vendors, products WHERE vendors.vend_id = products.vend_id ORDER BY vend_name, prod_name;
  • vend_name 和另外两个列在不同的表中, 使用正确的WHERE子句联结了两个表

内部联结

  • 使用INNER JOIN
  • 例子: SELECT vend_name, prod_name, prod_price FROM vendors INNER JOIN products ON vendors.vend_id = products.vend_id;
  • 效果同使用WHERE子句联结
  • ANSI SQL规范首选INNER JOIN语法

联结多个表

  • SQL对一条SELECT语句中可以联结的表的数目没有限制
  • 联结的表越多性能越差

创建高级联结

使用表别名

  • 缩短SQL语句
  • 允许在单条SELECT语句中多次使用相同的表

自联结

  • 在单条SELECT语句中多次使用相同的表
  • 使用子查询实现
  • 使用表别名实现: WHERE p1.vend_id = p2.vend_id;

外部联结

  • 使用LEFT OUTER JOIN
  • 联结包含了那些在相关表中没有关联行的行
  • 必须使用RIGHT或LEFT关键字指定包括其所有行的表, OUTER JOIN左边或右边的表

组合查询

  • 将多个查询(可以是不同的表查询)的结果作为单个查询结果集返回
  • 使用UNION关键字联结两个以上的查询
  • UNION规则:
    • 必须由两条或两条以上的SELECT语句组成
    • 每个查询必须包含相同的列、表达式或聚集函数, 次序可以不同
    • 列数据类型必须兼容
  • 默认返回的结果取消了重复的行, 使用UNION ALL包含重复的行
  • 对组合查询结果排序: 只能在最后一个查询使用一条ORDER BY子句

全文本搜索

启用全文本搜索支持

  • 在CREATE语句中使用FULLTEXT子句: FULLTEXT(note_text)
  • 定义之后, MySQL自动维护该索引, 在操作行时索引随之自动更新
  • 不要在导入数据时使用FULLTEXT, 太花时间

进行全文本搜索

  • 使用Match()和Against()执行全文本搜索, Match()指定被搜索的列, Against()指定要使用的搜索表达式
  • 例子: SELECT note_text FROM productnotes WHERE Match(note_text) Against('rabbit');
  • Match(): 传递的值必须与FULLTEXT()定义中的相同, 可指定多个列, 次序要正确
  • 搜索不区分大小写
  • 对结果进行了排序, 具有较高等级的行先返回
  • 排序多个搜索项, 包含多个匹配词则等级高
  • 由于数据是索引的, 全文本搜索相当快

使用查询扩展

  • 使用: Against('anvils' WITH QUERY EXPANSION)
  • 查询过程: 找出与搜索条件匹配的行 -> 选择匹配行中所有有用的词 -> 再次进行全文本搜索
  • 能找出可能相关的结果
  • 行越多返回的结果越好

布尔文本搜索

  • 即使没有FULLTEXT索引也可以使用, 但是操作非常缓慢
  • 细节:
    • 要匹配的词
    • 要排斥的词
    • 排列提示(指定某些词比其他词等级更高)
    • 表达式分组
  • 包含heavy但不包含任意以rope开始的词的行: Against('heavy -rope*' IN BOOLEAN MODE);
  • 支持的所有布尔操作符:
布尔操作符 说明
+ 包含, 词必须存在
- 排除, 词必须不出现
> 包含, 而且增加等级制
< 包含, 且减少等级值
() 把词组成子表达式(允许这些子表达式作为一个组被包含、排除、排列等)
~ 取消一个词的排序值
* 词尾的通配符
“” 定义一个短语(与单个词的列表不一样, 它匹配整个短语以便包含或排除这个短语)

全文本搜索的使用说明

  • 在索引全文本数据时, 具有3个或3个一下字符的词(可更改)被忽略
  • MySQL带有一个内建的非用词表(可覆盖), 索引时被忽略
  • 一个词出现在50%以上的行中, 则将它作为一个非用词忽略, 不用于IN BOOLEAN MODE
  • 如果表中的行数少于3行, 则不返回结果
  • 忽略词中的单引号: don’t => dont
  • 不具有词分隔符的语言不能恰当的返回全文本搜索结果
  • 目前没有临近操作符
  • 仅在MyISAM数据库引擎中支持全文本搜索

插入数据

插入行

  • INSERT INTO 表名(列名[, 列名]) VALUES(列值[, 列值]);
  • 允许NULL值或有默认值的列可以省略
  • 提高整体性能: 使用INSERT LOW_PRIORITY INTO降低INSERT语句的优先级, 同样适用于UPDATE和DELETE语句

插入多个行

  • 可以用多条INSERT语句
  • 如果列名和次序相同: VALUE(列值集合), (列值集合)
  • 用一条INSERT语句插入比用多条性能高

插入检索出的数据

  • INSERT INTO 表名1(a, b) SELECT (a, b) FROM 表名2;
  • INSERT SELECT中的列名: 列名可以不一样, 按列的位置导入数据

更新和删除数据

更新数据

  • UPDATE 表名 SET 列名 = 新列值 [, 列名 = 新列值] WHERE子句;
  • 可以使用子查询
  • IGNORE关键字: 在UPDATE后面使用, 即使发生错误也继续进行更新

删除数据

  • DELETE FROM 表名 WHERE子句;
  • 省略WHERE子句将影响所有行
  • 删除所有行使用TRUNCATE TABLE效率更高

创建和操纵表

在进行下列操作前最好先备份

创建表

创建

  • CREATE TABLE 表名(列名 数据类型 NULL [, ...]) ENGINE=引擎类型;
  • IF NOT EXISTS: 在表名之后使用, 当表名不存在时创建

使用NULL值

  • 有NULL和NOT NULL
  • NULL != ‘’

主键

  • PRIMARY KEY(列名 [, ...])
  • 使用单个列名时该列唯一, 多个列名时多个列的组合唯一
  • 主键不允许使用NULL值的列

自增

  • 列名 数据类型 NOT NULL AUTO_INCREAMENT
  • 自增列的值唯一
  • 每个表只能有一个自增列, 而且必须被索引(如主键)
  • 设置为自增列后仍然可以插入
  • 使用SELECT last_insert_id()获取最后一个自增值

默认值

  • 列名 数据类型 NOT NULL DEFAULT 列值
  • 不允许使用函数

引擎类型

  • ENGINE=引擎类型
  • 可以忽略, 将使用默认引擎
  • 关联的表不能使用不同的引擎
  • 需要知道的:
    • InnoDB: 事务处理引擎, 不支持全文本搜索, 高并发下性能更好
    • MEMORY: 功能等同于MyISAM, 数据保存在内存中
    • MyISAM: 性能极高, 支持全文本搜索, 不支持事务处理

更新表

添加列

  • ALTER TABLE 表名 ADD 列名 数据类型;

删除列

  • ALTER TABLE 表名 DROP COLUMN 列名;

添加外键

  • ALTER TABLE 表1 ADD CONSTRAINT 外键名 FOREIGN KEY (外键列) REFERENCES 表2 (主键列);
  • 可以在一条语句中对单个表进行多个更改, 每个更改用逗号分隔

删除表

  • DROP TABLE 表名;

重命名表

  • `RENAME TABLE 表名 TO 新表名;
  • 可以在一条语句中对多个表进行更改, 每个更改用逗号分隔

视图

视图为虚拟的表, 包含的不是数据而是根据需要检索数据的查询
视图提供了一种MySQL的SELECT语句鞥次的封装, 可用来简化数据处理以及重新格式化基础数据或保护基础数据

规则和限制

  • 视图名须唯一
  • 没有数量限制
  • 需要有足够的访问权限
  • 视图可以嵌套
  • ORDER BY可以用在视图中, 但会覆盖视图检索中的ORDER BY
  • 视图不能索引
  • 视图可以和表一起使用

使用视图

  • 创建视图: CREATE VIEW 视图名 AS SELECT子句;
  • 查看创建视图的语句: SHOW CREATE VIEW 视图名;
  • 删除视图: DROP VIEW 视图名;
  • 更新视图:
    1. 先用DROP再用CREATE
    2. CREATE OR REPLACE VIEW

视图的用途

  1. 简化复杂的联结
  2. 重新格式化检索出的数据
  3. 过滤不想要的数据
  4. 使用计算字段

更新视图

  • 同样可以使用SELECT INSERT UPDATE DELETE
  • 更新视图将更新其基表
  • 视图检索中如果有以下操作将不能进行视图的更新:
    • 分组
    • 联结
    • 子查询
    • 聚集函数
    • DISTINCT
    • 导出(计算)列

存储过程

为以后的使用而保存的一条或多条MySQL语句的集合
可以将其视为批文件或函数
简单、安全、高性能(比使用单独的SQL语句快)

使用

执行存储过程

  • CALL 存储过程名();
  • 括号中可以加参数

创建存储过程

  • CREATE PROCEDURE 存储过程名() BEGIN 存储过程体 END;
  • 同样可以在括号中加参数
  • BEGIN和END语句用来限定存储过程体
  • 在MySQL命令行客户机中: 使用DELIMITER //修改分隔符为//, 之后编写存储过程代码, 结束后使用DELIMITER ;恢复, 分隔符可以为\外的任何字符

删除存储过程

  • DROP PROCEDURE 存储过程名;
  • 仅当存在时删除: DROP PROCEDURE IF EXISTS 存储过程名;

使用参数

  • 例子:
DELIMITER //

CREATE PROCEDURE ordertotal(
    IN onumber INT,
    OUT ototal DECIMAL(8,2)
)
BEGIN
    SELECT Sum(item_price*quantity)
    FROM orderitems
    WHERE order_num = onumber
    INTO ototal;
END //

DELIMITER ;

  • 变量: 内存中一个特定的位置, 用来临时存储数据, 以@开始
  • OUT: 指出相应的参数用来从存储过程传出一个值(返回给调用者)
  • IN: 传递给存储过程
  • INOUT: 传入和传出
  • 参数的数据类型跟表中使用的相同
  • 调用: CALL ordertotal(20005, @total);
  • 显示: SELECT @total;

建立智能存储过程

  • 使用注释: 前置–
  • 在存储过程体中定义局部变量: DECLARE total DECIMAL(8,2);
  • 使用流控制语句, 如IF
  • COMMENT: 非必须, 如果给出, 将在SHOW PROCEDURE STATUS的结果中显示

检查存储过程

  • 查看创建语句: SHOW CREATE PROCEDURE 存储过程名;
  • 查看存储过程列表: SHOW PROCEDURE STATUS

游标

说明

  • 游标是一个存储在MySQL服务器上的数据库查询, 它不是一条SELECT语句, 而是被该语句检索出来的结果集
  • MySQL游标只能用于存储过程
  • 存储了游标之后, 应用程序可以根据需要滚动或浏览其中的数据
  • 主要用于交互式应用

使用游标

创建游标

  • DECLARE 游标名 CURSOR FOR SELECT子句 END;

打开和关闭有白哦

  • 打开: OPEN 游标;
  • 关闭: CLOSE 游标;, 如果没有关闭游标则在到达END语句时自动关闭

使用游标数据

  • 使用FETCH语句:
    • FETCH 列名 INTO 变量;
    • 访问游标的每一行, 自动从第一行开始,
    • 检索后向前移动游标中的内部行指针, 使下一条FETCH语句检索下一行
  • 反复执行直到条件为真: REPEAT 执行代码 UNTIL 条件 END REPEAT;
  • DECLARE语句的次序: 局部变量 > 游标 > 句柄

触发器

触发器是响应DELETE INSERT UPDATE语句而自动执行的一条MySQL语句(或位于BEGIN和END语句之间的一组语句)

创建触发器

  • 条件:
    • 唯一的触发器名
    • 触发器关联的表
    • 触发器应该响应的活动
    • 触发器何时执行(处理之前或之后)
  • 例子: CREATE TRIGGER newproduct AFTER INSERT ON products FOR EACH ROW SELECT 'Product added';
  • 该例子在INSERT操作后执行代码
  • 只有表才支持触发器, 视图和临时表都不支持
  • 每个表的每个事件每次只允许一个触发器
  • 单一触发器不能与多个事件或多个表关联
  • 如果BEFORE触发器失败, 则MySQL将不执行请求的操作
  • 触发器中不支持CALL调用存储过程
  • (非必须)使用BEGIN和END语句标记触发器体

删除触发器

  • DROP TRIGGER 触发器名;
  • 触发器不能更新或覆盖, 要修改必须先删除再重新创建

使用触发器

INSERT触发器

  • 在INSERT触发器代码内, 可引用一个名为NEW的虚拟表, 访问被插入的行
  • 在BEFORE INSERT触发器中, NEW中的值也可以被更新
  • 对于自增列, NEW在INSERT执行之前包含0, 执行之后包含新的自动生成值
  • BEFORE通常用于数据验证和净化

DELETE触发器

  • 在DELETE触发器代码内, 可引用一个名为OLD的虚拟表, 访问被删除的行
  • OLD中的值都是只读的
  • 可用于将删除的值存到另一个表中

UPDATE触发器

  • 在UPDATE触发器代码内, 可引用一个名为OLD的虚拟表访问执行UPDATE语句之前的值, 引用一个名为NEW的虚拟表访问更新的值
  • NEW虚拟表中的值可以被更新
  • OLD中的值都是只读的

管理事务处理

事务处理用来维护数据库的完整性, 它保证成批的MySQL操作要么完全执行, 要么完全不执行

事务处理术语

  • 事务(transaction): 指一组SQL语句
  • 回退(rollback): 指撤销指定SQL语句的过程
  • 提交(commit): 指将未存储的SQL语句结果写入数据库表
  • 保留点(savepoint): 指事务处理中设置的临时占位符, 可以对它发布回退

控制事务处理

使用ROLLBACK

  • 回退(撤销)MySQL语句
  • ROLLBACK只能在一个事务处理内使用(在执行一条START TRANSACTION命令之后)
  • 可以回退的语句: INSERT、UPDATE、DELETE

使用COMMIT

  • 一般的MySQL语句是自动进行提交的, 事务处理块中不会自动提交, 需要使用COMMIT语句进行明确的提交
  • 当COMMIT或ROLLBACK语句执行后, 事务会自动关闭

使用保留点

  • 用于部分提交或回退
  • 创建占位符: SAVEPOINT 保留点名;
  • 回退到保留点: ROLLBACK TO 保留点名;
  • 释放保留点: 保留点在事务处理完成后自动释放, 也可以用RELEASE SAVEPOINT 保留点名;释放

更改默认的提交行为

  • 默认的MySQL行为自动提交所有修改
  • 指示MySQL不自动提交更改: SET autocommit=0;
  • autocommit为真时自动提交
  • autocommit标志是针对每个连接而不是服务器的

全球化和本地化

  • 查看支持的字符集完整列表: SHOW CHARACTER SET;
  • 查看支持校对的完整列表: SHOW COLLATION;
  • 查看所使用的字符集: SHOW VARIABLES LIKE 'character%';
  • 查看所使用的校对: SHOW VARIABLES LIKE 'collation%';
  • 为表和表的列指定字符集和校对:
CREATE TABLE a
(
    column1 VARCHAR(10) CHARACTER SET latin1 COLLATE
        latin1_general_ci
) DEFAULT CHARACTER SET hebrew
  COLLATE hebrew_general_ci;
  • 如果只指定了CHRACTER SET则使用此字符集及其默认的校对
  • 如果没有指定则使用数据库默认
  • 校对在对用ORDER BY子句检索出来的数据排序时起重要作用
  • COLLATE子句也可以在一下子句中使用: ORDER BY、GROUP BY、HAVING、聚集函数、别名等

安全管理

管理用户

所有用户账号列表存在mysql和user数据库中

创建用户账号

  • CREATE USER 用户名 IDENTIFIED BY '密码';
  • 使用GRANT也可以创建用户账号, 但CREATE USER比较简单清楚
  • 也可以直接插入行到user表来增加用户(不安全)
  • 重命名用户账户: RENAME USER 用户名 TO 新用户名;, 也可以直接更新user表

删除用户账号

  • DROP USER 用户名;

设置访问权限

  • 查看用户账号的权限: SHOW GRANTS FOR 用户名;
  • 使用GRANT语句设置权限: GRANT 权限 ON 目标 TO 用户名;
  • 使用REVOKE语句撤销权限: REBOKE 权限 ON 目标 FROM 用户名;
  • GRANT和REVOKE可在以下层次上控制访问权限:
    • 整个服务器, 使用GRANT ALL和REVOKE ALL
    • 整个数据库, 使用ON database.*
    • 特定的表, 使用ON database.table
    • 特定的列
    • 特定的存储过程
  • 可以授予或撤销的权限太多这里不列出
  • 多个权限可用逗号分隔
  • 即使删除数据库或表, 已有权限仍然存在

更改口令

  • SET PASSWORD FOR 用户名 = Password('新口令');
  • 设置自己的口令: SET PASSWORD = Password('新口令');

数据库维护

备份数据

  • 使用命令行实用程序mysqldump转储所有数据库内容到某个外部文件
  • 使用命令行实用程序mysqlhotcopy从一个数据库复制所有数据(并非所有数据库引擎都支持)
  • 使用MySQL的BACKUP TABLE或SELECT INTO OUTFILE转储所有数据到某个外部文件, 数据用RESTORE TABLE复原
  • 为了保证所有数据被写到磁盘(包括索引数据), 需要在进行备份钱使用FLUSH TABLES语句

进行数据库维护

  • 检查表键是否正确: ANALYZE TABLE 表名;
  • CHECK TABLE用来针对许多问题对标进行检查:
    • 发现和修复问题: CHECK TABLE 表名;
    • 检查自最后一次检查以来改动过的表: CHANGED
    • 执行最彻底的检查: EXTENDED
    • 只检查未正常关闭的表: FAST
    • 检查所有被删除的链接并进行键检验: MEDIUM
    • 进行快速扫描: QUICK
    • 在MyISAM表上还对索引进行检查
  • 如果MyISAM表访问产生不正确和不一致的结果, 用REPAIR TABLE修复(不应该经常使用)
  • 删除大量数据后, 使用OPTIMIZE TABLE回收所用的空间

诊断启动问题

  • 在命令行执行mysqld启动数据库
  • mysqld命令行选项:
    • –help显示帮助
    • –safe-mode装载减去某些最佳配置的服务器
    • –verbose显示全文本消息
    • –version显示版本信息

查看日志文件

  • 错误日志hostname.err, 包含启动和关闭问题以及任意关键错误的细节
  • 查询日志hostname.log, 记录所有MySQL活动
  • 二进制日志hostname-bin, 记录更新过数据的所有语句
  • 缓慢查询日志hostname-slow.log, 记录执行缓慢的任何查询
  • 日志文件位于data目录中

改善性能

  • 在前面有提到一些技巧
  • 更多的技巧浏览文档

你可能感兴趣的:(MySQL,笔记,入门,mysql,参考,手册,例子)