mysql必知必会
用了将近4年的mysql,今天在想加强下时,发现平时多是用ORM,偶尔一些为了提高效率或特殊要求会写sql,所以准备读下这本经典。也对MySql基础做个查缺补漏。
本文章中不会对最基础的语句用法做简介,适合查缺
第一章 了解 MySql
本章中主要介绍了有关数据库的一些概念:数据库、表、行、列、数据类型、主键、sql语句
tip:
数据类型不仅可以限制数据录入的格式,还在磁盘优化方面有重要作用
主键使用的好习惯:
是更新主键列中的值
不重用主键列中的值
不使用可能变更的数据作为主键的值
第二章 MySql简介
介绍了MySql的客户端及服务端,以及使用的工具.
tip:
在写这本书时,mysql最新版为5.0版本,目前(2020)已经到了8.0版,常用的工具为navicat
第三章 使用MySql
#显示数据库列表
SHOW DATABASES
#切换数据库
USE 数据库名
#显示数据库内的表
SHOW TABLES
#显示表的列
SHOW COLUMNS FROM 表名
#显示创建数据库或者表信息 (在创建后使用)
SHOW CREATE DATABASE 创建好的数据库名
SHOW CREATE TABLE 创建好的表名
#显示服务器的信息
SHOW STATUS
#显示所有用户的安全权限
SHOW GRANTS
#显示服务器的错误、警告信息
SHOW ERRORS
SHOW WARNINGS
第四章 检索数据
SQL语句需要以分号结尾
#从表中检索多列
SELECT 列1,列2 FROM 表名;
#从表中检索所有
SELECT * FROM 表名;
#检索字段值不重复的行(检索出来的数据列1和列2的都不相同)
SELECT DISTINCT 列1,列2 FROM 表名;
#限定检索的条数
SELECT 列 FROM 表名 LIMIT 起始条数,数据数量
#使用完全限定的表名
SELECT 表名.字段名 FROM 数据库名.表名
tip:
使用*号会降低检索和应用程序的性能
第五章 排序检索数据
本章主要介绍了 ORDER BY 子句的使用.
子句:SQL语句由子句构成,有些子句是可选的,有些是必须的,子句有关键字和提供的数据组成.例如:FROM 是 SELECT的子句
# 对单个字段进行排序
SELECT 列1 FROM 表名 ORDER BY 列1
#对多个字段进行排序(只有在列1中的数据相同时,才会根据列2排序)
SELECT 列1,列2 FROM 表名 ORDER BY 列1,列2
#不同字段按照不同的规则排序(默认使用正序排序(ASC))
SELECT 列1,列2 FROM 表名 ORDER BY 列1 DESC,列2
tip:
sql语句如果不指定排序,则检索出来的语句的顺序无意义,是由底层表中数据的顺序决定的,一般为插入的顺序,但如果出现过删除和更新,则会收到MYSQL回收利用空间的影响.所以不指定排序时,应理解为无序.
一般数据库中对大小写字母不敏感,因此如果需要根据大小写排序,需要进行配置.
在和 LIMIT 一起使用时, LIMIT 需要放在最后
第六章 过滤数据
本章主要介绍了 WHERE 子句的筛选功能
WHERE 子句操作符:= 、 <> 、 != 、< 、<= 、 > 、 >= 、BETWEEN
# 基本语法
SELECT 列 FROM 表名 WHERE 字段 判断条件(操作符) 值
# BETWEEN
SELECT 列 FROM 表名 WHERE 字段 BETWEEN 值1 AND 值2
# 空值检查(NULL)
SELECT 列 FROM 表名 WHERE 字段 IS NULL
tip:
WHERE 子句和 ORDER BY 子句使用时,ORDER BY子句需要写在WHERE 之后。
在使用筛选时,如果某一列的值含有部分为NULL的数据,则在筛选时,如果没有使用 IS NULL 需要注意,结果不包含和null相关的数据。
第七章 数据过滤
本章主要介绍了使用WHERE子句操作符实现更强大的数据过滤功能
AND可以给WHERE子句附加条件
SELECT 字段 FROM 表名 WHERE 条件1 AND 条件2
OR
# 一般使用 SELECT 字段 FROM 表名 WHERE 条件1 OR 条件2 #与AND一起使用时,最好加上括号 SELECT 字段 FROM 表名 WHERE ( 条件1 OR 条件2 )
IN
SELECT 字段 FROM 表名 WHERE 字段 IN (值1,值2)
使用IN 操作符的优点:
在值较多的情况下,使用IN的语法更加清楚直观
使用IN时,语句的运行次序更容易管理
使用IN效率比多个OR的高
可以包含SELECT语句
NOT
NOT可以对IN、BETWEEN、EXISTS条件进行否定
SELECT 字段 FROM 表名 WHERE 字段 NOT IN (值1,值2)
tip:
在没有括号时,AND的优先级高级OR
第八章 使用通配符进行过滤
通配符:用来匹配值的一部分的字符串,需要结合LIKE操作符进行使用
1. % 可以匹配0个、1个或者多个字符
2. _ 可以匹配一个字符
搜索模式:由字面值、通配符两者组合成的搜索条件
# 搜索条件可以为: 'a%' 以a开头的 '%a%' 含有a的 等
SELECT 字段 FROM 表名 WHERE 字段名 LIKE 搜素条件
tip:
在使用通配符时,不会匹配值为NULL的列
其他操作符能达到目的时,不要使用通配符
通配符较其他操作符效率慢,尤其是将通配符放在搜素模式开始处时
第九章 用正则表达式进行搜索
在WHERE子句中使用正则表达式可以更好的控制数据进行过滤。Mysql仅支持一部分的正则表达式
#基本使用:
SELECT 字段 FROM 表名 WHERE 字段名 REGEXP '正则表达式'
# Mysql中REGEXP默认不区分大小写,如果想要区分需要使用 BINARY
SELECT 字段 FROM 表名 WHERE 字段名 REGEXP BINARY '正则表达式'
常见的正则表达式:
1. or '值1|值2'
2. 匹配几个字符之一(与OR类似) '[值1值2]'
3. 匹配范围(值可以为数字或字母) '[起始值-结束值]'
4. 匹配特殊字符,比如:. 、 [] 、 | 、 - 、元字符等 '\\特殊字符'
5. 预定义字符集,匹配字符类
6. 匹配多个实例
常见的元字符:
\\f 换页
\\n 换行
\\r 回车
\\t 制表
\\v 纵向制表
匹配字符类:
在不使用正则表达式的情况下进行正则表达式匹配测试:
SELECT '测试的字符串' REGEXP '正则表达式'
tip:
当匹配的只有一个值时,正则表达式通过定位符可以实现和LIKE类似的效果,LIKE通过%可以实现正则的效果
在匹配特殊字符时,两个斜杆一个代表SQL中的转义字符,一个代表正则表达式中的转义字符
## 第十章 创建计算字段
# 拼接字段
SELECT Concat(列1,需要拼接的字段,列2) AS 字段名 FROM 表名
# 计算字段
SELECT 列1 算术运算符 列2 AS 字段名 FROM 表名
AS 别名的作用:
1. 为没有名字的字段命名
2. 为命名混乱或者不规范的列重命名
支持的算术运算符:+ - * /
tip:
字段与列的区别:字段通常描述计算的字段,而列通常指表中存在的列
计算字段的测试方式: SELSECT 1+2
第十一章 使用数据处理函数
文本处理函数
# 函数可以用在结果或者条件中 SELECT 列1,函数(列2) AS 别名 FROM 表名 SELECT 列 FROM 表名 WHERE 函数(列) = 值
常见的字符处理函数:
日期和时间处理函数
在条件中直接使用 WHERE 列1 = 时间 时,需要时间完全匹配,使用日期和时间可以进行更多的匹配
# 基础使用 SELECT 列 FROM 表名 WHERE Date(列1) = 日期 #查询某月的行信息 #方法1: SELECT 列 FROM 表名 WHERE Date(列1) BETWEEN '起始日期' AND '结束日期' #方法2: SELECT 列 FROM 表名 WHERE Yate(列1) = '年份' AND Month(月份) = '月份'
数值处理函数
tip:
在数据库中进行运算可以获得更快的速度,但也会给数据库带来相应的压力,因此需要综合考虑。
第十二章 汇总数据
常见的使用:
# 基本使用
SELECT 函数(列) AS 别名 FROM 表
# 多个字段总和
SELECT SUM(列1+ 列2) AS 别名 FROM 表
# 使用DISTINCT 聚合不同的值,不使用则默认我ALL
SELECT SUM(DISTINCT 列1 ) AS 别名 FROM 表
tip:
在使用count(*) 时,会统计NULL的部分,如果conut(列)则不会统计值为NULL的行
使用DISTINCT 时,必须指定列名
第十三章 数据分组
GROUP BY
# 基本使用
SELECT COUNT(列) AS 别名 FROM 表 GROUP BY 列
# 使用 WITH ROLLUP 对分组进行汇总统计,会在返回时的最后一行,返回一个对各个分组数据汇总的数据
SELECT COUNT(列) AS 别名 FROM 表 GROUP BY 列 WITH ROLLUP
tip:
GROUP BY后边可以跟多个列名,此时当两行的多个列都相同时才会分为一组
GROUP BY后跟的列必须为检索列或者表达式(不能是聚集函数),如果SELECT 后使用的为表达式,那么GROUP BY 后边也应该跟表达式,不能使用别名。
SELECT 后跟的列,除聚集函数外,其他的都应该在 GROUP BY 后给出
如果GROUP BY 的列存在值NULL的情况,则NULL将为一组
GROUP BY 必须跟在WHERE子句之后,ORDER BY的子句之前
HAVING
HAVING是对分组进行筛选,支持WHERE后所有的条件。
#基本使用
SELECT Count(*) AS 别名 FROM 表 GROUP BY 列1 HAVING Count(*) > 1
#与WHERE结合,会先进行WHERE筛选再进行GROUP BY
SELECT Count(*) AS 别名 FROM 表 WHERE 条件 GROUP BY 列1 HAVING Count(*) > 1
tip:
不应依赖GROUP BY的排序,如果需要对字段进行排序,需要在最后边使用ORDER BY
SELECT 子句顺序
SELECT -> FROM -> WHERE -> GROUP BY -> HAVING -> ORDER BY ->LIMIT
第十四章 使用子查询
可以在SELECT 中嵌套其他的SELECT 语句作为子语句,即以SELECT的结果作为表或者条件
tip:
不应嵌套过多,会限制运行效率
在使用子查询时,需要注意列名的歧义
第十五章 联结表
联结是一种机制,用来在一条SELECT 语句中关联表
通过关系表,可以将信息拆解为多个表,一类信息一个表,有效的减少了值的重复,可以让数据更有效的存储和更方便的处理。拥有更好的伸缩性
#使用WHERE进行联结
SELECT 表1.列,表2.列 FROM 表1,表2 WHERE 表1.列1 = 表2.列1
# 内部联结
SELECT 表1.列,表2.列 FROM 表1 INNER JOIN 表2 ON 表1.列1 = 表2.列1
tip:
当对两个没有进行的联结的表查询时,会得到两个表返回的笛卡尔积(即:表1的行数* 表2的行数)
在where和联结都可以使用时,优先使用联结
第十六章 创建高级联结
AS 使用AS可以对表起别名
表别名的好处:
缩短SQL语句,让SQL的使用更加简洁
对一个表进行多次操作更便捷
自联结
自联结只返回两张表中满足条件的结果
SELECT 列 FROM 表1 INNER JOIN 表2 ON 表1.列1 = 表2.列2
自然联结
本书中此处内容未进行明确的讲解
外联结
通过外联结可以将一个表中存在而另外一个表不存在数据查询出来
LEFT JOIN 与 RIGHT JOIN可以通过调换 FROM 或WHERE表中的位置达到相同的效果
SELECT 列 FROM 表1 LEFT JOIN 表2 ON 表1.列1 = 表2.列2
tip:
合理使用联结的效率比使用SELECT嵌套的效率要高
在多个表进行联结,为保证联结的结果,可以一个个写,测试好一个再写下一个联结
第十七章 组合查询
UNION 操作符可以将多条SELECT语句的结果组合成一个结果集,也称为并查询、复合查询
使用需要注意:
必须由2条以上的SELECT语句组成
各个SELECT返回的数据需要包含相同的列、表达式、聚集函数
各列的数据类型必须兼容(可以隐式转换)
SELECT 列1,列2
FROM 表1
WHERE 条件1
UNION
SELECT 列1,列2
FROM 表2
WHERE 条件2
tip:
WHERE也可以完成UNION的操作,但对于复杂的过滤条件使用UNION处理可能会更简单
使用UNION时,默认会去除重复的行,如果需要保留,则应该使用 UNION ALL操作符
第十八章 全文本搜索
通过LIKE 关键字和正则表达式,可以达到与全文搜索类似的功能,但使用全文搜索可以更简单、快捷
、灵活的实现更多功能。MyISAM支持全文索引,InnoDB不支持。
创建索引
在使用全局搜索时,需要索引的支持,使用FULLTEXT可以使MySQL自动维护该索引
#创建带FULLTEXT索引的表
CREATE TABLE 表名
(
content text NULL,
PRIMARY KEY (id),
FULLTEXT(content)
) ENGINE = MyISAM;
Match()、Against() 的使用
match()指定要搜索的字段,指定的列必须与FULLTEXT()中的值相同;Against()指定要使用的搜索条件,在默认模式下,不区分大小写。
#相比于LIKE,全文搜索的返回的结果会根据搜索结果的匹配程度进行排序
SELECT 列 FROM 表 WHERE Match('列') Against('搜索条件')
WITH QUERY EXPANSION 查询扩展
使用查询扩展可以获取更多和含关键词搜索结果相关的结果,但也增加了无用的数据
SELECT 列 FROM 表 WHERE Match('列') Against('搜索条件' WITH QUERY EXPANSION)
IN BOOLEAN MODE 布尔文件搜索
使用boolean mode 可以更加灵活,可以不为其定义全文搜索索引,但速度会略慢
SELECT 列 FROM 表 WHERE Match('列') Against('搜索条件' IN BOOLEAN MODE)
操作符使用方式:
# 同时存在值1、值2的列
SELECT 列 FROM 表 WHERE Match('列') Against('+值1 +值2' IN BOOLEAN MODE)
#至少包含一个值的列
SELECT 列 FROM 表 WHERE Match('列') Against('值1 值2' IN BOOLEAN MODE)
#含有"值1 值2"这个字符串的列
SELECT 列 FROM 表 WHERE Match('列') Against('"值1 值2"' IN BOOLEAN MODE)
#增加或降低等级
SELECT 列 FROM 表 WHERE Match('列') Against('>值1 <值2' IN BOOLEAN MODE)
#含有值1、 值2,且降低值2的等级
SELECT 列 FROM 表 WHERE Match('列') Against('+值1 +(<值2)' IN BOOLEAN MODE)
在布尔搜索中不以等级进行排序
tip:
在导入带有FULLTEXT索引的表时,先将数据全部导进去,再添加索引的效率会更高
对索引词的忽略:
3个或3个以下字符的词会被忽略
mysql中有一个非用词(stopword)表,此表中的词会被忽略
在搜索中一个词如果出现在表里行中的次数超过50%,则会将其作为一个忽略词,因此如果表中的数据少于3行,则全文搜索不会返回结果(如果是在boolean mode中不会忽略)
忽略单词的单引号
对于不具有词分隔符的语言(汉语、日语),不能恰当的返回结果
第十九章 插入语句
使用INSERT语句 可以插入:1. 完整的行 2. 行的一部分 3. 多行 4. SELECT的查询结果
# 1.只用值进行插入,需要对应表中的字段
INSERT INTO 表名 VALUES(NULL,值1,值2,值3)
# 2.使用列名和值插入(更安全),只要值和列名对应即可
INSERT INTO 表名(列1,列2,列3) VALUES(值1,值2,值3)
# 3.插入多条
INSERT INTO 表名(列1,列2,列3) VALUES(值1,值2,值3),VALUES(值1,值2,值3)
# 4.插入查询结果,需要注意两个表中的id 不能重复
INSERT INTO 表名(列1,列2,列3) SELECT 列1,列2,列3 FROM 表名2
在进行插入时,id输入为NULL,系统会自动进行自增。
插入时,如果想省略部分字段需要满足以下一个条件;
允许NULL值
表中对该字段设置了默认值
tip:
在插入内容较多,比较耗时的情况下,可以使用 INSERT LOW_PRIORITY INTO 代替 INSERT INTO 降低语句的优先级
在插入查询结果时,根据的是查询结果的值顺序插入,而不是列名或别名
第二十章 更新和删除数据
# 更新
UPDATE 表名 SET '列' = 值 WHERE 条件
# 删除
DELETE 表名 WHERE 列 = 值
tip:
在更新数据时,如果出现错误,那么整个语句的执行都会被撤销,如果想出错也继续,可以使用UPDATE IGNORE 代替 UPDATE
如果想删除整个表的数据,那么使用TRUNCATE 代替 DELETE速度会更快(DELETE是逐行删除,TRUNCATE是删除整个表,再把表建起来)
使用更新或删除时,建议先用select测试语句的条件
第二十一章 创建和操纵表
创建新表时,表名必须不存在,否则将会出错。在表名后使用 IF NOT EXISTS 判断表不存在再执行会更安全
# 基础使用
CREATE TABLE 表名
(
列名 数据类型 是否可为NULL 是否自增
列名2 ...
PRIMARY KEY(列名)
) ENGINE = InnoDB
# 不可为NULL,且指定默认值
列名 数据类型 NOT NULL DEFAULT 1
# 获取最后一次插入的id自增值
SELECT last_insert_id()
引擎类型
在创建表时,默认使用MyISAM引擎。常用的引擎包括:
InnoDB,支持事务,不支持全文检索
MyISAM,支持全文检索,不支持事务
MEMORY 等同于MyISAM,数据存在内存中
更新表
# 添加列
ALTER TABLE 表名 ADD 要增加的列名 类型
# 删除列
ALTER TABLE 表名 DROP 要增加的列名 类型
# 增加外键
其他操作
# 删除表
DROP TABLE 表名
# 重命名表
RENAME TABLE 原名 TO 新名
tip:
在使用外键时需要注意,外键不能跨引擎
在使用对表的操作前,最好做个备份
第二十二章 使用视图
视图是虚拟的表,使用视图有以下优点:
重用SQL语句,
简化SQL语句,在使用时不需要知道基本的细节
保护数据,可以只让用户通过视图使用表的一部分
更改数据格式和表示,视图可返回与表中存放格式不一样的数据
视图的使用和限制:
视图的名字和表名不能冲突
视图可以嵌套,可以与表一起用在SELECT 语句中
如果SELECT 语句中使用了ORDER BY 子句,那么视图中的ORDER BY 将失效
需要有创建视图的权限
# 创建视图
CREATE VIEW 视图名 AS SQL语句(例:SELECT 表1.列1,表2.列1 FROM 表1,表2 WHERE 条件)
# 查看创建视图的语句
SHOW CREATE VIEW 视图名称
# 使用视图,和其他表一样
SELECT * FROM 视图名
# 更新视图
CREATE OR REPLACE VIEW 视图名 AS SQL语句(例:SELECT 表1.列1,表2.列1 FROM 表1,表2 WHERE 条件)
# 删除视图
DROP VIEW 视图名
视图可以被更新,但一般不用于更新。在更新的时候,视图的更新相当于对表的操作,但是在一些元素无法被准确确定时,视图是不能被更新的,比如使用了:GROUP BY、联结、子查询、并、聚合函数、DISTINCE、计算字段。
tip:
在使用视图时,每次都会对相关的表进行检索,因此在含有视图嵌套和复杂的筛选时,会导致性能下降。
第二十三章 使用存储过程
存储过程是一条或者多条MySQL语句的集合。
使用存储过程的好处:
将复杂的操作封装,简化操作,也防止了在步骤过多时,代码书写错误的出现
简化了对变动的管理,如果表名、列名、业务逻辑发生了变化,那么只需要改动存储过程即可
性能与执行多条语句相比更高
# 创建存储过程
CREATE PROCEDURE 过程名称(
OUT 输出的值1 数据类型,
IN 传入的值2 数据类型,
) COMMENT '存储过程示例'
BEGIN
Declare 定义的字段1 数据类型
SELECT 字段
INTO 定义的字段1
FROM 表1;
IF 传入值2 THEN
SELECT 定义的字段1*2 INTO 定义的字段1;
END IF;
SELECT 定义的字段1 INTO 输出的值1
END;
# 使用存储过程(有的存储过程调用需要传参数)
CALL 过程名称(@变量)
# 如果存储过程的返回就是表,则不需要selsect
SELECT @变量
# 删除存储过程
DROP PROCEDURE 存储过程名称
# 如果存在则删除
DROP PROCEDURE IF EXISTS 存储过程名称
# 检查存储过程
SHOW CREATE PROCEDURE -- 存储过程名称,可以使用like进行过滤
传入与接受参数
可以使用 IN (传递给存储过程) 、 OUT(从存储过程返回) 、INOUT(传入且传出)
mysql 命令行的分隔符
命令行中分隔符默认为分号(;),如果存储过程需要解释自身内的分号字符,则需要临时更改命令行的分隔符。
DELIMITER // -- 存储过程代码 -- DELIMITER ;
记录集不是被mysql允许的类型,因此返回的参数有多个时,需要定义多个
存储过程也可以不返回数据,返回数据表,用来简化sql(不推荐)
第二十四章 使用游标
游标是一个被sql语句检索出来的结果集,游标只能用出存储过程中,可以用来一条条的处理数据.
# 在存储过程中使用游标
CREATE PROCEDURE 存储过程名称()
BEGIN
DECLARE done BOOLEAN DEFAULT 0
DECLARE o INT
# 定义游标,此时并不检索数据
DECLARE 游标名称 CURSOR
FOR
SELECT 列 FROM 表;
# 声明一个条件(SQLSTATE '02000' )被触发时执行的代码
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1
# 打开游标
OPEN 游标名称
# 通过游标遍历数据
REPEAT
FETCH 游标名称 INTO o
# 当触发 sqlstate '02000' 的条件时,停止循环
UNTIL done END REPEAT
#
#关闭游标,如果不主动关闭,则在存储过程的END中会自动关闭
CLOSE 游标名称
END;
tip:
在使用游标的时候,declare定义的局部变量需要在游标之前,句柄需要在游标之后,否则会报错
第二十五章 使用触发器
在MySQL执行CREATE、UPDATE、DELETE时,可以使用触发器,执行一些语句。触发时间报错BEGIN、END两种。
# 创建触发器,在执行的动作中可以返回数据,也可以执行其他语句
CREATE TRIGGER 触发器名 AFTER 时间( BEFORE 或者 AFTER) ON 操作名( CREATE 、 UPDATE 、 DELETE) 表名
FOR EACH ROW 执行的动作
# 删除触发器
DROP TRIGGER 触发器名
在使用INSERT触发器时,可以引用一个名为NEW的虚拟表,访问被插入的行,一般在插入前进行数据的格式化或检查
在使用UPDATE触发器时,可以引用名为NEW和OLD的虚拟表,可以更新NEW中的值,但是OLD中的值只能读
在使用DELETE触发器时,可以引用一个名为OLD的虚拟表,一般在删除前进行数据的备份
tip:
触发器每次可以触发一个,根据触发条件,在每个表中都可以定义6个触发器。
每个表中的触发器不可以重名,一个数据库中可以有多个触发器,但不建议一个数据库中有重名的触发器。
只有表才支持触发器,表和视图不支持。
如果BEFORE触发器执行失败,则不再执行SQL语句,如果SQL语句失败则,不执行AFTER触发器。
触发器中不能使用存储过程
第二十六章 管理事务处理
通过事务处理可以用来维护数据库的完整性,保证多条SQL语句要么全部执行,要么不执行.MyISAM引擎不支持事务的处理.
只对INSERT、UPDATE、DELETE 语句生效,可以手动控制回滚,也可以使用COMMIT在失败时,自动回滚。
# 回滚方式1:
START TRANSACTION;
语句一;
语句二;
# 回滚
ROLLBACK;
# 回滚方式2:
START TRANSACTION;
语句一;
语句二;
# 可以设置多个保留点
SAVEPOINT 保留点名称;
# 回滚
ROLLBACK TO 保留点名称;
# 成功提交,失败回滚
START TRANSACTION;
语句一;
语句二;
# 提交
COMMIT ;
tip:
在数据库中除事务外,默认是自动提交所有修改的,如果想进行手动提交,可以使用:
SET autocommit = 0 # 会改变当前会话的提交方式,非全局
回滚或提交后,事务即结束
第二十七章 全球化和本地化
在处理不同的字符时,如果采用不同的字符集和校对方式,输出的结果可能不同。因此,可以根据自己的需求进行调整。
字符集:字母和符号的集合
编码:某个字符或符号在字符集内的表示方式
校对:规定字符如何比较,比如大小写,不同的字符
# 查看数据库支持的字符集
SHOW CHARACTER SET
# 查看数据库支持的校对方式
SHOW COLLATION
# 创建表时,指定字符集和校对方式
CREATE TABLE 表名
(
列1 数据类型,
列2 数据类型
) DEFAULT CHARACTER SET 字符集
COLLATE 校对方式
# 查询时,临时指定校对方式(适用于GROUP BY 、 HAVING 、聚集函数 )
SELECT * FROM 表名 ORDER BY 字段 COLLATE 校对方式
tip:
如果在创建时,不指定字符集和校对方式,则会使用数据库默认的。
如果在创建时,只指定字符集则使用字符集默认的校对方式
如果需要,可以使用Cast() 、 Convert() 对串在字符集之间进行转换
第二十八章 安全管理
MySQL安全的基础时:用户对他们需要的数据具有适当的访问权限,不多也不少。
# 查看mysql的用户
USE mysql;
SELECT user FROM user;
# 创建用户账号,使用INENTIFIED 可以使存储在用户表中的密码不为明文
CREATE USER 用户名 IDENTIFIED BY '用户密码'
# 设置访问权限
GRANT 权限1,权限2 FOR 用户名
# 查看用户的访问权限
SHOW GRANTS FOR BFORTA
# 重命名
RENAME USER 用户名 TO 新用户名
# 修改密码
# 为其他用户
SET PASSWORD FOR 用户名 = Password('密码')
# 为自己
SET PASSWORD = Password('密码')
#删除用户名
DROP USER 用户名
tip:
控制用户的权限可以防止用户无意的操作错误。
日常中尽量不要使用root 用户操作。
不能给未创建的用户授权,但可以为用户对未创建的表或数据库授权。
第二十九章 数据库维护(不详细)
备份数据
MySQL数据库是基于磁盘的文件,因此普通的文件备份也可以用来备份数据库,但是由于这些文件经常处于被使用状态,因此普通备份有时候无法正常运行。
可使用命令:
mysqldump
mysqlcopy
backuptable table 、select into outfile
数据库维护
ANNLYZE TABLE
CHECK TABLE
启动问题
在修改服务器或MySQL配置时,可能会发生启动错误。
可以使用手动启动的方式,查看错误的信息
查看日志
日志都在data 目录中,可以通过log相关的命令调整位置
错误日志,hostname.err
查询日志,hostname.log 记录所有mysql活动
二进制文件,hostname-bin ,记录更新过数据的所有记录
缓慢查询日志,hostname-slow
第三十章 改善性能
一条SELECT 语句可以尝试不同的写法,比如联结,并,子查询
只返回需要的数据
使用正确的数据类型
部分情况,可以使用DELAYED关键字
如果一个简单的WHERE子句查询时间过长,则能其中的几个列需要加为索引
可以通过多条SELECT 和 连接它们的UNION,提高复杂OR条件的性能。
索引能改善数据检索的性能,当时会降低插入、删除和更新的性能
# 查看当前MySQL设置
SHOW VARIABLES
SHOW STATUS
# 多进程时,查看所有活动进行的信息
SHOW PROCESSLIST
# 查看一条语句的执行
EXPLAIN SQL语句
tip:
所有的优化在某种条件下都可能失效,因此需与具体环境结合