零基础MySQL完整学习笔记

零基础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种方法)

  1. 使用alter user

    mysql> alter user 'root'@'localhost' identified by '新密码';
    
  2. 使用mysqladmin命令

    [root@localhost ~]# mysqladmin -u用户名 -p旧密码 password 新密码
    
  3. 使用set password

    mysql> set password for 用户名@localhost = password('新密码');
    
  4. 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 创建新用户

  1. 创建名为XXX用户,并设置密码
CREATE USER '用户名'@'localhost' IDENTIFIED BY '用户密码';
  1. 授予XXX用户对所有数据库的完全访问权限
GRANT ALL PRIVILEGES ON *.* TO '用户名'@'localhost';
  1. 刷新 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 恢复数据库

注意

  • 新数据导入,应先建立一个新的数据库用于数据导入(非必须创建新数据库)
  • 如果是单纯导入几个表,根据实际情况导入合适的数据库中(导入已有数据库或导入新建数据库)

导入前操作

  1. 登录MySQL:mysql –u用户名 –p
  2. 新建数据库:CREATE DATABASE 数据库名(具体看上面的注意)

正式导入:(3种方法)

(1)将 sql语句 复制值DBMS中全部执行(新建查询语句,直接粘贴执行)

(2)直接导入

mysql -u用户名 -p 数据库 < 文件路径+文件名.sql

(3)使用source导入

  1. 选择数据库:use 数据库名

  2. 导入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, ...FROM2

(2)自我复制(蠕虫复制)

-- 自我复制数据
INSERT  INTO  表名SELECT  *FROM  表名

4.5 表结构

-- 查看表结构
DESC  表名DESC  表名

4.6 面试题:如何对表去重?

  • 实现思路

    1. 创建一张临时表,该表的结构和旧表一样;
    2. 把旧表的记录通过**DISTINCT**关键字处理之后复制给新的表;
    3. 将新表名改为旧表名;
    4. 删除之前的表。
  • 实现步骤

    按照步骤顺序操作:

    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
(...), 
(...),
(...)

使用细节:

  1. 可以用,隔开同时添加多条记录
  2. 数据的长度应在列的规定范围内
  3. 字符和日期型数据需包含在单引号(" ")中
  4. 插入的数据应与字段的数据类型相同
  5. 在values中列出的数据位置必须与被加入的排列位置相对应
  6. 如果是给表中的所有字段添加数据,可以不写前面的字段名称
  7. 列可以插入空值,前提是该字段允许为空
  8. 默认值的使用,当不给某个字段时,如果有默认值就会添加,否则报错

6.2 DELETE

DELETE  FROM  表名  WHERE  条件

使用细节:

  1. 如果不加 WHERE,将删除表中所有数据
  2. DELETE语句不能删除某一列的值,只能使用UPDATE语句将该列的值设置为NULL或者‘ ’
  3. 使用DELETE语句仅删除记录,不能删除表本身,删表使用DROP TABLE 表名

6.3 UPDATE

UPDATE  表名  SET 列名=新值  WHERE  条件

使用细节

  1. 如果不加 WHERE 则对表中的所有数据都进行更新操作

6.4 SELECT

6.4.1 单表

(1)起别名:在SELECT语句中使用【as】语句

(2)使用表达式对查询的列进行运算

(3)ORDER BY语句

(4)WHERE语句常用运算符

6.4.2 多表(单表基础之上的查询)

笛卡尔集【×】

多表查询默认的返回结果

预防小技巧:多表查询的条件不能少于【表的个数-1】,否则会出现笛卡尔集

6.4.2.1 自连接

指同一张表的连接查询

自连接特点

  1. 把一张表当成两张表使用
  2. 需要给表取别名,使用**表名 表别名**
  3. 列表不明确时,使用**列名 AS 列的别名**指定列的别名
6.4.2.2 子查询

指嵌入在其他SQL语句中的SELECT语句,也叫嵌套查询

(1) 单行子查询:是指只返回一行数据的子查询语句

(2) 多行子查询:是指是指返回多行数据的子查询,使用关键字**IN**
ALL语句,拓展:可以换成 MAX
ANY语句,拓展:可以换成 MIN

(3) 子查询当临时表使用

(字段1, 字段2,  ...) = (字段1, 字段2, ...)

(4) 多列子查询:是指查询返回多个列数据的子查询语句

使用细节:

  1. **表.***表示将该表所有列都显示出来
  2. 在多变查询中,只有多个表的列不重复时才可以直接写列名
  3. 当需要指定显示某个表的列时,需要使用**表.列,其中.**不可省略
6.4.3 查询
6.4.3.1 基础查询
  1. 使用 WHERE语句
  2. 使用 LIKE语句(模糊查询), [%]:表示0个或多个字符, [_]:表示单个字符。
  3. 查询某一列是否为空**IS NUL**
  4. 查询表结构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  ...  FROM1  JION 表2  ON  条件
6.4.6 外连接

(1) 左外连接:(左侧的表完全显示)

-- 表1 完全显示,包括不满足条件的
SELECT  ...  FROM1  LEFT  JION  表2  ON  条件

(2) 右外连接:(右侧的表完全显示)

-- 表2 完全显示,包括不满足条件的
SELECT  ...  FROM1  RIGHT  JION  表2  ON  条件

7. 函数

7.1统计函数

函数名作用
COUNT返回行的总数
SUM返回满足WHERE条件的行的和,一般使用在数值列
AVG返回满足WHERE条件的一列的平均值,一般使用在数值列
MAX返回满足WHERE条件的一列的最大值
MIN返回满足WHERE条件的一列的最小值

COUNT(*)COUNT(列)区别

  1. COUNT(*) 返回满足条件的记录的行数
  2. 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 NULLUNIQUEPRIMARY KEYFOREIGN KEYCHECK五种

8.1 NOT NULL(不为空)

字段名  字段类型  NOT  NULL

作用:如果该列定义了NOT NULL,则在插入数据时必须为其该列提供数据

8.2 UNIQUE(唯一)

字段名  字段类型  UNIQUE

作用:当定义了唯一约束后,该列值是不能重复的

使用细节

  1. 如果没有指定 NOT NULL,则UNIQUE字段可以有多个NULL
  2. 一张表可以有多个UNIQUE字段
  3. 如果一个列(字段)是UNIQUE NOT NULL使用效果类似 PRIMARY

8.3 PRIMARY KEY(主键)

-- 1.直接在字段名后指定
字段名  PRIMARY  KEY-- 2.在表定义最后写
PRIMARY  KEY(列名)

作用:用于唯一标示表行的数据,当定义主键约束后,该列不能重复

使用细节

  1. PRIMARY KEY不能重复且也不能为NULL

  2. 使用DESC 表名,可以看到PRIMARY的情况

  3. 一张表最多只能有一个主键,但可以是复合主键(用括号包起来定义多个字段为主键)

    复合主键举例:

    CREATE TABLE tab(id INT,`name` VARCHAR(40),email  VARCHAR(40),PRIMARY KEY (id,`name`) -- 复合主键
    );
    

8.4 FOREIGN KEY(外键)

FOREIGN KEY (本表字段名) REFERENCES 主表名(主键名/UNIQUE字段名)

定义规则

  1. 外键约束要定义在从表上主表则必须具有主键约束或是UNIQUE约束
  2. 当定义外键约束后,要求外键列数据必须在主表的主键列存在或是为NULL

作用:用于定义主表和从表之间的关系

使用细节

  1. 外键指向的表的字段,要求是PRIMARY KEY或者是UNIQUE ----> 对应第一条定义规则
  2. 表的类型是innodb,这样的表才支持外键
  3. 外键字段的类型要和主键字段的类型一致(长度可以不同)
  4. 外键字段的值,必须在主键字段中出现过,或者为NULL(前提是外键字段允许为NULL) ----> 对应第二条定义规则
  5. 一旦建立主外键的关系,数据就不能随意删除。除非把与主键关联的外键所在表的对应数据删除全部,否则主表的数据不能被删除

举例

-- 主表,班级
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, -- 班级idFOREIGN 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 使用细节

  1. 一般来说自增长是和PRIMARY KEY配合使用的
  2. 自增长也可以单独使用,但是需要配合一个UNIQUE
  3. 自增长修饰的字段为整数型的(虽然小数也可以但是非常非常少这样使用)
  4. 如果你添加数据时,给自增长字段(列)指定的有值,则以指定的值为准。如果指定了自增长,一般来说,就按照自增长的规则来添加数据
  5. 自增长默认从1开始,但可修改新开始值

10. 索引

10.1 四种索引介绍

  1. 普通索引(INDEX)
  2. 主键索引(PRIMARY KEY):既是主键,又是索引
  3. 唯一索引(UNIQUE):既是UNIQUE,又是索引
  4. 全文索引(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 何时使用索引?

适合:较频繁的作为查询条件的字段应该创建索引。

不适合

  1. 唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件
  2. 更新非常频繁的字段(列)不适合创建索引
  3. 不会出现在WHERE子句中字段(列)不该创建索引

11. 事务

事务是用于保证数据的一致性,它由一组相关的DML语句组成,该组的的DML语句要么全部成功,要么全部失败。

11.1 事务和锁

当执行事务操作时(DML语句),MySQL会在表上加锁,防止其他用户更改表的数据。

11.2 MySQL控制事务的几个重要语句

语句作用
START TRANSACTION开始一个事务
SAVEPOINT设置保存点
ROLLBACK TO回退到某点的事务
ROLLBACK回退全部事务(回到最初的起点)
COMMIT提交事务,所有操作生效,锁释放,不能回退

11.3 隔离级别

概念:MySQL隔离级别定义了事务与事务之间的隔离程度

基本介绍:多个连接开启各自事务操作数据库时,数据库系统要负责隔离操作,以保证各个连接在获取数据时的准确性(通俗的解释)。

11.3.1 如果不考虑隔离性?

可能会导致如下问题:

  1. 脏读:当一个事务读取另一个事务尚未提交的改变
  2. 不可重复读:同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除导致每次返回不同的结果集,此时发生不可重复读
  3. 幻读:同一查询结果在同一事物中多次进行,由于其他提交事务所做的插入操作导致每次返回的不同结果集,此时发生幻读
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特性

  1. 原子性(Atomicity)

    原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生

  2. 一致性(Consistency)

    事务必须使数据库从一个一致性状态变换到另外一个一致性状态

  3. 隔离性(Isolation)

    事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离

  4. 持久性(Durablity)

    持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的。接下来即使数据库发生故障也不应该对其有任何影响


12. 视图

基本概念

​ 视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含列,其数据来自对应的真实表(基表)。

创建视图

-- (1) 利用表
CREATE  VIEW  视图名  AS  SELECT  列名...  FROM  表名-- (2) 利用视图
CREATE  VIEW  视图名  AS  SELECT  列名...  FROM  视图名

视图总结

  1. 视图是根据基表(可以是多个基表)来创建的视图是虚拟的表
  2. 视图也有列,数据来自基表
  3. 通过视图可以修改基表的数据
  4. 基表的改变,也会影响到视图的数据

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表中重要字段说明如下

  1. Host :允许登录的位置,如果是显示localhost则表示只允许本机登录
  2. user:用户名称
  3. authentication_string:用户加密过后密码

13.3 用户授权(DCL语句)

(1) 给用户授权

GRANT  权限列表  ON.对象名  TO  '用户名'@'允许登录的位置'  INDENTIFIED  BY  '密码'

(2) 给用户授予所有权限

GRANT  ALL  ON.对象名  TO  ...(接上面)

使用细节

  1. 权限列表用逗号隔开;

  2. .:本系统中的所有数据库对象(表、视图和存储过程等)

  3. 库.*:该数据库中的所有数据对象(表、视图和存储过程等)

  4. 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.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/33559.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

聊聊 oracle varchar2 字段的gbk/utf8编码格式和字段长度问题

聊聊 oracle varchar2 字段的gbk/utf8编码格式和字段长度问题 1 问题现象 最近在排查某客户现场的数据同步作业报错问题时&#xff0c;发现了部分 ORACLE 表的 varchar2 字段&#xff0c;因为上游 ORACLE数据库采用 GBK 编码格式&#xff0c;而下游 ORACLE 数据库采用UTF8 编…

封装了一个优雅的iOS转场动画

效果图 代码 // // LBTransition.m // LBWaterFallLayout_Example // // Created by mac on 2024/6/16. // Copyright © 2024 liuboliu. All rights reserved. //#import "LBTransition.h"interface LBPushAnimation:NSObject<UIViewControllerAnimated…

【服务器02】之【阿里云平台】

百度一下阿里云官网 点击注册直接使用支付宝注册可以跳过认证 成功登录后&#xff0c;点击产品 点击免费试用 点击勾选 选一个距离最近的 点满GB 注意&#xff1a;一般试用的时用的是【阿里云】&#xff0c;真正做项目时用的是【腾讯云】 现在开始学习使用&#xff1a; 首先…

串口接收不定长数据实现思路

目录 帧头帧尾标志法&#xff1a; 长度字段法&#xff1a; 超时等待法&#xff1a; 基于STM32串口中断的方法&#xff1a; 基于回调函数的方法&#xff1a; 基于定长数据的方法&#xff08;如果数据包长度固定且已知&#xff09;&#xff1a; 串口实现不定长数据接收通常…

2024年综合艺术与媒体传播国际会议(ICIAMC 2024)

2024年综合艺术与媒体传播国际会议(ICIAMC 2024) 2024 International Conference on Integrated Arts and Media Communication (ICIAMC 2024) 会议地点&#xff1a;贵阳&#xff0c;中国 网址&#xff1a;www.iciamc.com 邮箱: iciamcsub-conf.com 投稿主题请注明:ICIAMC…

Java中如何处理ArithmeticException异常?

Java中如何处理ArithmeticException异常&#xff1f; 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在Java编程中&#xff0c;ArithmeticException异常是开发…

【Python机器学习】DBSCAN(具有噪声的基于密度的空间聚类应用)

DBSCAN&#xff08;具有噪声的基于密度的空间聚类应用&#xff09;是一种非常有用的聚类算法&#xff0c;它的主要优点是不需要用户先验地设置簇的个数&#xff0c;可以划分具有复杂形状的簇&#xff0c;还可以找出不属于任何簇的点。DBSCAN比凝聚聚类和k均值稍慢&#xff0c;但…

常见加密方式:MD5、DES/AES、RSA、Base64

16/32位的数据&#xff0c;最有可能就是使用md5加密的 使用对称加密的时候&#xff0c;双方使用相同的私钥 私钥&#xff1a;单独请求/隐藏在前端的隐藏标签当中 二、RSA非对称密钥加密 公钥加密&#xff0c;私钥解密 私钥是通过公钥计算生成的 加密解密算法都在js源文件当…

简单了解java中的File类

1、File类 1.1、概述 File对象就表示一个路径&#xff0c;可以是文件路径也可以是文件夹路径&#xff0c;这个路径可以 是存在的&#xff0c;也可以是不存在的。 1.2、常见的构造方法 方法名称说明public File&#xff08;String pathname&#xff09;根据文件路径创建文件…

0620# C++八股记录

如何防止头文件被重复包含 1. 使用宏定义&#xff08;Include Guards&#xff09; #ifndef HEADER_FILE_NAME_H #define HEADER_FILE_NAME_H// 头文件的内容#endif // HEADER_FILE_NAME_H例如&#xff0c;假设有一个头文件名为example.h&#xff0c;可以这样编写&#xff1a;…

U盘数据恢复全攻略:从原理到实践

一、引言&#xff1a;为何U盘数据恢复至关重要 在信息化时代&#xff0c;U盘作为便携存储设备&#xff0c;广泛应用于各个领域。然而&#xff0c;U盘数据的丢失往往给个人和企业带来极大的困扰。数据丢失的原因多种多样&#xff0c;可能是误删除、格式化、文件系统损坏&#x…

session 共享、Nginx session 共享、Token、Json web Token 【JWT】等认证

.NET JWT JWT 》》Json Web Token header . payload . Signature 三部分组成 JWT 在线生成 》》 https://jwt.io/ 》》https://tooltt.com/jwt-encode/ 》》解码工具 https://tool.box3.cn/jwt.html JWT 特点 无状态 JWT不需要在服务端存储任何状态&#xff0c;客户端可以携…

【FFMPEG+Mediamtx】 本地RTSP测试推流记录

利用本地FFMPEGMediamtx 搭建本地RTSP测试推流电脑摄像头 起因 本来要用qt的qml的Video做摄像头测试。 &#x1f614;但是&#xff0c;不在现场&#xff0c;本地测试&#xff0c;又要测试rtsp流&#xff0c;又因为搜了一圈找不到一个比较好的在线测试rtsp推流网址&#x1f6…

自从用了这个 69k star 的项目,前端小姐姐再也不催我了

一般在开发前后端分离的项目时&#xff0c;双方会定义好前后端交互的 http 接口&#xff0c;根据接口文档各自进行开发。这样并行开发互不耽误&#xff0c;开发好后做个联调就可以提测了。 不过最近也不知道怎么回事&#xff0c;公司新来的前端小姐姐总是在刚开始开发的时候就…

全行业通用商城小程序源码

一站式购物新体验 一、引言&#xff1a;开启数字化购物新时代 在数字化快速发展的今天&#xff0c;小程序成为了商家们连接消费者的重要桥梁。特别是“全行业通用商城小程序”&#xff0c;以其便捷的购物体验和多样化的功能&#xff0c;成为了越来越多商家和消费者的首选。本…

嵌入式STM32F103项目实例可以按照以下步骤进行构建和实现

嵌入式STM32F103项目实例可以按照以下步骤进行构建和实现&#xff1a; 1. 项目概述 目标&#xff1a;演示STM32F103开发板的基本功能&#xff0c;通过LED闪烁来实现。硬件需求&#xff1a;STM32F103开发板、LED灯、杜邦线、USB转串口模块&#xff08;可选&#xff0c;用于调试…

Day12 单调栈 下一个最大元素

503. 下一个更大元素 II 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序&#xff0c;这个数字之后的第一个比它更大的数…

[AIGC] 动态规划的类型以及在 LeetCode 上的应用

动态规划是一种解决问题的优秀策略&#xff0c;它适用于涉及优化问题、组合问题及最短路径问题等领域。下面我们来探究几类常见的动态规划问题&#xff0c;并提供相应的 LeetCode 题目以及 Java 代码实现。 文章目录 1. 一维动态规划2. 二维动态规划3. 背包型动态规划 1. 一维动…

Unity URP简单烘焙场景步骤

Unity URP简单烘焙场景步骤 前言项目场景布置灯光模型Lighting设置环境设置烘焙前烘焙后增加角色 问题解决黑斑硬边清理缓存 参考 前言 项目中要烘焙一个3D场景&#xff0c;用的URP渲染管线&#xff0c;简单记录一下。 项目 场景布置 灯光 因为场景中有能动的东西&#xf…

JAVA每日作业day6.24

ok了家人们今天学习了一些关键字&#xff0c;用法和注意事项&#xff0c;静态代码块这些知识&#xff0c;闲话少叙我们一起看看吧。 一&#xff0c;final关键字 1.1 final关键字的概述 final&#xff1a; 不可改变。可以用于修饰类、方法和变量。 类&#xff1a;被修饰的类&a…