零基础MySQL完整学习笔记
- 1. 基础操作(必须会!)
- 1.1 修改密码(4种方法)
- 1.2 创建新用户
- 1.3 导入数据库
- 2. SQL四种语言介绍
- 2.1 DDL(数据库定义语言)
- 2.2 DML(数据操纵语言)
- 2.3 DCL(数据库控制语言)
- 2.4 TCL(事务控制语言)
- 3. 数据库操作
- 3.1 创建数据库
- 3.2 查询数据库
- 3.3 删除数据库
- 3.4 备份数据库
- 3.5 恢复数据库
- 4. 表操作
- 4.1 创建表
- 4.2 修改表
- 4.3 删除表
- 4.4 表复制
- 4.5 表结构
- 4.6 面试题:如何对表去重?
- 5. MySQL数据类型
- 5.1 数值
- 5.2 时间日期
- 5.3 文本和二进制
- 6. 增删改查
- 6.1 INSERT
- 6.2 DELETE
- 6.3 UPDATE
- 6.4 SELECT
- 6.4.1 单表
- 6.4.2 多表(单表基础之上的查询)
- 6.4.2.1 自连接
- 6.4.2.2 子查询
- 6.4.3 查询
- 6.4.3.1 基础查询
- 6.4.3.2 分页查询
- 6.4.3.3 多子句查询
- 6.4.4.4 合并查询
- 6.4.5 内连接
- 6.4.6 外连接
- 7. 函数
- 7.1统计函数
- 7.2分组统计
- 7.3 数学函数
- 7.4 时间日期
- 7.5 加密函数
- 7.6 流程控制
- 7.7 字符串函数
- 8. 键
- 8.1 NOT NULL(不为空)
- 8.2 UNIQUE(唯一)
- 8.3 PRIMARY KEY(主键)
- 8.4 FOREIGN KEY(外键)
- 8.5 CHECK(检查)
- 9. 自增长
- 9.1 基本语法
- 9.2 三种添加自增长方式
- 9.3 修改自增长
- 9.4 使用细节
- 10. 索引
- 10.1 四种索引介绍
- 10.2 索引机制
- 10.3 创建索引
- 10.4 删除索引
- 10.5 修改索引
- 10.6 查询索引
- 10.7 何时使用索引?
- 11. 事务
- 11.1 事务和锁
- 11.2 MySQL控制事务的几个重要语句
- 11.3 隔离级别
- 11.3.1 如果不考虑隔离性?
- 11.3.2 常用语句
- 11.3.3 四种隔离级别
- 11.4 ACID特性
- 12. 视图
- 13. MySQL管理
- 13.1 常用语句
- 13.2 查看用户权限和密码
- 13.3 用户授权(DCL语句)
- 13.4 回收授权(DCL语句)
- 13.5 刷新权限
- 13.6 细节说明
B站韩顺平:零基础一周学会MySQL
这个有几年了,把资料重整理了,也新增了一些。
1. 基础操作(必须会!)
1.1 修改密码(4种方法)
-
使用
alter user
mysql> alter user 'root'@'localhost' identified by '新密码';
-
使用
mysqladmin
命令[root@localhost ~]# mysqladmin -u用户名 -p旧密码 password 新密码
-
使用
set password
mysql> set password for 用户名@localhost = password('新密码');
-
用
update
直接更新user表mysql> use mysql; mysql> update user set password=password('新密码') where user='用户名' and host='localhost'; mysql> flush privileges;
查询所有用户密码:
SELECT Host,User,authentication_string FROM mysql.user;
1.2 创建新用户
- 创建名为XXX用户,并设置密码
CREATE USER '用户名'@'localhost' IDENTIFIED BY '用户密码';
- 授予XXX用户对所有数据库的完全访问权限
GRANT ALL PRIVILEGES ON *.* TO '用户名'@'localhost';
- 刷新 MySQL 的权限表
FLUSH PRIVILEGES;
1.3 导入数据库
2. SQL四种语言介绍
2.1 DDL(数据库定义语言)
介绍:Data Definition Language,数据库定义语言
作用:
用于定义数据库的三级结构,包括外模式、概念模式、内模式及其相互之间的映像,定义数据的完整性、安全控制等约束。注意:DDL不需要commit。
基本语句:
(1) 创建:CREATE
(2) 修改:ALTER
(3) 删除:DROP
(4) 截断:TRUNCATE
(5) 注释:COMMENT
(6) 重命名:RENAME
2.2 DML(数据操纵语言)
介绍:
Data Manipulation Language,数据操纵语言。DML分成交互型DML和嵌入型DML两类。依据语言的级别, DML又可分成过程性DML和非过程性DML两种。
作用:
由DBMS提供,用于让用户或程序员使用,实现对数据库中数据的操作。注意:DDL需要commit。作用:由DBMS提供,用于让用户或程序员使用,实现对数据库中数据的操作。注意:DDL需要commit。
基本语句:
(1) 选择:SELECT
(2) 插入:INSERT
(3) 更新:UPDATE
(4) 删除:DELETE
(5) 合并:MERGE
(6) 调用:CALL
(7) 执行计划:EXPLAIN PLAN
(8) 锁表:LOCK TABLE
2.3 DCL(数据库控制语言)
介绍:Data Control Language,数据库控制语言
作用:授权,角色控制等
基本语句:
(1) 授权:GRANT
(2) 取消授权:REVOKE
2.4 TCL(事务控制语言)
介绍:Transaction Control Language,事务控制语言
基本语句:
(1) 设置保存点:SAVEPOINT
(2) 回滚:ROLLBACK
(3) 设置事务:SET TRANSACTION
3. 数据库操作
注意:反引号(``
)说明 :目的是规避关键字,包括后面的建表操作中涉及关键字都需要加反引号(``
)。
3.1 创建数据库
CREATE DATABASE 数据库名
3.2 查询数据库
SHOW DATABASES
3.3 删除数据库
DROP DATABASE 数据库名
3.4 备份数据库
注意:
- 如果是Windows下,确保已将MySQL的bin目录加至环境变量中,否则先 cd 到MySQL的bin目录下
- 备份时,如果不写备份目录,会备份到当前文件夹下
导出操作:
(1)导出特定的数据库
mysqldump -u用户名 -p -B [数据库1 数据库2 ... 数据库n] > 文件路径+文件名.sql
(2)备份全部数据库
mysqldump -u用户名 -p -A > 文件路径+文件名.sql
(3)备份数据库中的某张表
mysqldump -u用户名 -p 数据库 表名 > 文件路径+文件名.sql
导出参数:
参数全称 | 简写 | 作用 |
---|---|---|
–user=用户名 | -u用户名/-u 用户名 | 用户名 |
–password[=密码] | -p[密码] | 密码,直接-p的话后面会需要输入密码 |
–host=host_name | –host=host_name | 备份主机名,默认为localhost |
–force | -f | 即使发现sql错误,仍然继续备份 |
–quick | -q | 快速导出 |
-all-databases | -A | 导出全部数据库 |
–databases | -B | 导出n个数据库。参数后面的所有名字都被看作数据库名,用空格隔开。 如果没有该选项,mysqldump把第一个名字参数作为数据库名,后面的作为表名 |
–all-tablespaces | -Y | 导出全部表空间 |
–no-tablespaces | -y | 不导出任何表空间信息 |
–add-drop-database | 每个数据库创建之前添加drop数据库语句 | |
–add-drop-table | 每个数据表创建之前添加drop数据表语句。 (默认为打开状态,使用–skip-add-drop-table取消选项) | |
–add-locks | 在每个表导出之前增加LOCK TABLES并且之后UNLOCK TABLE。 (默认为打开状态,使用–skip-add-locks取消选项) | |
–tables | 覆盖 --databases or -B选项,后面所跟参数被视作表名 | |
–xml | -X | 导出为xml文件 |
–no-data | -d | 只导出表结构只导出表结构 |
–port=端口号 | -P 端口号 | 制定TCP/IP连接时的端口号 |
3.5 恢复数据库
注意:
- 新数据导入,应先建立一个新的数据库用于数据导入(非必须创建新数据库)
- 如果是单纯导入几个表,根据实际情况导入合适的数据库中(导入已有数据库或导入新建数据库)
导入前操作:
- 登录MySQL:
mysql –u用户名 –p
- 新建数据库:
CREATE DATABASE 数据库名
(具体看上面的注意)
正式导入:(3种方法)
(1)将 sql语句 复制值DBMS中全部执行(新建查询语句,直接粘贴执行)
(2)直接导入
mysql -u用户名 -p 数据库 < 文件路径+文件名.sql
(3)使用source导入
-
选择数据库:
use 数据库名
-
导入sql文件:
source 文件路径+文件名.sql
4. 表操作
4.1 创建表
CREATE TABLE 表名(自定义字段...);
4.2 修改表
(1)修改表名
RENAME TABLE 表名 TO 新表名
(2)修改表字符集
ALTER TABLE 表名 CHARACTER SET 字符集
(3)添加列
INSERT INTO 表名 VALUES(数据...)
(4)修改列
UPDATE 表名 SET 列名=新值 WHERE 条件
4.3 删除表
DROP TABLE 表名
4.4 表复制
(1)表表复制
-- 表示把表2中的记录复制到表1中
INSERT INTO 表名1 (字段1, 字段2, ...)
SELECT 字段1, 字段2, ...
FROM 表2
(2)自我复制(蠕虫复制)
-- 自我复制数据
INSERT INTO 表名
SELECT *
FROM 表名
4.5 表结构
-- 查看表结构
DESC 表名DESC 表名
4.6 面试题:如何对表去重?
-
实现思路
- 创建一张临时表,该表的结构和旧表一样;
- 把旧表的记录通过**
DISTINCT
**关键字处理之后复制给新的表; - 将新表名改为旧表名;
- 删除之前的表。
-
实现步骤
按照步骤顺序操作:
CREATE TABLE 新表名 LINK 旧表名 INSERT INTO 新表名 SELECT distinct * FROM 旧表名 -- 通过DISTINCT关键字处理 RENAME TABLE 新表名 TO 旧表名 DROP TABLE 旧表名
5. MySQL数据类型
数据类型,字段类型,列类型它们都是同一个含义。
5.1 数值
数据类型 | 所占空间 | 说明 |
---|---|---|
BIT(M) | 位类型 | M指定位数,默认值1,范围1-64 |
TINYINT [UNSIGNED] | 1个字节 | 带符号的范围是-128到127,无符号0到255。默认有符号 |
SMALLINT [UNSIGNED] | 2个字节 | 带符号是负的215到215-1,无符号0到216-1 |
MEDIUMINT [UNSIGNED] | 3个字节 | 带符号是负的223到223-1 ,无符号0到224-1 |
INT [UNSIGNED] | 4个字节 | 带符号是负的231到231-1,无符号0到232-1 |
BIGINT [UNSIGNED] | 8个字节 | 带符号是负的263到263-1 ,无符号0到264-1 |
FLOAT [UNSIGNED] | 4个字节 | |
DOUBLE [UNSIGNED] | 8个字节 | 表示比float精度更大的小数 |
DECIMAL(M, D) [UNSIGNED] | 定点数M指定长度,D表示小数点的位数 |
5.2 时间日期
数据类型 | 说明 |
---|---|
DATE | 日期类型。格式为:YYYY-MM-DD |
DATETIME | 日期时间类型。格式为:YYYY-MM-DD HH:MM:SS |
TIMESTAMP | 表示时间戳。 可用于自动记录 INSERT 和 UPDATE 操作的时间,但是需要在该类型后加入如下语句: NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP |
5.3 文本和二进制
数据类型 | 说明 |
---|---|
CHAR(size) | 固定长度字符串0~255个[字符] |
VARCHAR(size) | 可变字符串0~65535个[字节],即216-1 注意: 1)1~3个字节用于记录字段的大小(算3个) 2)UTF-8编码:3个字节表示一个字符。65535/3=21844个字符 3)GBK编码:2个字节表示一个字符。 65535/2=32767个字符 |
BLOB | 二进制数据,大小016-1 |
LONGBLOB | 二进制数据,大小0~232-1 |
TEXT | 文本TEXT,大小0~216-1 |
LONGTEXT | 文本TEXT,大小0~232 |
6. 增删改查
6.1 INSERT
插入语句:
(1)单条插入
INSERT INTO 表名(列名...) VALUES(...)
(2)多条插入
INSERT INTO 表名(列名...) VALUES
(...),
(...),
(...)
使用细节:
- 可以用
,
隔开同时添加多条记录 - 数据的长度应在列的规定范围内
- 字符和日期型数据需包含在单引号(
" "
)中 - 插入的数据应与字段的数据类型相同
- 在values中列出的数据位置必须与被加入的排列位置相对应
- 如果是给表中的所有字段添加数据,可以不写前面的字段名称
- 列可以插入空值,前提是该字段允许为空
- 默认值的使用,当不给某个字段时,如果有默认值就会添加,否则报错
6.2 DELETE
DELETE FROM 表名 WHERE 条件
使用细节:
- 如果不加 WHERE,将删除表中所有数据
- DELETE语句不能删除某一列的值,只能使用UPDATE语句将该列的值设置为
NULL
或者‘ ’
- 使用DELETE语句仅删除记录,不能删除表本身,删表使用
DROP TABLE 表名
6.3 UPDATE
UPDATE 表名 SET 列名=新值 WHERE 条件
使用细节:
- 如果不加 WHERE 则对表中的所有数据都进行更新操作
6.4 SELECT
6.4.1 单表
(1)起别名:在SELECT语句中使用【as】语句
(2)使用表达式对查询的列进行运算
(3)ORDER BY语句
(4)WHERE语句常用运算符
6.4.2 多表(单表基础之上的查询)
笛卡尔集【×】
多表查询默认的返回结果
预防小技巧:多表查询的条件不能少于【表的个数-1】,否则会出现笛卡尔集
6.4.2.1 自连接
指同一张表的连接查询
自连接特点:
- 把一张表当成两张表使用
- 需要给表取别名,使用**
表名 表别名
** - 列表不明确时,使用**
列名 AS 列的别名
**指定列的别名
6.4.2.2 子查询
指嵌入在其他SQL语句中的SELECT语句,也叫嵌套查询
(1) 单行子查询:是指只返回一行数据的子查询语句
(2) 多行子查询:是指是指返回多行数据的子查询,使用关键字**IN
**
ALL语句,拓展:可以换成 MAX
ANY语句,拓展:可以换成 MIN
(3) 子查询当临时表使用
(字段1, 字段2, ...) = (字段1, 字段2, ...)
(4) 多列子查询:是指查询返回多个列数据的子查询语句
使用细节:
- **
表.*
**表示将该表所有列都显示出来 - 在多变查询中,只有多个表的列不重复时才可以直接写列名
- 当需要指定显示某个表的列时,需要使用**
表.列
,其中.
**不可省略
6.4.3 查询
6.4.3.1 基础查询
- 使用 WHERE语句
- 使用 LIKE语句(模糊查询), [
%
]:表示0个或多个字符, [_
]:表示单个字符。 - 查询某一列是否为空**
IS NUL
** - 查询表结构
DESC 表名
**注意:**在MySQL中,日期类型可以直接比较,但是需要注意格式
6.4.3.2 分页查询
从START+1行开始读取,去除ROWS行,START从0开始计算
SELECT ... LIMIT START, ROWS
=》推导公式:
SELECT * FROM 表名
ORDER BY 列名
LIMIT 每页显示记录数*(第几页-1), 每页记录数
6.4.3.3 多子句查询
需严格按照顺序编写sql语句
SELECT 列名1, 列名2, 列名3, ...
FROM 表名
GROUP BY 列名
HAVING 过滤条件
ORDER BY ...升序还是降序
LIMIT 开始位置, 结束位置
6.4.4.4 合并查询
UNION ALL
:将两个SELECT语句合并查询,结果不会去重。
UNION
:将两个SELECT语句合并查询,结果会去重。
6.4.5 内连接
内连接是默认连接,查询返回满足条件的所有记录
SELECT ... FROM 表1 JION 表2 ON 条件
6.4.6 外连接
(1) 左外连接:(左侧的表完全显示)
-- 表1 完全显示,包括不满足条件的
SELECT ... FROM 表1 LEFT JION 表2 ON 条件
(2) 右外连接:(右侧的表完全显示)
-- 表2 完全显示,包括不满足条件的
SELECT ... FROM 表1 RIGHT JION 表2 ON 条件
7. 函数
7.1统计函数
函数名 | 作用 |
---|---|
COUNT | 返回行的总数 |
SUM | 返回满足WHERE条件的行的和,一般使用在数值列 |
AVG | 返回满足WHERE条件的一列的平均值,一般使用在数值列 |
MAX | 返回满足WHERE条件的一列的最大值 |
MIN | 返回满足WHERE条件的一列的最小值 |
COUNT(*)
和COUNT(列)
区别
COUNT(*)
返回满足条件的记录的行数COUNT(列)
统计满足条件的某列有多少个时,会排除为NULL的情况
7.2分组统计
(1)GROUP BY
用来对列进行分组统计
SELECT 列名1,列名2... FROM 表名 GROUP BY 列名
(2)HAVING
用来对分组后的结果进行过滤
SELECT 列名1,列名2... FROM 表名
GROUP BY 列名
HAVING ...(过滤条件)
7.3 数学函数
函数名称 | 作用 |
---|---|
ABS(num) | 求绝对值 |
BIN(decimal_number) | 十进制转二进制 |
CEILING(num) | 向上取整,得到比num大的最小整数 |
FLOOR(number) | 向下取整,得到比num小的最大整数 |
CONV(number,from_base,to_base) | 进制转换 |
FORMAT(number,decimal_palces) | 保留小数 |
HEX(decimal_number) | 转十六进制 |
LEAST(num1,num2, … ) | 求最小值 |
MOD(numerator,denominator) | 求余 |
RAND(seed) | 值范围为 0 <= v <=1 .0 |
7.4 时间日期
函数名称 | 作用 |
---|---|
NOW( ) | 当前时间 |
YEAR( ) | Month( ) | DATE( ) | 年 | 月 | 日 |
CURRENT_DATE( ) | 当前日期 |
CURRENT_TIME( ) | 当前时间 |
CURRENT_TIMESTAMP( ) | 当前时间戳 |
DATE(datetime) | 返回datetime的日期部分 |
DATE_ADD(date, INTERVAL d_value, d_type) | 在date上加上日期或时间 |
DATE_SUB(date, INTERVAL d_value, d_type) | 在date上减去一个时间 |
DATEDIFF(date1, date2) | 两个日期差(结果以天为单位) |
TIMEDIFF(date1, date2) | 两个时间差(?小时?分钟?秒 |
FROM_UNIXTIME( ) | 把一个INT的数转换为指定格式的日期,常与UNIX_TIMESTAMP搭配使用 日期格式如下: %Y-%m-%d :年-月-日 %H:%i:%s :时:分:秒 |
UNIX_TIMESTAMP( ) | 返回1970-1-1到现在的秒数 |
实际用途:
在实际开发中经常使用INT来保存一个UNIX时间戳,然后使用**FROM_UNIXTIME()
**进行转换
SELECT FROM_UNIXTIME(1654354645,`%Y-%m-%d`) FROM DUAL
SELECT FROM_UNIXTIME(1654354645,`%Y-%m-%d %H:%i:%s`) FROM DUAL
7.5 加密函数
函数名称 | 作用 |
---|---|
USER() | 查询用户 |
DATABASE() | 数据库名称 |
MD5(str) | 为字符串算出一个MD5 32的字符串,(用户密码)加密 |
PASSWORD(str) | 从原文密码str计算并返回密码字符串,通常用于MySQL用户的密码加密 |
7.6 流程控制
函数名称 | 作用 |
---|---|
IF(expr1, expr2 ,expr3) | 如果expr1为true,则返回expr2,否则返回expr3 |
IFNULL(expr1, expr2) | 如果expr1不为null,则返回expr1,否则返回expr2 |
SELECT CASE WHEN expr1 THEN expr2 WHEN expr3 THEN expr4 …(可以多个表达式) ELSE expr_end END | 如果expr1为true,则返回expr2; 如果expr3为true,则返回expr4; 都不满足,则返回expr_end。 注:左边的表达式可以写成一行,这里分开写是 为了省空间(也好理解) |
7.7 字符串函数
函数名称 | 作用 |
---|---|
CHARSET(str) | 返回字符串集 |
CONCAT(str1, str2) | 连接字符串 |
INSERT(str, substring) | 返回substring在str中出现的位置,没有返回 0 |
UCASE(str) | 将str转成大写 |
LCASE(str) | 将str转成小写 |
LEFT(str, length) | 从str中的左边取length个字符 |
LENGTH(str) | 计算str的长度(注意这里是按照字节计算的) |
REPLACE(str, search_str, replace_str) | 在str中用replace_str代替search_str |
STRCMP(str1, str2) | 逐字符比较两字符串大小 |
SUBSTRING(str, position, length) | 从str的position开始(从1开始计算),取length个字符 |
LTRIM(str) | 去除前端空格(左边的空格) |
RTRIM(str) | 去除后端空格(右边的空格) |
TRIM(str) | 去除两端空格(左右两边的空格) |
8. 键
约束用于确保数据库的数据满足特定的商业规则。
在mysql中,约束包括:NOT NULL
、UNIQUE
、PRIMARY KEY
、FOREIGN KEY
和CHECK
五种
8.1 NOT NULL(不为空)
字段名 字段类型 NOT NULL
作用:如果该列定义了NOT NULL
,则在插入数据时必须为其该列提供数据
8.2 UNIQUE(唯一)
字段名 字段类型 UNIQUE
作用:当定义了唯一约束后,该列值是不能重复的
使用细节:
- 如果没有指定
NOT NULL
,则UNIQUE字段可以有多个NULL - 一张表可以有多个UNIQUE字段
- 如果一个列(字段)是
UNIQUE NOT NULL
使用效果类似 PRIMARY
8.3 PRIMARY KEY(主键)
-- 1.直接在字段名后指定
字段名 PRIMARY KEY
-- 2.在表定义最后写
PRIMARY KEY(列名)
作用:用于唯一标示表行的数据,当定义主键约束后,该列不能重复
使用细节:
-
PRIMARY KEY
不能重复且也不能为NULL -
使用
DESC 表名
,可以看到PRIMARY的情况 -
一张表最多只能有一个主键,但可以是复合主键(用括号包起来定义多个字段为主键)
复合主键举例:
CREATE TABLE tab( id INT, `name` VARCHAR(40), email VARCHAR(40), PRIMARY KEY (id,`name`) -- 复合主键 );
8.4 FOREIGN KEY(外键)
FOREIGN KEY (本表字段名) REFERENCES 主表名(主键名/UNIQUE字段名)
定义规则:
- 外键约束要定义在从表上,主表则必须具有主键约束或是UNIQUE约束。
- 当定义外键约束后,要求外键列数据必须在主表的主键列存在或是为NULL。
作用:用于定义主表和从表之间的关系
使用细节:
- 外键指向的表的字段,要求是
PRIMARY KEY
或者是UNIQUE
----> 对应第一条定义规则 - 表的类型是
innodb
,这样的表才支持外键 - 外键字段的类型要和主键字段的类型一致(长度可以不同)
- 外键字段的值,必须在主键字段中出现过,或者为NULL(前提是外键字段允许为NULL) ----> 对应第二条定义规则
- 一旦建立主外键的关系,数据就不能随意删除。除非把与主键关联的外键所在表的对应数据删除全部,否则主表的数据不能被删除
举例:
-- 主表,班级
CREATE TABLE class_(
id INT PRIMARY KEY,
`name` VARCHAR(40) NOT NULL DEFAULT '',
)
-- 从表,学生
CREATE TABLE student_(
id INT PRIMARY KEY,
`name` VARCHAR(40) NOT NULL DEFAULT '',
class_id INT, -- 班级id
FOREIGN KEY (class_id) REFERENCES class_(id) -- 外键定义
)
8.5 CHECK(检查)
列名 类型 CHECK(条件)
作用:用于强制行数据必须满足某条件
9. 自增长
9.1 基本语法
字段名 整型 PRIMARY KEY AUTO_INCREMENT
9.2 三种添加自增长方式
INSERT INTO 表名 (字段1, 字段2 ...) VALUES(NULL, '值', '值' ...)
INSERT INTO 表名 (字段2 ...) VALUES(NULL, '值', '值' ...)
INSERT INTO 表名 VALUES VALUES(NULL, '值', '值' ...)
9.3 修改自增长
ALTER TABLE 表名 AUTO_INCREMENT = 新的开始值
9.4 使用细节
- 一般来说自增长是和
PRIMARY KEY
配合使用的 - 自增长也可以单独使用,但是需要配合一个UNIQUE
- 自增长修饰的字段为整数型的(虽然小数也可以但是非常非常少这样使用)
- 如果你添加数据时,给自增长字段(列)指定的有值,则以指定的值为准。如果指定了自增长,一般来说,就按照自增长的规则来添加数据
- 自增长默认从1开始,但可修改新开始值
10. 索引
10.1 四种索引介绍
- 普通索引(INDEX)
- 主键索引(PRIMARY KEY):既是主键,又是索引
- 唯一索引(UNIQUE):既是UNIQUE,又是索引
- 全文索引(FULLINDEX):适用与MyISAM,开发中考虑使用Solr和ElasticSearch(ES)
10.2 索引机制
(1) 创建索引的数据结构:二叉树、B树、B+树…
(2) 代价:磁盘占用,对DML(UPDATE DELETE INSERT)语句效率有影响
10.3 创建索引
-- (1) 主键索引
ALTER TABLE 表名 ADD PRIMARY KEY 索引名 (列名)
-- (2) 唯一索引
CREATE UNIQUE INDEX 索引名 ON 表名 (列名)
-- (3) 普通索引:两种方法如下:
CREATE INDEX 索引名 ON 表名 (列名)
ALTER TABLE 表名 ADD INDEX 索引名 (列名)
-- (4) 全文索引
10.4 删除索引
-- (1) 索引:
DROP INDEX 索引名 ON 表名
-- (2) 主键索引:
ALTER TABLE 表名 DROP PRIMARY KEY
10.5 修改索引
先删除索引,再添加新的索引即可
10.6 查询索引
四种方法查询:
SHOW INDEX FROM 表名 -- (1)
SHOW INDEXS FROM 表名 -- (2)
SHOW KEYS FROM 表名 -- (3)
DESC 表名 -- (4)不推荐
10.7 何时使用索引?
适合:较频繁的作为查询条件的字段应该创建索引。
不适合:
- 唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件
- 更新非常频繁的字段(列)不适合创建索引
- 不会出现在WHERE子句中字段(列)不该创建索引
11. 事务
事务是用于保证数据的一致性,它由一组相关的DML语句组成,该组的的DML语句要么全部成功,要么全部失败。
11.1 事务和锁
当执行事务操作时(DML语句),MySQL会在表上加锁,防止其他用户更改表的数据。
11.2 MySQL控制事务的几个重要语句
语句 | 作用 |
---|---|
START TRANSACTION | 开始一个事务 |
SAVEPOINT | 设置保存点 |
ROLLBACK TO | 回退到某点的事务 |
ROLLBACK | 回退全部事务(回到最初的起点) |
COMMIT | 提交事务,所有操作生效,锁释放,不能回退 |
11.3 隔离级别
概念:MySQL隔离级别定义了事务与事务之间的隔离程度
基本介绍:多个连接开启各自事务操作数据库时,数据库系统要负责隔离操作,以保证各个连接在获取数据时的准确性(通俗的解释)。
11.3.1 如果不考虑隔离性?
可能会导致如下问题:
- 脏读:当一个事务读取另一个事务尚未提交的改变
- 不可重复读:同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除导致每次返回不同的结果集,此时发生不可重复读
- 幻读:同一查询结果在同一事物中多次进行,由于其他提交事务所做的插入操作导致每次返回的不同结果集,此时发生幻读
11.3.2 常用语句
(1) 查看当前事务的隔离级别
SELECT @@TX_ISOLATION
(2) 查看系统当前隔离级别
SELECT @@GLOBAL.TX_IOSLATION
(3) 设置当前会话隔离级别
SET SESSION TRANSCATION ISOLATION LEVEL 隔离级别
(4) 设置当前系统隔离级别
SET GLOBAL TRANSCATION ISOLATION LEVEL 隔离级别
(5) 全局修改,操作如下(5) 全局修改,操作如下:
1)找到【my.ini】配置文件
2)行末添加:TRANSACTION-ISOLATION = 隔离级别
注:MySQL默认的事务隔离级别是【REPEATABLE READ】,没有特殊需求的话不需更改
11.3.3 四种隔离级别
| — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — |
| MySQL隔离级别 | 脏读 | 不可重复读 | 幻读 | 加锁读 |
| — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — |
| 读未提及(READ UNCOMMITTED) | ✔ | ✔ | ✔ | 不加锁 |
| — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — |
| 读已提交(READ COMMITTED) | ✖ | ✔ | ✔ | 不加锁 |
| — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — |
| 可重复度(REPEATABLE READ) | ✖ | ✖ | ✖ | 不加锁 |
| — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — |
| 可串行化(SERIALIZABLE) | ✖ | ✖ | ✖ | 加锁 |
| — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — |
注:✔代表可能出现,✖代表不会出现
11.4 ACID特性
-
原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
-
一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另外一个一致性状态
-
隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离
-
持久性(Durablity)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的。接下来即使数据库发生故障也不应该对其有任何影响
12. 视图
基本概念:
视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含列,其数据来自对应的真实表(基表)。
创建视图:
-- (1) 利用表
CREATE VIEW 视图名 AS SELECT 列名... FROM 表名
-- (2) 利用视图
CREATE VIEW 视图名 AS SELECT 列名... FROM 视图名
视图总结:
- 视图是根据基表(可以是多个基表)来创建的视图是虚拟的表
- 视图也有列,数据来自基表
- 通过视图可以修改基表的数据
- 基表的改变,也会影响到视图的数据
13. MySQL管理
13.1 常用语句
-- (1) 创建用户
CREATE USER '用户名'@'允许登录的位置' IDENTIFIED BY '密码'
-- (2) 删除用户
DROP USER '用户名'@'允许登录的位置'
-- (3) 用户修改自己密码
SET PASSWORD = PASSWORD('新密码')
-- (4) 修改他人密码,前提有【修改用户密码权限】,如下:
SET PASSWORD FOR '用户名'@'允许登录的位置' = PASSWORD('新密码')
13.2 查看用户权限和密码
(1) 查看所有用户和其权限
SELECT * FROM mysql.user;
(2) 查看部分
SELECT Host,User,authentication_string FROM mysql.user;
user表中重要字段说明如下:
- Host :允许登录的位置,如果是显示localhost则表示只允许本机登录
- user:用户名称
- authentication_string:用户加密过后密码
13.3 用户授权(DCL语句)
(1) 给用户授权
GRANT 权限列表 ON 库.对象名 TO '用户名'@'允许登录的位置' INDENTIFIED BY '密码'
(2) 给用户授予所有权限
GRANT ALL ON 库.对象名 TO ...(接上面)
使用细节:
-
权限列表用逗号隔开;
-
.
:本系统中的所有数据库对象(表、视图和存储过程等) -
库.*
:该数据库中的所有数据对象(表、视图和存储过程等) -
INDENTIFIED BY '密码'
可以省略,不省略情况如下: ① 用户已存在情况:修改用户的密码
② 用户不存在情况:创建该用户,并设置密码
13.4 回收授权(DCL语句)
REVOKE 权限列表 ON 库.对象名 FROM '用户名'@'允许登录的位置'
13.5 刷新权限
FLUSH PRIVILEGES
13.6 细节说明
(1) 创建用户的时,如果不指定Host,则为%
CREATE USER ... -- 该用户在哪都可以登录连接
(2)指定部分网段
-- % 表示所有IP都有连接权限
-- 用户在192.168.1.*的ip可以登录连接
CREATE USER '用户名'@'192.168.1.%’
(3) 删除用户的时,如果Host不是%,则需明确指定'用户名'@'Host值'
end.