【Mysql】耗时7200秒整理的mysql笔记!常用API汇总!包教包会!

2022-12-05 22:55:14 浏览数 (1)

Mysql全套笔记

⭐Hi~ o( ̄▽ ̄)ブ大家好我是雪人,今天分享出我的Mysql整理笔记!

⭐耗时7200秒整理的资料直接拿走!

⭐适合新手入门与API查阅观看!

⭐本文包含以下内容:Mysql安装,SQL语句分类汇总,约束,mysql数据类型,事务,忘记ROOT密码等...

1.安装Mysql

  • 下载地址:MySQL :: Download MySQL Community Server
  • 选择对应版本安装即可 具体可查看该文章:MySQL下载与安装_codelinkworld的博客-CSDN博客_mysql下载
  • 找到Mysql安装目录下的 my.ini(配置文件)进行更改

1.创建初始化文件

a. 找到MySql解压好的文件夹的根目录,在根目录下创建文件 my.ini(后缀为.ini)

b. 修改为如下配置

(注意:下列命令是初始化文件中的初始化命令,需要根据自己情况修改的只有mysql的安装路径以及数据的存放路径)

代码语言:text复制
[mysqld]
# mysql 端口
port=3306
# mysql 目录
# 更改为自己安装的目录
basedir=D:MySqlmysql
# mysql data 目录
# 更改为自己安装的目录
datadir=D:MySqlmysqldata
# 最大连接数
max_connections=200
max_connect_errors=10
character-set-server=utf8mb4
default-storage-engine=INNODB
default_authentication_plugin=mysql_native_password
[mysql]
default-character-set=utf8mb4
[client]
port=3306
# 默认字符集
default-character-set=utf8mb4

2.使用cmd初始化MySql并安装

1.进入 mysql的bin目录

2.初始化 MySQL 并得到初始密码

代码语言:txt复制
	在bin目录下,输入:<font color=red>mysqld --initialize --console </font>命令进行mysql初始化,并得到初始密码(需要记录初始密码,后续会用到)

3.安装 MySQL

代码语言:txt复制
	输入<font color=red>mysqld --install mysql</font>命令进行mysql服务的安装,出现successfully字样,则代表安装成功!

4.启动 MySQL 服务

代码语言:txt复制
	使用<font color=red>net start mysql</font>命令启动mysql服务,显示服务启动成功则表示成功。(使用net stop mysql可以关闭mysql服务)

5.连接 MySQL

<font color=red>mysql -u root -p</font> 输入此指令连接 MySQL

-h 可以指定域名

mysql -h localhost -u root -p

代码语言:sql复制
# 示例
mysql -u(root) -p(密码)
mysql -h(IP) -u(root) -p(密码)
mysql --host=(IP) --user=(root) --password=(密码)

3.配置环境变量

说明:配置环境变量的目的是为了能在任何位置下都能正常启动并使用mysql!

1. 创建MYSQL_HOME变量----

找到-我的电脑-,右键打开属性,找到-高级系统设置-,找到-高级-选项中的-环境变量-,在-系统变量-中点击新建,变量名建议使用MYSQL_HOME,变量值就是最初mysql的安装路径,之后点击确定即可

2. 在Path中添加新值----

a. 添加%MYSQL_HOME%;

b. 添加%MYSQL_HOME%bin;

注意:在添加时,Path变量值的展示方式可能不同,有的是展开式展示,如下图:

2.SQL语句

Structured Query Language 结构化查询语言

定义了操作所有关系型数据库的规则 (每一种数据库语法存在些许差异<方言>)

代码语言:txt复制
1. SQL语句可以单行或多行书写,以分号结尾。
2.可使用空格和缩进来增强语句的可读性。
3. MysQL数据库的sQL语句不区分大小写,关键字建议使用大写。
4. 3种注释
	-- 注释内容
	# 注释内容
	/*注释内容*/

前言

SQL分类

1) DDL(Data Definition Language)数据疋义语言用来定义数据库对象:数据库,表,列等。关键字: create,drop,alter 等

2) DML(Data Manipulation Language)数据操作语言用来对数据库中表的数据进行增删改。关键字:insert,delete,update等

3) DQL(Data Query Language)数据查询语言用来查询数据库中表的记录(数据)。关键字: select,where等

4) DCL(Data control Language)数据控制语言(了解)用来定义数据库的访问权限和安全级别,及创建用户。关键字︰GRANT,REVOKE等

1.数据库

<font color=orange>使用 create database 数据库名 character set utf8; 创建数据库并设置数据库的字符编码</font>

创建

  1. 创建数据库: CREATE DATABASE <数据库名>
  2. 创建数据库(如果不存在创建): CREATE DATABASE IF NOT EXISTS <数据库名>
  3. 创建时设置字符集:CREATE DATABASE <数据库名> CHARACTER SET <字符集名>

删除

  1. 删除数据库: DROP DATABASE <数据库名>
  2. 删除数据库(如果存在删除): DROP DATABASE IF NOT EXISTS <数据库名>

查询

  1. 查看当前使用的数据库: SELECT DATABASE()
  2. 显示存在的数据库: SHOW DATABASES
  3. 查询某个数组库的字符集(创建语句):SHOW CREATE DATABASE <数据库名>

修改

  1. 修改数据库的字符集:ALTER DATABASE <数据库名> CHARACTER SET <字符集名>

使用

  1. 操作数据库: USE <数据库名称>

2.用户

<font color=yellow>本地IP: localhost / 127.0.0.1</font>

英语小字典:

1.alter

v.

改变;(使)更改;改动;修改(衣服使更合身)

第三人称单数: alters现在分词: altering过去式: altered过去分词: altered

2.identified

v.

确认;认出;鉴定;找到;发现;显示;说明身份

identify的过去分词和过去式

3.privileges

n.

特殊利益;优惠待遇;(有钱有势者的)特权,特殊待遇;荣幸;荣耀;光荣

v.

给予特权;特别优待

privilege的第三人称单数和复数

4.grant

vt.

授予;(尤指正式地或法律上)同意,准予,允许;(勉强)承认,同意

n.

(政府、机构的)拨款

第三人称单数: grants复数: grants现在分词: granting过去式: granted过去分词: granted

查询

代码语言:sql复制
-- 1.切换到Mysql数据库
USE mysql;
-- 2.查询user表
SELECT * FROM user; # user表中管理用户信息

# PASSWORD('') Mysql中的函数 对密码进行加密  

创建

  1. CREATE USER '<用户名>'@'<用户使用IP>' IDENTIFIED BY '<密码>'

-- 创建后默认只有登录权限

删除

  1. 删除用户: DROP USER '<用户名>'@'<用户使用IP>'

修改

  1. 修改密码(方法一):UPDATE USER SET PASSWORD = PASSWORD('<新密码>') WHERE USER = '<用户名>'
  2. 修改密码(方法二):SET PASSWORD FOR '<用户名>'@'<用户使用IP>' = PASSWORD('<修改后的密码>')
  3. 修改密码(方法三):ALTER USER '<用户名>'@'<用户使用IP>' IDENTIFIED BY '<修改后的密码>' (直接对user表操作)

授权

  1. 授权给用户: GRANT <权限名> ON <数据库名>.<表名> TO '<用户名>'@'<用户使用IP>'
  2. 撤销用户特权:PEVOKE <权限名> ON <数据库名>.<表名> FROM '<用户名>'@'<用户使用IP>'
  3. 查询权限:SHOW GRANTS FOR '<用户名>'@'<用户使用IP>'

-- 权限示例: SELECT DELETE UPDATE

代码语言:sql复制
# 给与一个用户 所有表 所有数据库的全部权限
GRANT ALL ON *.* TO 'root'@'rootPassword';

3.表

创建

  1. 创建表: CREATE TABLE <表名> (<字段名> <字段类型>(最大字节长度),

<字段名> <字段类型>(最大字节长度))

删除

  1. 删除表:DROP TABLE <表名>
  2. 删除表(如果表存在):DROP TABLE IF EXISTS <表名>
  3. 删除列: ALTER TABLE <表名> DROP COLUMN <列名>

查询

  1. 查看表:SHOW TABLES
  2. 查看表的结构:DESC <表名>
  3. 查看创建表的 SQL 语句:SHOW CREATE TABLE <表名>
  4. 显示数据表 属性/索引: SHOW COLUMNS/INDEX FROM <表名>

修改

  1. 修改表: ALTER TABLE <表名> CHANGE COLUMN <列名> <修改后列名> <列类型> NOT NULL
  2. 修改表名:ALTER TABLE <表名> RENAME TO <新的表名>
  3. 修改表的字符集:ALTER TABLE <表名> CHARACTER SET <字符集名>
  4. 修改列名称及数据类型:ALTER TABLE <表名> CHANGE <列名> <新列名> <新数据类型>
  5. 修改列数据类型:ALTER TABLE <表名> MODIFY <列名> <新数据类型>
  6. 添加一列:ALTER TABLE <表名> add <列名> <数据类型>

其他参数

()内 列参数

  1. 主键: PRIMATY KEY
  2. 外键: FOREIGN KEY
  3. 自增 (只有主键才可设置否则报错): AUTO_INCREMENT
  4. 非空: NOT NULL

()外 表参数:

  1. 选择存储引擎: engine = innodb / engine = myisam (两种都是mysql的数据库的存储引擎的类型,一个支持事物等数据库的高级功能,一个不支持。两个各有用处,各有优劣 <详情可百度>)
  2. 选择数据库默认编码: DEFAULT CHARSET = utf8/gbk
  3. 设置自增键初始值: AUTO_INCREMENT = <你需要的初始值>

4.表数据

添加

  1. 根据列名添加值:INSERT INTO <表名>(列名,列名) VALUES(值,值)
  2. 根据列顺序添加值:INSERT INTO <表名> VALUES(值,值,值,值,null)

删除

条件示例: id = 3 id > 3

  1. 根据条件删除数据(无条件为删除全部数据):DELETE FROM <表名> WHERE <条件>
  2. 删除表中全部数据(直接删除表 再创建一样的空表):TRUNCATE TABLE <表名> -- 此方法删除全部数据效率高

修改

  1. 根据列名修改数据(无条件为修改全部数据):UPDATE 表名 SET 列名1 = 值1,列名2 = 值2,... WHERE <条件>

5.SELECT

1.语法
代码语言:sql复制
select # 字段列表
from # 表名列表
where # 条件列表
group by # 分组字段
having # 分组之后的条件
order by # 排序
limit # 分页限定
2.基础查询
代码语言:sql复制
-- DISTINCT关键字 去除重复结果
SELECT (DISTINCT) <字段列表名1>,<字段列表名2>... FROM <表名>

-- 计算 数字型数据结构 使用   - * /
SELECT name,math,english,math   english from student1
-- 如果有null参与的计算 默认计算结果均为 null 将null替换为一个值
-- IFNULL(可能为NULL的值,如果为NULL要替换的值)
SELECT name,math,english,math   IFNULL(english,0) from student1

-- 起别名 AS
SELECT name,math,english,math   english AS 总分 from student1 -- AS 可以以空格替代
  1. 查询全部数据:SELECT * FROM <表名>
  2. 查询部分列数据:SELECT <字段列表名1>,<字段列表名2>... FROM <表名>
3.条件查询
代码语言:sql复制
# Where 后跟句子条件
# 运算符
-- > < <= >= = <>
-- BETWEEN...AND
-- IN(集合)
-- LIKE 模糊查询
	-- 占位符 _:单个任意字符  %:多个任意字符
-- IS NULL
-- and 或 &&
-- or 或 ||
-- not 或 !  

-- <> 为大于小于 与 != 一致

# 示例
SELECT * FROM student WHERE age!=20;
SELECT * FROM student WHERE age=20;

SELECT * FROM student WHERE age>20 and age<30;
SELECT * FROM student WHERE age BETWEEN 20 AND 30;

SELECT * FROM student WHERE age=20 or age=29 or age=17;
SELECT * FROM student WHERE age IN(20,29,17);

SELECT * FROM student WHERE age IS NULL;
SELECT * FROM student WHERE age IS NOT NULL;

-- 姓 马 的有哪些
SELECT * FROM student WHERE name LIKE '马%';
-- 三个字的名字
SELECT * FROM student WHERE name LIKE '___';
-- 姓名中有马
SELECT * FROM student WHERE name LIKE '%马%';
4.排序查询
代码语言:sql复制
-- 语法 order by 子句
	# order by 排序字段1 排序方式1 , 排序字段2 排序方式2...
-- 排序方式 有多个排序条件 第一个排序条件一致时 才会判断第二个条件
	# ASC:升序
	# DESC:降序
5.聚合函数
代码语言:sql复制
-- 聚合函数:将一列数据作为整体进行计算
(计算时默认排除 NULL 值)
	# count:统计个数
		# 一般选择非空的列:主键
		# count(*) 统计所有列 有一列不为null 就统计在内
	# max:计算最大值
	# min:计算最小值
	# sum:计算和
	# avg:计算平均值
	
SELECT COUNT(math) FROM student;
SELECT COUNT(IFNULL(math,0)) FROM student;

SELECT MAX(math) FROM student;
SELECT MIN(math) FROM student;
SELECT SUM(math) FROM student;
6.分组查询
代码语言:sql复制
# 语法: GROUP BY 分组字段
 -- 注意
 	-- 分组之后查询的字段:分组字段,聚合字段 其他字段无意义
 	-- where 和 having 的区别
 		-- where 在分组之前进行限定 (如果不满足条件 不参与分组) 对每一条的判断
 		-- having 在分组之后进行限定 (如果不满足结果 不会被查询) 对一组的判断
 		-- where 不可使用聚合函数 而 having可以
SELECT sex,AVG(math) FROM student GROUP BY sex WHERE math > 70;
SELECT sex,AVG(math) FROM student GROUP BY sex WHERE math > 70;
7.分页查询
代码语言:SQL复制
# 语法: limit 开始的索引,每页显示几条记录
	-- 分页操作是一个 "方言"

SELECT * FROM student LIMIT 0,3; -- 第一页
SELECT * FROM student LIMIT 3,3; -- 第二页
SELECT * FROM student LIMIT 6,3; -- 第三页
...
SELECT * FROM student LIMIT n(x-1),n; -- 第x页
8.多表查询
代码语言:sql复制
SELECT * FROM table1, table2;
-- 笛卡尔积 A B
	# 有两个集合 A 和 B 取这两个集合的所有组成情况
	# 要完成多表查询 需要消除无用数据

-- 消除无用数据方法
	# 内连接查询
    # 外连接查询 
    # 子查询
内连接
代码语言:sql复制
-- 内连接
	# 从哪些表中查询数据
	# 查询条件是什么
	# 查询哪些字段
	

-- 隐式内连接 使用 WHERE 消除 无用数据
# 多表筛选
SELECT * FROM emp,dept WHERE emp.'dept_id' = dept.'id';
# 使用 表名.列名 进行条件筛选
SELECT emp.'id',emp.'name',emp.'gender' FROM emp,dept WHERE emp.'dept_id' = dept.'id';

-- 显式内连接 INNER 可以省略
SELECT 字段列表 FROM 表名1 INNER JOIN 表明2 ON 条件
SELECT * FROM emp INNER JOIN dept ON emp.'dept_id' = dept.'id';
外连接
代码语言:sql复制
-- 外连接查询

-- 左外连接 OUTER 可以省略
SELECT 字段列表 FROM 表1 LEFT OUTER JOIN 表2 ON 条件
# 查询的是 左表中所有的数据 以及其交集部分


-- 右外连接 OUTER 可以省略
SELECT 字段列表 FROM 表1 LEFT OUTER JOIN 表2 ON 条件
# 查询的是 右表中所有的数据 以及其交集部分
子查询
代码语言:sql复制
-- SELECT 中嵌套 SELECT

# 案例:查询工资最高的员工的信息
SELECT MAX(salary) FROM emp; -- 查询到最高工资 9000
SELECT * FROM emp WHERE emp.'salary' = 9000;

# 子查询简化案例语句
SELECT * FROM emp WHERE emp.'salary' = (SELECT MAX(salary) FROM emp);
# 查询工资小于平均工资的员工
SELECT * FROM emp WHERE emp.'salary' < (SELECT AVG(salary) FROM emp);

# 多行单列使用:
SELECT id  FROM dept WHERE NAME = '财务部' or NAME = '市场部'; -- 查询出 id 为 1 , 2 , 3 ... 多行单列
SELECT * FROM emp WHERE dept_id IN (3,2)
-- 合并
SELECT * FROM emp WHERE dept_id IN (SELECT id  FROM dept WHERE NAME = '财务部' or NAME = '市场部';)

# 案例:查询员工入职日期是 2011-11-11 日之后的员工信息和部门信息
SELECT * FROM dept t1, (SELECT * FROM emp WHERE emp.'join_date' > '2011-11-11';) t2
WHERE t1.id = t2.dept_id;

子查询结果不同:

  • 单行单列
    • 可以作为单个值 使用运算符进行判断 > < >= <= <>
  • 单行多列
  • 多行多列
    • 可以当作一个 虚拟的表 进行表的查询
  • 多行单列
    • 可以使用关键字 IN 进行判断

3.约束

概念:对表中的数据进行限定,保证数据的正确性、有效性和完整性

分类

  1. 主键约束:primary key
  2. 非空主键:not null
  3. 唯一约束:unique
  4. 外键约束:foreign key

1.非空约束

代码语言:sql复制
# 在创建表时添加 NOT NULL 添加后字段不得为空
CREATE TABLE <表名> (<字段名> <字段类型>(最大字节长度) NOT NULL,
                   <字段名> <字段类型>(最大字节长度));
                   
-- 删除非空约束
ALTER TABLE student MODIFY NAME VARCHAR(20);
-- 不加 NOT NULL 直接用新语句覆盖旧语句

-- 创建表后添加非空约束
ALTER TABLE student MODIFY NAME VARCHAR(20) NOT NULL;

2.唯一约束

代码语言:sql复制
# 在创建表时添加 UNIQUE 添加后字段不得重复
	-- 可以存在 NULL 但只能有一条为NULL
CREATE TABLE <表名> (<字段名> <字段类型>(最大字节长度) UNIQUE,
                   <字段名> <字段类型>(最大字节长度));
                   
-- 删除
ALTER TABLE student MODIFY phone VARCHAR(20);

-- 创建表后添加
ALTER TABLE student MODIFY phone VARCHAR(20) UNIQUE;

3.主键约束

  • 含义:非空且唯一
  • 注意:一张表只能有一个字段为主键
  • 主键就是表中记录的唯一标识
代码语言:sql复制
# 在创建表时添加 PRIMARY KEY
CREATE TABLE <表名> (<字段名> <字段类型>(最大字节长度) PRIMARY KEY,
                   <字段名> <字段类型>(最大字节长度));
                   
-- 删除
ALTER TABLE student MODIFY phone VARCHAR(20);

-- 创建表后添加
ALTER TABLE student MODIFY phone VARCHAR(20) PRIMARY KEY;

自增主键:如果某一列为数值类型 使用 auto_increment 可以完成 值 的自动增长

代码语言:sql复制
# 在创建表时添加 PRIMARY KEY AUTO_INCREMENT
CREATE TABLE <表名> (<字段名> <字段类型>(最大字节长度) PRIMARY KEY AUTO_INCREMENT,<字段名> <字段类型>(最大字节长度));
# 可以手动插入 正常值
# 自增值根据上衣条记录加1

4.外键约束

代码语言:sql复制
# 在创建表时添加 FOREIGN KEY
# 外键必须为其他表的主键
CREATE TABLE <表名> (...
				  CONSTRAINT <外键名称> FOREIGN KEY (<外键列名称>) REFERENCES <主表名称>(<主表列名称>),
                   <字段名> <字段类型>(最大字节长度)) ON UPDATE CASCADE;
-- 删除外键
ALTER TABLE <表名称> DROP FOREIGN KEY <外键名称>;

-- 添加外键
ALTER TABLE <表名称> ADD CONSTRAINT <外键名称> FOREIGN KEY (<外键列名称>) REFERENCES <主表名称>(<主表列名称>);

-- 级联操作
	# 一个数据需要修改主键 如果其他表联动此表作为外键 修改后会发生错误 需要添加级联 添加后修改主键外键会自动更改
-- 修改时添加
ALTER TABLE <表名称> ADD CONSTRAINT <外键名称> FOREIGN KEY (<外键列名称>) REFERENCES <主表名称>(<主表列名称>) ON UPDATE CASCADE;
-- or 创建时添加



# 语法:
-- 级联更新 ON UPDATE CASCADE
-- 级联删除 ON DELETE CASCADE (很危险 一不小心就删记录删除很多)

4.数据库的设计

  1. 多表之间的关系
  2. 一对一:人和身份证,一个身份证只能对应一个人
  3. 一对多(多对一):一个部门有多个员工,一个员工只能对应一个部门
  4. 多对多:学生和课程,一个学生可以选择多门课程,一个课程也可以被很多学生选择
  • 一对多:
    • 多的表里面 添加一的外键
  • 多对多:
    • 利用中间表 进行 多外键与多外键的对应
  1. 数据库设计的范式

设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。

关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。

分类:

  1. 第一范式:每一列都是不可分割的原子数据项
    1. 列不可继续拆分
  2. 第二范式:在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)
    1. 函数依赖:A-->B 如果通过A属性(属性组)的值可以确定唯一B属性的值B依赖于A
    2. 完全函数依赖:A-->B 如果A为属性组,则B属性值得确定需要依赖于A属性组中所有的属性值
    3. 部分依赖函数:A-->B 如果A为属性组,则B属性值得确定只需要依赖于A属性组中某一些值即可
    4. 传递函数依赖:A-->B,B -->C,如果通过A属性(属性组)的值,可以确定唯一B属性的值,在通过B属性(属性组)的值可以确定唯一C属性的值,则称c传递面数依赖于A
    5. 码∶如果在一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(属性值)为该表的码
      • 主属性:码属性组中的所有属性
      • 非主属性:除过码属性组的属性
  3. 第三范式:在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)

5.Mysql数据类型

来源:MySQL 数据类型 | 菜鸟教程 (runoob.com)

数值类型

MySQL 支持所有标准 SQL 数值数据类型。

这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL 和 NUMERIC),以及近似数值数据类型(FLOAT、REAL 和 DOUBLE PRECISION)。

关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。

BIT数据类型保存位字段值,并且支持 MyISAM、MEMORY、InnoDB 和 BDB表。

作为 SQL 标准的扩展,MySQL 也支持整数类型 TINYINT、MEDIUMINT 和 BIGINT。下面的表显示了需要的每个整数类型的存储和范围。

类型

大小

范围(有符号)

范围(无符号)

用途

TINYINT

1 Bytes

(-128,127)

(0,255)

小整数值

SMALLINT

2 Bytes

(-32 768,32 767)

(0,65 535)

大整数值

MEDIUMINT

3 Bytes

(-8 388 608,8 388 607)

(0,16 777 215)

大整数值

INT或INTEGER

4 Bytes

(-2 147 483 648,2 147 483 647)

(0,4 294 967 295)

大整数值

BIGINT

8 Bytes

(-9,223,372,036,854,775,808,9 223 372 036 854 775 807)

(0,18 446 744 073 709 551 615)

极大整数值

FLOAT

4 Bytes

(-3.402 823 466 E 38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E 38)

0,(1.175 494 351 E-38,3.402 823 466 E 38)

单精度 浮点数值

DOUBLE

8 Bytes

(-1.797 693 134 862 315 7 E 308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E 308)

0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E 308)

双精度 浮点数值

DECIMAL

对DECIMAL(M,D) ,如果M>D,为M 2否则为D 2

依赖于M和D的值

依赖于M和D的值

小数值


日期和时间类型

表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。

每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。

TIMESTAMP类型有专有的自动更新特性,将在后面描述。

类型

大小 ( bytes)

范围

格式

用途

DATE

3

1000-01-01/9999-12-31

YYYY-MM-DD

日期值

TIME

3

'-838:59:59'/'838:59:59'

HH:MM:SS

时间值或持续时间

YEAR

1

1901/2155

YYYY

年份值

DATETIME

8

1000-01-01 00:00:00/9999-12-31 23:59:59

YYYY-MM-DD HH:MM:SS

混合日期和时间值

TIMESTAMP

4

1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07(自动保存为插入数据时间)

YYYYMMDD HHMMSS

混合日期和时间值,时间戳


字符串类型

字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。

类型

大小

用途

CHAR

0-255 bytes

定长字符串

VARCHAR

0-65535 bytes

变长字符串

TINYBLOB

0-255 bytes

不超过 255 个字符的二进制字符串

TINYTEXT

0-255 bytes

短文本字符串

BLOB

0-65 535 bytes

二进制形式的长文本数据

TEXT

0-65 535 bytes

长文本数据

MEDIUMBLOB

0-16 777 215 bytes

二进制形式的中等长度文本数据

MEDIUMTEXT

0-16 777 215 bytes

中等长度文本数据

LONGBLOB

0-4 294 967 295 bytes

二进制形式的极大文本数据

LONGTEXT

0-4 294 967 295 bytes

极大文本数据

注意:char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符。

CHAR 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。

BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。

BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。

有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。

6.数据库的备份与还原

1.命令行

代码语言:sql复制
# 语法
	-- 备份: mysqldump -u用户名 -p密码 需要备份的数据库名称 > 保存路径
	-- 还原:
		1.登录数据库
		2.创建数据库
		3.使用数据库 -- 使用创建的数据库
		4.执行文件 -- 执行命令: source 文件路径

实例

代码语言:text复制
mysqldump -u root -p test > E:桌面Notedata.sql
代码语言:sql复制
create database databaseone;
use databaseone;
source E:data.sql
-- OK!

2.图形化工具

使用Navicat可进行备份

7.事务

代码语言:sql复制
START TRANSACTION; -- 开启事务

# 事务操作代码
# ...

COMMIT; -- 执行代码没有问题 提交事务

ROLLBACK; -- 出现问题 回滚事务
-- 还原数据库到 开启事务之前的状态

<font color=pink>使用DML 增删改查 默认提交一次事务</font> (默认)

代码语言:sql复制
# 修改事务的默认提交方式
	-- 查看事务的默认提交方式 SELECT @@autocommit;
	-- 1 代表自动提交  0 代表手动提交
# 修改: SET @@autocommit = 0;

# Mysql 默认自动提交
# Oracle 默认手动提交

事务的四大特征

  1. 原子性:
    • 是不可分割的最小操作单位,要么同时成功,要么同时失败
  2. 持久性:
    • 当事务提交或回滚后,数据库会持久化的保存数据
  3. 隔离性:
    • 多个事务之间 相互影响
  4. 一致性:
    • 事务操作前后 数据总量不变

事务隔离的级别

概念∶多个事务之间隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。

<font color=pink>存在的问题</font>

  1. 脏读:一个事务,读取到另一个事务中没有提交的数据
  2. 不可重复读(虚读):在同一个事务中,两次读取到的数据不一样
  3. 幻读:一个事务操作(DAL)数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改

隔离级别

  1. read uncommitted:读未提交
    • 产生的问题:脏读,不可重复读,幻读
  2. read committed:读已提交
    • 产生的问题:不可重复读,幻读
  3. repeatable read:可重复读
    • 产生的问题:幻读
  4. serializable:串行化
    • 可以解决所有问题 (类似JAVA多线程加锁)

注意:隔离级别从小到大安全性越来越高,效率越来越低

代码语言:sql复制
# 数据库 隔离级别 语法
# 查询隔离级别
SELECT @@tx_isolation;
# 设置隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL 级别字符串;

SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
代码语言:sql复制
# 脏读:
	-- READ UNCOMMITTED  事件中未COMMIT 但是数据库已经更改
# 不可重复读:两次SELECT数据不一致

8.忘记ROOT密码

代码语言:sql复制
-- 1.cmd --> net stop mysql 停止mysql服务

-- 2.使用无验证方式启动Mysql服务
# mysqld --skip-grant-tables

-- 3.修改ROOT用户密码
USE mysql;
UPDATE user SET password = PASSWORD('新密码') WHERE user='root';

0 人点赞