文章目录
检索
检索不同的行: 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(列名)忽略NULLMAX()
: 返回某列的最大值, 忽略列值为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
在数据分组后进行过滤- 同时使用
WHERE
和HAVING
: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 视图名;
- 更新视图:
- 先用
DROP
再用CREATE
CREATE OR REPLACE VIEW
视图的用途
- 简化复杂的联结
- 重新格式化检索出的数据
- 过滤不想要的数据
- 使用计算字段
更新视图
- 同样可以使用
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目录中
改善性能
- 在前面有提到一些技巧
- 更多的技巧浏览文档: http://dev.mysql.com/doc/