云计算百科
云计算领域专业知识百科平台

一文精通MySQL:从历史演变到实战操作,数据库核心全掌握

摘要

你是否曾被数据库的各种概念搞得晕头转向?是否在SQL语句的海洋中迷失方向?本文将带你穿越MySQL的发展历史,揭秘关系型与非关系型数据库的本质区别,并通过大量实战案例,手把手教你掌握DDL、约束、窗口函数等核心概念。无论你是初学者还是希望系统梳理知识的开发者,这篇万字长文都将为你打开数据库世界的大门!

为什么需要数据库?文件存储的局限性

在深入MySQL之前,我们先思考一个基本问题:为什么需要数据库?为什么不直接使用文件系统(如Excel、txt文件)存储数据?

文件存储的痛点

想象一下,你正在管理一个学校的教务系统:

数据冗余和不一致

学生信息.txt 文件: 学号,姓名,班级,年龄 2023001,张三,计算机1班,18 2023002,李四,计算机1班,19 ​ 成绩记录.txt 文件: 学号,姓名,课程,成绩  # 姓名重复存储! 2023001,张三,数据库,85 2023001,张三,算法,90

并发访问问题

教师A正在修改学生张三的成绩 同时教师B也在修改张三的成绩 结果:最后保存的文件会覆盖之前的修改!

数据查找效率低下

要在10000条txt记录中找出所有不及格的学生: – 需要逐行读取整个文件 – 时间复杂度:O(n) – 无法快速定位数据

缺乏数据完整性保障

学生信息.txt: 2023003,王五,不存在的班级,200岁  # 数据明显错误!

数据库的优势

数据共享与并发控制

— 数据库会自动处理并发 BEGIN TRANSACTION; UPDATE scores SET score = 85 WHERE student_id = 1; — 其他用户同时修改时会等待或报错 COMMIT;

高效的数据检索

— 创建索引,查询速度提升1000倍+ CREATE INDEX idx_student_score ON scores(student_id, score); SELECT * FROM scores WHERE student_id = 1 AND score > 60;

数据完整性保障

— 年龄必须在合理范围内 ALTER TABLE students ADD CONSTRAINT chk_age CHECK (age BETWEEN 15 AND 60); ​ — 学号必须唯一 ALTER TABLE students ADD UNIQUE (student_no);

数据安全控制

— 只允许教师角色查看成绩 GRANT SELECT ON scores TO teacher_role; ​ — 学生只能查看自己的成绩 CREATE VIEW student_own_scores AS SELECT * FROM scores WHERE student_id = CURRENT_USER_ID();

MySQL的前世今生:一个开源传奇

诞生与早期发展

MySQL的故事始于1995年,由瑞典公司MySQL AB创立,创始人是David Axmark和Michael \”Monty\” Widenius。MySQL的名字来源于Monty的女儿\”My\”,\”SQL\”则是结构化查询语言的缩写。最初,MySQL定位为一个轻量级、快速、易用的数据库系统,主要面向Web应用。

关键发展里程碑

  • 2000年:开源发布,采用GPL许可证
  • 2008年:被Sun Microsystems以10亿美元收购
  • 2010年:Oracle收购Sun,MySQL归属Oracle旗下
  • 2010年至今:在Oracle的管理下持续发展,同时出现了MariaDB(MySQL创始人Monty创建的分支)等替代品

MySQL的成功秘诀

MySQL之所以能在激烈的数据库竞争中脱颖而出,主要得益于:

  • 开源免费:降低了企业和开发者的使用门槛
  • 性能优异:在处理读密集型操作上表现出色
  • 简单易用:学习曲线平缓,部署快速
  • 社区强大:拥有活跃的开源社区支持

数据库类型:关系型vs非关系型

关系型数据库(RDBMS)

核心特征:数据以表格形式存储,表与表之间通过关系连接

优点:

  • 数据结构化,一致性强
  • 支持复杂的查询和事务处理
  • 数据完整性好(ACID特性)

代表产品:MySQL、PostgreSQL、Oracle、SQL Server

典型场景:银行交易系统、ERP系统、财务系统等需要强一致性的场景

非关系型数据库(NoSQL)

核心特征:不使用固定的表结构,数据模型灵活

主要类型:

  • 文档型:MongoDB、CouchDB
  • 键值型:Redis、Memcached
  • 列存储:Cassandra、HBase
  • 图数据库:Neo4j

优点:

  • 灵活性高,模式自由
  • 扩展性好,适合分布式环境
  • 读写性能高

典型场景:社交网络、物联网、实时分析等大数据场景

现代数据库趋势

如今,许多企业采用混合架构,根据不同的业务场景选择合适的数据库类型。同时,NewSQL(如Google Spanner、TiDB)也在崛起,试图结合关系型和非关系型的优点。

SQL语言分类:DDL、DML、DQL、DCL详解

DDL(数据定义语言)

负责定义和修改数据库结构,包括数据库、表、列等对象的创建、修改和删除。

  • 创建(CREATE):新建数据库。

— 创建数据库
CREATE DATABASE 数据库名;

— 创建表
CREATE TABLE 表名 (
列名 数据类型 [约束],
列名 数据类型 [约束],

);

— 创建索引
CREATE INDEX 索引名 ON 表名 (列名);

— 创建视图
CREATE VIEW 视图名 AS SELECT语句;

  • 删除(DROP):彻底删除数据库及其所有内容。

DROP DATABASE 数据库名; — 删除数据库
DROP TABLE 表名; — 删除表
DROP INDEX 索引名 ON 表名; — 删除索引
DROP VIEW 视图名; — 删除视图

  • 修改(ALTER):修改数据库的结构或属性。

— 修改表结构
ALTER TABLE 表名
ADD 列名 数据类型; — 添加列
DROP COLUMN 列名; — 删除列
MODIFY COLUMN 列名 新数据类型; — 修改列类型
RENAME COLUMN 旧列名 TO 新列名; — 重命名列
ADD CONSTRAINT 约束名 约束类型 (列); — 添加约束

  • 清空(TRUNCATE):清空表。

TRUNCATE TABLE 表名;

  • 重命名(rename):重命名表名。

RENAME TABLE 旧表名 TO 新表名;

  • 查看(SHOW):显示数据库列表或相关信息。

— 查看所有数据库
SHOW DATABASES;
— 查看库中所有表
SHOW TABLES;
— 查看数据库创建语句
SHOW CREATE DATABASE 数据库名;
— 查看数据表创建语句
SHOW CREATE TABLE 数据表名;

  • 切换(USE):切换当前使用的数据库。

USE 数据库名;

DML(数据操纵语言)

负责对表中的数据进行增、删、改操作。

  • 插入(INSERT):向数据表中添加新记录。

— 插入指定列
INSERT INTO 表名 (列1, 列2, …)
VALUES (值1, 值2, …);

— 插入所有列
INSERT INTO 表名
VALUES (值1, 值2, …);

— 插入查询结果
INSERT INTO 表名 (列1, 列2, …)
SELECT 列1, 列2, … FROM 其他表;

  • 删除(DELETE):删除数据表中的指定记录。

DELETE FROM 表名
WHERE 条件;

  • 更新(UPDATE):修改数据表中已存在的记录。

UPDATE 表名
SET 列1 = 值1,
列2 = 值2,

WHERE 条件;

DQL(数据查询语言)

负责查询数据,主要是SELECT语句。

  • 查询(SELECT):从数据表中检索所需数据。

— 基本格式
SELECT [DISTINCT] 列1, 列2, 聚合函数(列) — 1. 选择列
FROM 表名 — 2. 数据来源
[WHERE 条件] — 3. 筛选行
[GROUP BY 分组列] — 4. 分组
[HAVING 分组条件] — 5. 分组后筛选
[ORDER BY 排序列 [ASC|DESC]] — 6. 排序
[LIMIT 起始位置, 行数]; — 7. 限制结果
— 基础查询
SELECT * FROM 表名;
SELECT 列1, 列2 FROM 表名;

— 条件查询
SELECT * FROM 表名 WHERE 条件;

— 聚合查询
SELECT 聚合函数(列) FROM 表名;
— 常用聚合函数:COUNT(), SUM(), AVG(), MAX(), MIN()

— 分组查询
SELECT 分组列, 聚合函数(列)
FROM 表名
GROUP BY 分组列
HAVING 条件;

— 连接查询
— 内连接
SELECT * FROM 表1 INNER JOIN 表2 ON 连接条件;
— 左连接
SELECT * FROM 表1 LEFT JOIN 表2 ON 连接条件;
— 右连接
SELECT * FROM 表1 RIGHT JOIN 表2 ON 连接条件;
— 全外连接(MySQL 8.0+)
SELECT * FROM 表1 FULL JOIN 表2 ON 连接条件;
— 交叉连接
SELECT * FROM 表1 CROSS JOIN 表2;

— 子查询
SELECT * FROM 表1
WHERE 列 IN (SELECT 列 FROM 表2);

— 联合查询
SELECT 列 FROM 表1
UNION [ALL]
SELECT 列 FROM 表2;

— 分页查询
SELECT * FROM 表名 LIMIT 偏移量, 行数;
— MySQL 8.0+ 支持
SELECT * FROM 表名 LIMIT 行数 OFFSET 偏移量;

— 窗口函数查询
SELECT
列,
ROW_NUMBER() OVER (ORDER BY 排序列) AS 行号,
RANK() OVER (PARTITION BY 分组列 ORDER BY 排序列) AS 排名
FROM 表名;

DCL(数据控制语言)

负责权限管理和事务控制。

MySQL数据类型:选择比努力更重要

1. 数值类型:精打细算的艺术

整数类型:

类型
字节
有符号范围
无符号范围
适用场景
TINYINT 1 -128~127 0~255 年龄、状态码
SMALLINT 2 -32768~32767 0~65535 端口号、小计数值
MEDIUMINT 3 -838万~838万 0~1677万 用户ID、文章数
INT 4 -21亿~21亿 0~42亿 大用户量ID、订单数
BIGINT 8 -922亿亿~922亿亿 0~1844亿亿 金融金额、海量数据

浮点数类型:

类型
字节
适用场景
FLOAT 4 单精度浮点数,精度约7位小数,适用于科学计算、测量数据
DOUBLE 8 双精度浮点数,精度约15位小数,适用于高精度计算、工程数据
DECIMAL(M,D) 变长 精确小数,适用于金融金额、需要精确计算的场景

2. 字符串类型:空间与性能的平衡

类型
最大长度
存储特点
适用场景
CHAR(n) 255字符 固定长度,空格填充 性别、状态码、MD5哈希
VARCHAR(n) 65535字节 可变长度,1-2字节长度前缀 用户名、地址、邮箱
TINYTEXT 255字节 可变长度,效率稍低 短描述、备注
TEXT 65KB 可变长度,额外存储 文章内容、评论
MEDIUMTEXT 16MB 大文本存储 长文章、日志
LONGTEXT 4GB 超大文本 书籍、详细报告
ENUM 65535个值 内部用整数存储 有限选项如状态、类型
SET 64个成员 位图存储多选项 标签、多选项

3. 日期时间类型:时间就是一切

类型
格式
范围
存储空间
适用场景
DATE YYYY-MM-DD 1000-01-01 ~ 9999-12-31 3字节 生日、事件日期
TIME HH:MM:SS[.微秒] -838:59:59 ~ 838:59:59 3字节 持续时间、时间间隔
DATETIME YYYY-MM-DD HH:MM:SS[.微秒] 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 8字节 订单时间、日志时间
TIMESTAMP YYYY-MM-DD HH:MM:SS[.微秒] 1970-01-01 00:00:01 ~ 2038-01-19 03:14:07 4字节 自动时间戳、版本控制
YEAR YYYY 1901 ~ 2155 1字节 毕业年份、成立年份

4. JSON类型:现代应用的首选

类型
字节
存储格式
支持操作
适用场景
JSON 变长
赞(0)
未经允许不得转载:网硕互联帮助中心 » 一文精通MySQL:从历史演变到实战操作,数据库核心全掌握
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!