零基础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.rhkb.cn/news/359619.html

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

相关文章

【ArcGIS微课1000例】0120:ArcGIS批量修改符号的样式(轮廓)

ArcGIS可以批量修改符号的样式,如样式、填充颜色、轮廓等等。 文章目录 一、加载实验数据二、土地利用符号化三、批量修改符号样式四、注意事项一、加载实验数据 订阅专栏后,从私信查收专栏配套的完整实验数据包,打开0120.rar中的土地利用数据,如下图所示: 查看属性表: …

SpringMVC系列十: 中文乱码处理与JSON处理

文章目录 中文乱码处理自定义中文乱码过滤器Spring提供的过滤器处理中文 处理json和HttpMessageConverter<T>处理JSON-ResponseBody处理JSON-RequestBody处理JSON-注意事项和细节HttpMessageConverter<T\>文件下载-ResponseEntity<T\>作业布置 上一讲, 我们学…

python判断语句

目录 布尔类型和比较运算符if语句的基本格式if else 语句if elif else 语句判断语句的嵌套 布尔类型和比较运算符 1、布尔类型 bool布尔类型只有两个结果&#xff1a;真或假 布尔类型的字面量&#xff1a; True 表示真&#xff08;是、肯定&#xff09; False 表示假&#x…

【论文精读】ViM: Out-Of-Distribution with Virtual-logit Matching 使用虚拟分对数匹配的分布外检测

文章目录 一、文章概览&#xff08;一&#xff09;问题来源&#xff08;二&#xff09;文章的主要工作&#xff08;三&#xff09;相关研究 二、动机&#xff1a;Logits 中缺失的信息&#xff08;一&#xff09;logits&#xff08;三&#xff09;基于零空间的 OOD 评分&#xf…

[leetcode]add-strings 字符串相加

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:string addStrings(string num1, string num2) {int i num1.length() - 1, j num2.length() - 1, add 0;string ans "";while (i > 0 || j > 0 || add ! 0) {int x i > 0 ? num1[i…

msvcp120.dll丢失怎么办,找不到msvcp120.dll的多种解决方法

最近&#xff0c;我在运行一个程序时遇到了一个错误&#xff0c;系统提示找不到msvcp120.dll文件&#xff0c;无法继续执行代码。这让我感到非常困扰&#xff0c;因为这个问题导致我无法正常运行这个程序。经过一番搜索和尝试&#xff0c;我找到了几种修复这个问题的方法&#…

pdf转图片转换器,pdf转图片的工具

在日常的工作和学习中&#xff0c;我们经常会遇到需要将PDF文件转换为图片格式的情况。那么&#xff0c;如何才能将PDF格式转换为图片格式呢&#xff1f;今天&#xff0c;我将为大家介绍几种简单易用的方法&#xff0c;帮助大家轻松实现PDF转图片。 打开“轻云pdf处理官网网站”…

WEB界面上使用ChatGPT

&#xff08;作者&#xff1a;陈玓玏&#xff09; 开源项目&#xff0c;欢迎star哦&#xff0c;https://github.com/tencentmusic/cube-studio 随着大模型不断发展&#xff0c;现在无论写代码&#xff0c;做设计&#xff0c;甚至老师备课、评卷都可以通过AI大模型来实现了&…

后端实现预览pdf,mp4,图片

PDF预览 /*** pdf预览* param response*/RequestMapping(value "/preview")public void showPdf(HttpServletResponse response) {try {//String filePath this.getClass().getClassLoader().getResource("../../static/pdf/readme.pdf").getPath();Stri…

线程池概念、线程池的不同创建方式、线程池的拒绝策略

文章目录 &#x1f490;线程池概念以及什么是工厂模式&#x1f490;标准库中的线程池&#x1f490;什么是工厂模式&#xff1f;&#x1f490;ThreadPoolExecutor&#x1f490;模拟实现线程池 &#x1f490;线程池概念以及什么是工厂模式 线程的诞生是因为&#xff0c;频繁的创…

【Godot4自学手册】第四十二节实现拖拽进行物品交换和数量叠加

这一节我们主要学习背包系统中的物品拖拽后&#xff0c;物品放到新的位置&#xff0c;或交换物品位置&#xff0c;如果两个物品属于同一物品则数量相加。具体效果如下&#xff1a; 一、修改item.tscn场景 给item.tscn场景的根节点Item添加Label子节点&#xff0c;命名为Numv…

[RPI4] 树莓派4b安装istoreos及使用 -- 1. 系统安装

最近在研究家庭智能化的一些东西,其中包括网络,智能家居等一系列内容,然后看过的资料有的想再回来看的时候就找不到了,然后就想着开这么一个系列,做一些记录,先从智能家居开始吧。 1 安装istoreos系统 iStoreOS 目标是提供一个人人会用的路由兼轻 NAS 系统,不管是作为路…

Java包介绍

今天看jdk文档&#xff0c;顺便写一下java几个包的作用。 java.applet 主要用于创建java applet小应用程序&#xff0c;可以嵌入到网页中能够呈现出特殊的效果&#xff0c;现在基本已经被废弃&#xff0c;很少使用。 java.awt AWT 是Abstract Window ToolKit (抽象窗口工具包…

我原以为政务类网站不追求漂亮,打脸啦,漂亮得颠覆你认知。

我原本以为政务类网站一定时沉稳、工整、信息量大的&#xff0c;这些和漂流都关联不上&#xff0c;直到最近看了一些网站&#xff0c;发现我的认识狭隘了。 政务类网站的设计风格通常需要注重以下几个方面&#xff1a; 稳重和专业感&#xff1a; 政务类网站需要给人以稳重、正…

perfect-scrollbar缩小浏览器窗口滚动条无线滚动的bug

https://github.com/mdbootstrap/perfect-scrollbar/issues/153

项目实践---Windows11中安装Zookeeper/Hadoop/Hive的部分问题解决

一.Hadoop与Hive兼容版本选择 正常来说&#xff0c;Hadoop与Hive版本不兼容会出现很多问题导致hive安装失败&#xff0c;可以先确定HIve的版本&#xff0c;比如&#xff1a;要用Hive3.1.2版本&#xff0c;该如何确定使用Hadoop的版本呢&#xff0c;需要我们在hive源码中找到对…

Python 类对象

Python 类对象 经典迭代器 可迭代对象的定义&#xff1a; 使用内置的iter可以获取迭代器的对象。如果对象实现了能返回迭代器的__iter__方法&#xff0c;那么对象就是可迭代的。序列都可以迭代。实现了__getitem__方法&#xff0c;而且接受从0开始的索引&#xff0c;这种对象也…

大型语言模型(LLM)和多模态大型语言模型(MLLM)的越狱攻击

随着大型语言模型&#xff08;LLMs&#xff09;的快速发展&#xff0c;它们在各种任务上表现出了卓越的性能&#xff0c;有效地遵循指令以满足多样化的用户需求。然而&#xff0c;随着这些模型遵循指令的能力不断提升&#xff0c;它们也越来越成为对抗性攻击的目标&#xff0c;…

vscode用vue框架1写一个登陆页面

目录 一、创建登录页面 二、构建好登陆页面的路由 三、编写登录页代码 1.添加基础结构 2.给登录页添加背景 3.解决填充不满问题 4.我们把背景的红颜色替换成背景图&#xff1a; 5.在页面中央添加一个卡片来显示登录页面 6.设置中间卡片页面的左侧 7.设置右侧的样式及…

记录react实现选择框一二级联动出现的问题

需求&#xff1a;用户在选择第一个选择框的选项后&#xff0c;第二个选择框的选项会根据第一个选择框的选择动态更新。如图所示 出现的问题 一级分类选择之后二级分类没有数据&#xff0c;第二次重新选择一级分类的时候&#xff0c;二级分类就会有值。 第一次点击截图&#x…