Mysql(一) 数据库实现-DDL-DML-DQL及各种函数用法(一)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: order by的位置一般放在查询语句的最后(除limit语句之外)| asc : | 升序,如果不写默认升序 || — | — |

1、初识数据库

1.1、什么是数据库

数据库:DB(DataBase)

概念:数据仓库,软件,安装在操作系统之上

作用:存储数据,管理数据

1.2、数据库分类

1.2.1、关系型数据库:SQL(Structured Query Language)

MySQL、Oracle、Sql Server、DB2、SQLlite

通过表和表之间,行和列之间的关系进行数据的存储

通过外键关联来建立表与表之间的关系

1.2.2、非关系型数据库:NoSQL(Not Only SQL)

Redis、MongoDB

指数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定

1.2.3 时序数据库

influxDB , IOTDB

2、数据定义语言(DDL)

2.1、操作数据库

2.1.1、创建数据库

CREATE DATABASE [IF NOT EXISTS] 数据库名;


CREATE DATABASE [IF NOT EXISTS]  `launch_mysql` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';

1

2.1.2、删除数据库

DROP DATABASE [if EXISTS] 数据库名;

2.1.3、使用数据库

如果表名或者字段名是特殊字符,则需要带``

use 数据库名;

2.1.4、查看数据库

SHOW DATABASES;

2.2、数据库的列类型

2.2.1、数值

数据类型 描述 大小

tinyint 十分小的数据 1个字节

smallint 较小的数据 2个字节

mediumint 中等大小的数据 3个字节

int 标准的整数 4个字节

bigint 较大的数据 8个字节

float 浮点数 4个字节

double 浮点数 8个字节

decimal 字符串形式的浮点数,一般用于金融计算

2.2.2、字符串

数据类型 描述 大小

char 字符串固定大小 0~255

varchar 可变字符串 0~65535

tinytext 微型文本 2^8-1

text 文本串 2^16-1

2.2.3、时间日期

数据类型 描述 格式

date 日期格式 YYYY-MM-DD

time 时间格式 HH:mm:ss

datetime 最常用的时间格式 YYYY-MM-DD HH:mm:ss

timestamp 时间戳,1970.1.1到现在的毫秒数

year 年份表示

2.2.4、null

没有值,未知

不要使用NULL值进行计算

2.3、数据库的字段属性

2.3.1、UnSigned

无符号的

声明了该列不能为负数

2.3.2、ZEROFILL

0填充的

不足位数的用0来填充 , 如int(3),5则为005

2.3.3、Auto_InCrement

通常理解为自增,自动在上一条记录的基础上默认+1

通常用来设计唯一的主键,必须是整数类型

可定义起始值和步长

当前表设置步长(AUTO_INCREMENT=100) : 只影响当前表 当前自增字段的值从100开始累加1

SET @@auto_increment_increment=5 ; 影响所有使用自增的表(全局)

2.3.4、NULL 和 NOT NULL

默认为NULL , 即没有插入该列的数值

如果设置为NOT NULL , 则该列必须有值

2.3.5、DEFAULT

默认的

用于设置默认值

例如,性别字段,默认为"男" , 否则为 “女” ; 若无指定该列的值 , 则默认值为"男"的值

拓展

每一个表,都必须存在以下五个字段:


名称 描述

id 主键(自增)

version 乐观锁

is_elete 伪删除(逻辑删除)(物理删除)

gmt_create 创建时间

gmt_update 修改时间

2.4、创建数据库表

2.4.1、语法

CREATE TABLE IF NOT EXISTS `student`(
  '字段名' 列类型 [属性] [索引] [注释],
    '字段名' 列类型 [属性] [索引] [注释],
    ......
    '字段名' 列类型 [属性] [索引] [注释]
)[表的类型][字符集设置][注释]

2.4.2、示例

CREATE TABLE IF NOT EXISTS `student`(
  `id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '学号',
  `name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
  `pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
  `sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
  `birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
  `address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
  `email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
  PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8

2.4.3、注意

表名和字段尽量使用``括起来

AUTO_INCREMENT 代表自增

所有的语句后面加逗号,最后一个不加

字符串使用单引号括起来

主键的声明一般放在最后,便于查看

不设置字符集编码的话,会使用MySQL默认的字符集编码Latin1,不支持中文,可以在my.ini里修改

2.4.4、常用命令

SHOW CREATE DATABASE 数据库名;-- 查看创建数据库的语句
SHOW CREATE TABLE 表名;-- 查看表的定义语句
DESC 表名;-- 显示表的具体结构

2.5、修改表

2.5.1、修改语法

-- 修改表名
-- ALTER TABLE 旧表名 RENAME AS 新表名
ALTER TABLE student RENAME AS students;
-- 增加表的字段
-- ALTER TABLE 表名 ADD 字段名 列属性
ALTER TABLE students ADD age INT(11);
-- 修改表的字段(重命名,修改列的属性)
-- ALTER TABLE 表名 MODIFY 字段名 [列属性];
ALTER TABLE students MODIFY age VARCHAR(11);-- 修改列的属性
-- ALTER TABLE 表名 CHANGE 旧名字 新名字 [列属性];
ALTER TABLE students CHANGE age age1 INT(1);-- 字段重命名
-- 删除表的字段
-- ALTER TABLE 表名 DROP 字段名
ALTER TABLE students DROP age1;

2.5.2、删除语法

DROP TABLE [IF EXISTS] 表名

IF EXISTS为可选 , 判断是否存在该数据表

如删除不存在的数据表会抛出错误

2.5.3、示例

-- 删除表(如果存在再删除)
DROP TABLE IF EXISTS teachers;

2.5.4、注意

所有的创建和删除尽量加上判断,以免报错

2.6、清空表TRUNCATE

完全清空一个数据库表,表的结构和索引约束不会变!

2.6.1、语法

TRUNCATE 表名;

2.6.2、示例

TRUNCATE students;

2.7、删除表

2.7.1、语法

DROP TABLE 表名;

2.7.2、示例

DROP TABLE students;

3.数据操作语言(DML)

数据库的意义:数据存储,数据管理

3.1、添加insert

3.1.1、语法

INSERT INTO 表名([字段1,字段2..])VALUES('值1','值2'..),[('值1','值2'..)..];

3.1.2、注意:

字段和字段之间使用英文逗号隔开

字段是可以省略的,但是值必须完整且一一对应

3.1.3、示例

可以同时插入多条数据,VALUES后面的值需要使用逗号隔开

-- 普通用法
INSERT INTO `student`(`name`) VALUES ('zsr');
-- 插入多条数据
INSERT INTO `student`(`name`,`pwd`,`sex`) VALUES ('zsr','200024','男'),('gcc','000421','女');
-- 省略字段
INSERT INTO `student` VALUES (5,'Bareth','123456','男','2000-02-04','武汉','1412@qq.com',1); 


3.2、修改update

3.2.1、语法

UPDATE 表名 SET 字段1=值1,[字段2=值2...]WHERE 条件[];

3.2.2、示例

-- 修改学员名字,指定条件
UPDATE `student` SET `name`='zsr204' WHERE id=1;
-- 不指定条件的情况,会改动所有表
UPDATE `student` SET `name`='zsr204';
-- 修改多个属性
UPDATE `student` SET `name`='zsr',`address`='湖北' WHERE id=1;
-- 通过多个条件定位数据
UPDATE `student` SET `name`='zsr204' WHERE `name`='zsr' AND `pwd`='200024';

3.2.3、where条件

操作符 含义

= 等于

<>或!= 不等于

> 大于

< 小于

<= 小于等于

>= 大于等于

BETWEEN…AND… 闭合区间

AND 和

OR 或

3.3、删除 delete

3.3.1、语法

DELETE FROM 表名 [WHERE 条件]

3.3.2、示例

-- 删除数据(避免这样写,会全部删除)
DELETE FROM `student`;
-- 删除指定数据
DELETE FROM `student` WHERE id=1;


作用:完全删除一个数据库表,表的结构和索引约束不会变!

3.3.3、DELETE和TRUNCATE 和DROP的区别

truncate与drop是DDL语句,执行后无法回滚;delete是DML语句,可回滚。

truncate只能作用于表;delete,drop可作用于表、视图等。

truncate会清空表中的所有行,但表结构及其约束、索引等保持不变;drop会删除表的结构及其所依赖的约束、索引等。

truncate会重置表的自增值;delete不会。

truncate后会使表和索引所占用的空间会恢复到初始大小;delete操作不会减少表或索引所占用的空间,drop语句将表所占用的空间全释放掉。

4.数据库查询语言(DQL)

4.1、语法

SELECT [ALL | DISTINCT]
{* | table.* | [table.field1[as alias1][,table.field2[as alias2]][,...]]}
FROM table_name [as table_alias]
  [left | right | inner join table_name2]  -- 联合查询
  [WHERE ...]  -- 指定结果需满足的条件
  [GROUP BY ...]  -- 指定结果按照哪几个字段来分组
  [HAVING]  -- 过滤分组的记录必须满足的次要条件
  [ORDER BY ...]  -- 指定查询记录按一个或多个条件排序
  [LIMIT {[offset,]row_count | row_countOFFSET offset}]; -- 指定查询的记录从哪条至哪条


查询数据库数据 , 如SELECT语句

简单的单表查询或多表的复杂查询和嵌套查询

是数据库语言中最核心,最重要的语句

使用频率最高的语句

4.2、前提配置

-- 创建学校数据库
CREATE DATABASE IF NOT EXISTS `school`;
-- 用school数据库
USE `school`;
-- 创建年级表grade表
CREATE TABLE `grade`(
  `GradeID` INT(11) NOT NULL AUTO_INCREMENT COMMENT '年级编号',
  `GradeName` VARCHAR(50) NOT NULL COMMENT '年纪名称',
  PRIMARY KEY (`GradeID`)
)ENGINE=INNODB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
-- 给grade表插入数据
INSERT INTO `grade`(`GradeID`,`GradeName`) 
VALUES (1,'大一'),(2,'大二'),(3,'大三'),(4,'大四');
-- 创建成绩result表
CREATE TABLE `result`(
  `StudentNo` INT(4) NOT NULL COMMENT '学号',
  `SubjectNo` INT(4) NOT NULL COMMENT '考试编号',
  `ExamDate` DATETIME NOT NULL COMMENT '考试日期',
  `StudentResult` INT(4) NOT NULL COMMENT '考试成绩',
  KEY `SubjectNo` (`SubjectNo`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
-- 给result表插入数据
INSERT INTO `result`(`StudentNo`,`SubjectNo`,`ExamDate`,`StudentResult`) 
VALUES (1000,1,'2019-10-21 16:00:00',97),(1001,1,'2019-10-21 16:00:00',96),
(1000,2,'2019-10-21 16:00:00',87),(1001,3,'2019-10-21 16:00:00',98);
-- 创建学生表student
CREATE TABLE `student`( 
  `StudentNo` INT(4) NOT NULL COMMENT '学号',
  `LoginPwd` VARCHAR(20) DEFAULT NULL,
  `StudentName` VARCHAR(20) DEFAULT NULL COMMENT '学生姓名',
  `Sex` TINYINT(1) DEFAULT NULL COMMENT '性别,取值0或1',
  `GradeID` INT(11) DEFAULT NULL COMMENT '年级编号',
  `Phone` VARCHAR(50) NOT NULL COMMENT '联系电话,允许为空,即可选输入',
  `Adress` VARCHAR(255) NOT NULL COMMENT '地址,允许为空,即可选输入',
  `BornDate` DATETIME DEFAULT NULL COMMENT '出生时间',
  `Email` VARCHAR(50) NOT NULL COMMENT '邮箱账号,允许为空,即可选输入',
  `IdentityCard` VARCHAR(18) DEFAULT NULL COMMENT '身份证号',
  PRIMARY KEY (`StudentNo`),
  UNIQUE KEY `IdentityCard` (`IdentityCard`),
  KEY `Email` (`Email`)
)ENGINE=MYISAM DEFAULT CHARSET=utf8;
-- 给学生表插入数据
INSERT INTO `student`(`StudentNo`,`LoginPwd`,`StudentName`,`Sex`,`GradeID`,`Phone`,`Adress`,`BornDate`,`Email`,`IdentityCard`) 
VALUES (1000,'1241','dsaf',1,2,'24357','unknow','2000-09-16 00:00:00','1231@qq.com','809809'),
(1001,'1321','dfdj',0,2,'89900','unknow','2000-10-16 00:00:00','5971@qq.com','908697');
-- 创建科目表
CREATE TABLE `subject`(
  `SubjectNo` INT(11) NOT NULL AUTO_INCREMENT COMMENT '课程编号',
  `SubjectName` VARCHAR(50) DEFAULT NULL COMMENT '课程名称',
  `ClassHour` INT(4) DEFAULT NULL COMMENT '学时',
  `GradeID` INT(4) DEFAULT NULL COMMENT '年级编号',
  PRIMARY KEY (`SubjectNo`)
)ENGINE=INNODB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;
-- 给科目表subject插入数据
INSERT INTO `subject`(`SubjectNo`,`SubjectName`,`ClassHour`,`GradeID`) 
VALUES(1,'高数','96',2),(2,'大物','112',2),(3,'程序设计',64,3);

4.2、基础查询

4.2.1、语法

SELECT 查询列表 FROM 表名;

查询列表可以是:表中的(一个或多个)字段,常量,变量,表达式,函数

查询结果是一个虚拟的表格

4.2.2、示例

-- 查询全部学生
SELECT * FROM student;
-- 查询指定的字段
SELECT `LoginPwd`,`StudentName` FROM student;
-- 别名 AS(可以给字段起别名,也可以给表起别名)
SELECT `StudentNo` AS 学号,`StudentName` AS 学生姓名 FROM student AS 学生表;
-- 函数 CONCAT(str1,str2,...)
SELECT CONCAT('姓名',`name`) AS '新名字' FROM student;
-- 查询系统版本(函数)
SELECT VERSION();
-- 用来计算(计算表达式)
SELECT 100*53-90 AS 计算结果;
-- 查询自增步长(变量)
SELECT @@auto_increment_increment;
-- 查询有哪写同学参加了考试,重复数据要去重
SELECT DISTINCT `StudentNo` FROM result;

4.3、条件查询

where 条件字句:检索数据中符合条件的值

4.3.1、语法

select 查询列表 from 表名 where 筛选条件;

4.3.2、示例

-- 查询考试成绩在95~100之间的
SELECT `StudentNo`,`StudentResult` FROM result
WHERE `StudentResult`>=95 AND `StudentResult`<=100;
-- &&
SELECT `StudentNo`,`StudentResult` FROM result
WHERE `StudentResult`>=95 && `StudentResult`<=100;
-- BETWEEN AND
SELECT `StudentNo`,`StudentResult` FROM result
WHERE `StudentResult`BETWEEN 95 AND 100;
-- 查询除了1000号以外的学生
SELECT `StudentNo`,`StudentResult` FROM result
WHERE `StudentNo`!=1000;
-- NOT
SELECT `StudentNo`,`StudentResult` FROM result
WHERE NOT `StudentNo`=1000;
-- 查询名字含d的同学
SELECT `StudentNo`,`StudentName` FROM student
WHERE `StudentName` LIKE '%d%';
-- 查询名字倒数第二个为d的同学
SELECT `StudentNo`,`StudentName` FROM student
WHERE `StudentName` LIKE '%d_';
-- 查询1000,1001学员
SELECT `StudentNo`,`StudentName` FROM student
WHERE `StudentNo` IN (1000,1001);

4.4、分组查询

4.4.1、语法

select 分组函数,分组后的字段
from 表
[where 筛选条件]
[group by 分组的字段]
[having 分组后的筛选]
[order by 排序列表]

4.4.2、示例

-- 查询不同科目的平均分、最高分、最低分且平均分大于90
-- 核心:根据不同的课程进行分组
SELECT SubjectName,AVG(StudentResult),MAX(`StudentResult`),MIN(`StudentResult`)
FROM result r
INNER JOIN `subject` s
on r.SubjectNo=s.SubjectNo
GROUP BY r.SubjectNo
HAVING AVG(StudentResult)>90;


4.4.3、where和having的区别

**

使用关键字 筛选的表 位置

分组前筛选 where 原始表 group by的前面

分组后筛选 having 分组后的结果 group by 的后面

使用HAVING 可以对分完组之后的数据进行进一步过滤

HAVING不能单独使用,HAVING不能代替WHERE

HAVING必须和GROUP BY 联合使用

优化策略: WHERE 和 HAVING , 优先选择 WHERE , WHERE实在完成不了,再选择HAVING

4.5、连接查询

4.5.1、左连接

左表的记录会全部显示出来 , 而右表只会显示符合匹配条件的记录 , 匹配不到的显示为NULL


SELECT
  s1.*,
  s2.* 
FROM
  students_copy1 s1
  LEFT JOIN students_copy2 s2 ON s1.id = s2.id;

4.5.2、右连接

右表的记录会全部显示出来 , 而左表只会显示符合匹配条件的记录 , 匹配不到的显示为NULL



SELECT
  s2.*,
  s1.* 
FROM
  students_copy2 s2
  RIGHT JOIN students_copy1 s1 ON s1.id = s2.id;

4.5.3、内连接

显示左表和右表符合匹配条件的记录



SELECT
  s2.*,
  s1.* 
FROM
  students_copy2 s2
  INNER JOIN students_copy1 s1 ON s1.id = s2.id;

4.5.4、竖表连接

显示表1和表2的所有记录

union : 会删除数据的重复集

union all : 会删除数据的重复集


select * from students_copy1 
union all
select * from students_copy2

4.6、排序

4.6.1、语法

select 查询列表
from 表
where 筛选条件
order by 排序列表 asc/desc


order by的位置一般放在查询语句的最后(除limit语句之外)

| asc : | 升序,如果不写默认升序 |

| — | — |

| desc: | 降序 |

4.6.2、示例

SELECT`StudentNo`,`StudentName`,`GradeName`
FROM student s ORDERBY `StudentNo` DESC;


4.7、分页

4.7.1、语法

select 查询列表
from 表
limit offset,pagesize;


offset代表的是起始的条目索引,默认从0开始

size代表的是显示的条目数

offset=(n-1)*pagesize

-- 第一页 limit 0 5

-- 第二页 limit 5,5

-- 第三页 limit 10,5

-- 第n页  limit (n-1)*pagesize,pagesize

-- 第一页 limit 0 5
-- 第二页 limit 5,5
-- 第三页 limit 10,5
-- 第n页  limit (n-1)*pagesize,pagesize
-- pagesize:当前页面大小
-- (n-1)*pagesize:起始值
-- n:当前页面
-- 数据总数/页面大小=总页面数
-- limit n 表示从0到n的页面

4.7.2、示例

SELECT
  * 
FROM
  students 
  LIMIT 0,5

4.8、子查询

本质:在 where子句中嵌套一个子查询语句

4.8.1、示例

-- 查询‘课程设计’的所有考试结果(学号,科目编号,成绩)降序排列
-- 方式一:使用连接查询
SELECT `StudentNo`,r.`SubjectNo`,`StudentResult`
FROM result r
INNER JOIN `subject` s
on r.StudentNo=s.SubjectNo
WHERE SubjectName='课程设计'
ORDER BY StudentResult DESC;
-- 方式二:使用子查询(由里到外)
SELECT StudentNo,SubjectNo,StudentResult
from result
WHERE SubjectNo=(
  SELECT SubjectNo FROM `subject`
  WHERE SubjectName='课程设计'
)

4.9、DISTINCT 去重

SELECT DISTINCT NAME 
FROM
  students_copy1

4.10、BETWEEN AND 范围查询

SELECT DISTINCT NAME 
FROM
  students_copy1 
WHERE
  id BETWEEN 1 
  AND 7

4.11、LIKE模糊查询

select * from students_copy1 WHERE name LIKE '%三%'
select * from students_copy1 WHERE name LIKE '李%'
select * from students_copy1 WHERE name LIKE '%四'
select * from students_copy1 WHERE name LIKE '_三_'
select * from students_copy1 WHERE name LIKE '_三'
select * from students_copy1 WHERE name LIKE '李_'


4.12、IN 范围查询

select * from students_copy1 where id in ('8','6')


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
关系型数据库 MySQL 数据库连接
数据库连接工具连接mysql提示:“Host ‘172.23.0.1‘ is not allowed to connect to this MySQL server“
docker-compose部署mysql8服务后,连接时提示不允许连接问题解决
|
22天前
|
关系型数据库 MySQL 数据库
Docker Compose V2 安装常用数据库MySQL+Mongo
以上内容涵盖了使用 Docker Compose 安装和管理 MySQL 和 MongoDB 的详细步骤,希望对您有所帮助。
122 42
|
13天前
|
关系型数据库 MySQL 网络安全
如何排查和解决PHP连接数据库MYSQL失败写锁的问题
通过本文的介绍,您可以系统地了解如何排查和解决PHP连接MySQL数据库失败及写锁问题。通过检查配置、确保服务启动、调整防火墙设置和用户权限,以及识别和解决长时间运行的事务和死锁问题,可以有效地保障应用的稳定运行。
67 25
|
7天前
|
SQL 关系型数据库 MySQL
数据库数据恢复——MySQL简介和数据恢复案例
MySQL数据库数据恢复环境&故障: 本地服务器,安装的windows server操作系统。 操作系统上部署MySQL单实例,引擎类型为innodb,表空间类型为独立表空间。该MySQL数据库没有备份,未开启binlog。 人为误操作,在用Delete命令删除数据时未添加where子句进行筛选导致全表数据被删除,删除后未对该表进行任何操作。
|
1月前
|
SQL 关系型数据库 MySQL
Mysql-常用函数及其用法总结
以上列举了MySQL中一些常用的函数及其用法。这些函数在日常的数据库操作中非常实用,能够简化数据查询和处理过程,提高开发效率。掌握这些函数的使用方法,可以更高效地处理和分析数据。
68 19
|
2月前
|
SQL 关系型数据库 MySQL
【MySQL基础篇】盘点MySQL常用四大类函数
本文介绍了MySQL中的四大类常用函数:字符串函数、数值函数、日期函数和流程函数。
【MySQL基础篇】盘点MySQL常用四大类函数
|
1月前
|
缓存 关系型数据库 MySQL
【深入了解MySQL】优化查询性能与数据库设计的深度总结
本文详细介绍了MySQL查询优化和数据库设计技巧,涵盖基础优化、高级技巧及性能监控。
366 0
|
2月前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
80 3
|
2月前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
151 3
|
2月前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE &#39;log_%&#39;;`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
126 2

热门文章

最新文章