零基础MySQL完整学习笔记

news2024/10/6 22:28:50

零基础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, -- 班级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 使用细节

  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.coloradmin.cn/o/1859363.html

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

相关文章

SpringCloud分布式微服务链路追踪方案:Zipkin

创作博客的目的是希望将自己掌握的知识系统地整理一下&#xff0c;并以博客的形式记录下来。这不仅是为了帮助其他有需要的人查阅相关内容&#xff0c;也是为了自己能够更好地巩固和加深对这些知识的理解。创作的时候也是对自己所学的一次复盘和总结&#xff0c;在创作的过程中…

python爬虫需要什么HTTP代理?

用来爬虫的话&#xff0c;还是建议用高匿名代理&#xff0c;但显然题主用了高匿名代理还是出现了一部分问题&#xff0c;我们可以先找到问题关键再解决它&#xff0c;一般爬虫用了高匿名代理出现被封会有以下几种原因&#xff1a; 1.代理IP的质量不过关 一般来说每个网站都有…

AI写文章生成器,这些工具都可以一键智能生成文章

在AI技术快速发展的今天&#xff0c;AI写作生成器成为我们创作内容的重要工具&#xff0c;它可以提高我们的写作效率&#xff0c;节省时间和精力。下面小编就来和大家分享几款优秀的AI写作生成器&#xff0c;帮助你快速生成高质量的文章。 1.专业AI写作工具-文章在线生成器 专…

ChatGPT对那些带有残疾迹象的简历有偏见——但它可以改善

ChatGPT对那些带有残疾迹象的简历有偏见——但它可以改善 去年&#xff0c;华盛顿大学(University of Washington)研究生凯特•格拉兹科(Kate Glazko)在寻找研究实习机会时注意到&#xff0c;招聘人员在网上发布消息称&#xff0c;他们使用OpenAI的ChatGPT和其他人工智能工具来…

如何模拟一个具有网络管理功能的被测件的一些思路

不知道大家有没有遇到过这个问题&#xff1f; 当我们在学习如何测试网络管理时&#xff0c;难题不在于如何编写测试脚本&#xff0c;而是编写完测试脚本后&#xff0c;没有真实被测件来让我们执行测试脚本&#xff0c;进而调试脚本。这也是我在给大家讲CANoe工具和CAPL编程语言…

Android Media Framework(八)OMXNodeInstance - Ⅰ

OpenMAX框架的学习有两大难点&#xff0c;一是组件的状态切换与buffer的流转过程&#xff0c;这部分内容我们已经在IL Spec中学习过了&#xff1b;二是OMX组件使用的buffer类型与buffer分配过程&#xff0c;这一节我们来重点剖析OMX组件使用的buffer类型。 1、引言 在实际应用…

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

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

c++分隔字符串

可以使用getline函数。 有两个版本&#xff1a; 至于为什么可以使用getline函数返回值作为while的判断条件&#xff0c;cprimer中表述如下&#xff1a;

51-60 CVPR 2024 最佳论文 | Generative Image Dynamics

在2023年11月&#xff0c;谷歌研究院发布了一项令人瞩目的研究成果——Generative Image Dynamics&#xff08;生成图像动力学&#xff09;。这项技术的核心是将静态的图片转化为动态的、无缝循环的视频&#xff0c;而且更令人兴奋的是&#xff0c;这些生成的视频还具有交互性。…

【Web APIs】JavaScript 事件基础 ② ( “ 事件 “ 开发步骤 | 常见鼠标 “ 事件 “ )

文章目录 一、" 事件 " 开发步骤1、" 事件 " 开发步骤2、完整代码示例 二、常见鼠标 " 事件 "1、常见鼠标 " 事件 "2、鼠标 " 事件 " 代码示例 Web APIs 博客相关参考文档 : WebAPIs 参考文档 : https://developer.mozilla…

计算机组成原理 | CPU子系统(1)基本概述

基本结构模型 运算与缓存部件 数据寄存部件 PSW不是很清楚 存储器是什么&#xff1f;属于那个结构里&#xff1f; 时序处理部件 cpu是大脑&#xff0c;控制器是神经元 ①通过硬件产生控制信号 ②通过软件产生控制信号 外频&#xff08;系统时钟信号&#xff09;&#xff0c;…

Springboot整合cxf进行WebService发布和WebService调用

import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; /** 测试接口 author Μr.ηobοdy date 2019-12-29 */ WebService(name “UserService”, // 暴露服务名称 targetNamespace “http://servic…

后端数据null前端统一显示成空

handleNullValues方法在封装请求接口返回数据时统一处理 // null 转 function handleNullValues(data) {// 使用递归处理多层嵌套的对象或数组function processItem(item) {if (Array.isArray(item)) {return item.map(processItem);} else if (typeof item object &&…

深入解析 Python dataclass:类属性与类方法解释

文章目录 dataclass实例属性和类属性自动设置属性 实例方法静态方法&#xff08;staticmethod&#xff09;和 类方法&#xff08;classmethod&#xff09;静态方法类方法 dataclass dataclass 是 Python 3.7 引入的一个装饰器&#xff0c;用于简化类的定义。 使用 dataclass …

Unity的ScrollView滚动视图复用

发现问题 在游戏开发中有一个常见的需求&#xff0c;就是需要在屏幕显示多个&#xff08;多达上百&#xff09;显示item&#xff0c;然后用户用手指滚动视图可以选择需要查看的item。 现在的情况是在100个data的时候&#xff0c;Unity引擎是直接创建出对应的100个显示item。 …

0801功率放大问题

3个学时讲一个电路&#xff08;两个共集共集并联&#xff09;&#xff0c;4个问题&#xff0c;发展线索 丙类放大电路用在高频通讯行业&#xff0c;低频功放是甲类&#xff0c;乙类&#xff0c;甲乙类 PT三极管的损耗 Pv电源提供的功率 现代模电通常使用方法b 只有交流…

聊聊 golang 中 channel

1、引言 Do not communicate by sharing memory; instead, share memory by communicating Golang 的并发哲学是“不要通过共享内存进行通信&#xff0c;而要通过通信来共享内存”&#xff0c;提倡通过 channel 进行 goroutine 之间的数据传递和同步&#xff0c;而不是通过共享…

YashanDB为新质生产力赋能 灌注合肥区域转型源动力

当前&#xff0c;数据要素已成为我国数字经济的“核心引擎”与“关键生产要素”&#xff0c;为全面激发数据要素的价值&#xff0c;各地区正积极探索数据要素交易平台的可行模式&#xff0c;加快在数据要素领域的布局。近日&#xff0c;深圳计算科学研究院崖山数据库系列产品受…

JDBC从入门到精通-笔记(一):JDBC基本概念与开发基础

视频资源&#xff1a;JDBC从入门到精通视频教程-JDBC实战精讲_哔哩哔哩_bilibili JDBC定义与本质 概念 什么是JDBC&#xff1a;Java DataBase Connectivity JDBC本质&#xff1a;SUN公司制定的一套接口&#xff08;interface&#xff09;&#xff0c;java.sql.*。 面向接口调…

【progressBar-js】优雅的 前端进度条 构建!

progressBar-js JS 前端进度条小工具 您可以通过此工具来构建一个有效的工具条&#xff0c;接下来就是一个示例&#xff01; 使用示例 引入 progressBar-js 库 直接在这里将 css 和 js 文件引入进来就算是成功导入了哦&#xff01;&#xff01;&#xff01; <link href&…