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>
创建
- 创建数据库: CREATE DATABASE <数据库名>
- 创建数据库(如果不存在创建): CREATE DATABASE IF NOT EXISTS <数据库名>
- 创建时设置字符集:CREATE DATABASE <数据库名> CHARACTER SET <字符集名>
删除
- 删除数据库: DROP DATABASE <数据库名>
- 删除数据库(如果存在删除): DROP DATABASE IF NOT EXISTS <数据库名>
查询
- 查看当前使用的数据库: SELECT DATABASE()
- 显示存在的数据库: SHOW DATABASES
- 查询某个数组库的字符集(创建语句):SHOW CREATE DATABASE <数据库名>
修改
- 修改数据库的字符集:ALTER DATABASE <数据库名> CHARACTER SET <字符集名>
使用
- 操作数据库: 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中的函数 对密码进行加密
创建
- CREATE USER '<用户名>'@'<用户使用IP>' IDENTIFIED BY '<密码>'
-- 创建后默认只有登录权限
删除
- 删除用户: DROP USER '<用户名>'@'<用户使用IP>'
修改
- 修改密码(方法一):UPDATE USER SET PASSWORD = PASSWORD('<新密码>') WHERE USER = '<用户名>'
- 修改密码(方法二):SET PASSWORD FOR '<用户名>'@'<用户使用IP>' = PASSWORD('<修改后的密码>')
- 修改密码(方法三):ALTER USER '<用户名>'@'<用户使用IP>' IDENTIFIED BY '<修改后的密码>' (直接对user表操作)
授权
- 授权给用户: GRANT <权限名> ON <数据库名>.<表名> TO '<用户名>'@'<用户使用IP>'
- 撤销用户特权:PEVOKE <权限名> ON <数据库名>.<表名> FROM '<用户名>'@'<用户使用IP>'
- 查询权限:SHOW GRANTS FOR '<用户名>'@'<用户使用IP>'
-- 权限示例: SELECT DELETE UPDATE
代码语言:sql复制# 给与一个用户 所有表 所有数据库的全部权限
GRANT ALL ON *.* TO 'root'@'rootPassword';
3.表
创建
- 创建表: CREATE TABLE <表名> (<字段名> <字段类型>(最大字节长度),
<字段名> <字段类型>(最大字节长度))
删除
- 删除表:DROP TABLE <表名>
- 删除表(如果表存在):DROP TABLE IF EXISTS <表名>
- 删除列: ALTER TABLE <表名> DROP COLUMN <列名>
查询
- 查看表:SHOW TABLES
- 查看表的结构:DESC <表名>
- 查看创建表的 SQL 语句:SHOW CREATE TABLE <表名>
- 显示数据表 属性/索引: SHOW COLUMNS/INDEX FROM <表名>
修改
- 修改表: ALTER TABLE <表名> CHANGE COLUMN <列名> <修改后列名> <列类型> NOT NULL
- 修改表名:ALTER TABLE <表名> RENAME TO <新的表名>
- 修改表的字符集:ALTER TABLE <表名> CHARACTER SET <字符集名>
- 修改列名称及数据类型:ALTER TABLE <表名> CHANGE <列名> <新列名> <新数据类型>
- 修改列数据类型:ALTER TABLE <表名> MODIFY <列名> <新数据类型>
- 添加一列:ALTER TABLE <表名> add <列名> <数据类型>
其他参数
()内 列参数
- 主键: PRIMATY KEY
- 外键: FOREIGN KEY
- 自增 (只有主键才可设置否则报错): AUTO_INCREMENT
- 非空: NOT NULL
()外 表参数:
- 选择存储引擎: engine = innodb / engine = myisam (两种都是mysql的数据库的存储引擎的类型,一个支持事物等数据库的高级功能,一个不支持。两个各有用处,各有优劣 <详情可百度>)
- 选择数据库默认编码: DEFAULT CHARSET = utf8/gbk
- 设置自增键初始值: AUTO_INCREMENT = <你需要的初始值>
4.表数据
添加
- 根据列名添加值:INSERT INTO <表名>(列名,列名) VALUES(值,值)
- 根据列顺序添加值:INSERT INTO <表名> VALUES(值,值,值,值,null)
删除
条件示例: id = 3 id > 3
- 根据条件删除数据(无条件为删除全部数据):DELETE FROM <表名> WHERE <条件>
- 删除表中全部数据(直接删除表 再创建一样的空表):TRUNCATE TABLE <表名> -- 此方法删除全部数据效率高
修改
- 根据列名修改数据(无条件为修改全部数据):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 可以以空格替代
- 查询全部数据:SELECT * FROM <表名>
- 查询部分列数据: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.约束
概念:对表中的数据进行限定,保证数据的正确性、有效性和完整性
分类:
- 主键约束:primary key
- 非空主键:not null
- 唯一约束:unique
- 外键约束: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.主键约束
- 含义:非空且唯一
- 注意:一张表只能有一个字段为主键
- 主键就是表中记录的唯一标识
# 在创建表时添加 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.数据库的设计
- 多表之间的关系
- 一对一:人和身份证,一个身份证只能对应一个人
- 一对多(多对一):一个部门有多个员工,一个员工只能对应一个部门
- 多对多:学生和课程,一个学生可以选择多门课程,一个课程也可以被很多学生选择
- 一对多:
- 多的表里面 添加一的外键
- 多对多:
- 利用中间表 进行 多外键与多外键的对应
- 数据库设计的范式
设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
分类:
- 第一范式:每一列都是不可分割的原子数据项
- 列不可继续拆分
- 第二范式:在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)
- 函数依赖:A-->B 如果通过A属性(属性组)的值可以确定唯一B属性的值 则 B依赖于A
- 完全函数依赖:A-->B 如果A为属性组,则B属性值得确定需要依赖于A属性组中所有的属性值
- 部分依赖函数:A-->B 如果A为属性组,则B属性值得确定只需要依赖于A属性组中某一些值即可
- 传递函数依赖:A-->B,B -->C,如果通过A属性(属性组)的值,可以确定唯一B属性的值,在通过B属性(属性组)的值可以确定唯一C属性的值,则称c传递面数依赖于A
- 码∶如果在一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(属性值)为该表的码
- 主属性:码属性组中的所有属性
- 非主属性:除过码属性组的属性
- 第三范式:在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 默认手动提交
事务的四大特征
- 原子性:
- 是不可分割的最小操作单位,要么同时成功,要么同时失败
- 持久性:
- 当事务提交或回滚后,数据库会持久化的保存数据
- 隔离性:
- 多个事务之间 相互影响
- 一致性:
- 事务操作前后 数据总量不变
事务隔离的级别
概念∶多个事务之间隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别就可以解决这些问题。
<font color=pink>存在的问题</font>
- 脏读:一个事务,读取到另一个事务中没有提交的数据
- 不可重复读(虚读):在同一个事务中,两次读取到的数据不一样
- 幻读:一个事务操作(DAL)数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改
隔离级别
- read uncommitted:读未提交
- 产生的问题:脏读,不可重复读,幻读
- read committed:读已提交
- 产生的问题:不可重复读,幻读
- repeatable read:可重复读
- 产生的问题:幻读
- 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';