适合人群:完全没学过数据库的同学,或者只会 Excel 想入门 SQL 的朋友。
本系列以 MySQL 8.0 为准,所有代码都能直接复制运行。
一、数据库是个啥?为啥不用 Excel?
想象你开了一家网店,订单越来越多。刚开始用 Excel 记录还行,但:
- 同时有 100 个客服查同一张表,Excel 会卡死
- 两个人同时修改同一条记录,谁的改动算数?
- 突然停电,文件损坏,所有数据没了怎么办?
数据库就是为解决这些问题诞生的。它不只是”存数据的地方”,还保证多人同时读写不出错、断电重启数据还在、查几百万条记录也很快。
关系型数据库:用”表”来组织数据
MySQL 就是一种关系型数据库,数据存在一张张”表”里,就像 Excel 的 Sheet:
1 | 用户表(users) |
多张表之间可以通过”外键”关联,比如订单表里记录 user_id=1,就知道这是 alice 的订单。
MySQL 的来历(超简短版)
- 1990 年代:几个瑞典程序员开发了 MySQL,主打快、免费、好上手
- 2000 年代:网站爆发,”Linux + Apache + MySQL + PHP” 的 LAMP 组合横扫 Web 开发
- 2010 年:Oracle 收购,MySQL 持续维护,同时衍生出 MariaDB 等开源分支
- 现在:MySQL 8.0 加入了窗口函数、JSON、更强的安全机制,企业主流版本
二、安装 MySQL(三种方式)
方式一:Linux(Ubuntu)
1 | # 安装 MySQL 8.0 |
方式二:Docker(推荐学习用,不影响本机环境)
1 | # 一条命令启动 MySQL 8.0,密码设为 Test_123! |
为什么推荐 Docker:删了容器就彻底干净,不会把本机环境搞乱;学习、测试都很方便。
方式三:Windows
去 MySQL 官网下载 MSI 安装包,一路下一步即可。安装完在命令行验证:
1 | # 检查版本和字符集 |
三、SQL 是什么?四类命令一次搞清楚
SQL 全称”结构化查询语言”,你对数据库说的每句话都是 SQL。按用途分四类:
| 分类 | 中文叫法 | 干什么 | 常用语句 |
|---|---|---|---|
| DDL | 数据定义语言 | 建库、建表、改结构 | CREATE ALTER DROP |
| DML | 数据操作语言 | 增删改数据 | INSERT UPDATE DELETE |
| DQL | 数据查询语言 | 查数据 | SELECT |
| DCL | 数据控制语言 | 管权限 | GRANT REVOKE |
下面用这四类命令搭建贯穿全系列的演示数据库:
DDL:建库建表
1 | -- 第一步:创建演示库,指定字符集(utf8mb4 支持中文和 Emoji) |
执行后数据库和表就建好了。AUTO_INCREMENT 会自动生成 1、2、3… 的主键,不用手动填。
DML:插入数据
1 | -- 插入三个用户 |
三行数据插进去了,user_id 会自动变成 1、2、3。
DQL:查询数据
1 | -- 查刚才插入的用户,按 user_id 排序 |
预期结果:返回 3 行,alice/bob/carol 各一行。
DCL:管理权限
1 | -- 创建一个只能查询的账号(给报表工具用) |
预期只看到 GRANT SELECT ON mysql_zero_to_one.*,没有增删改权限。
四、数据类型怎么选?
选错类型是新手最常见的坑,下面列几个关键原则:
数值类型
| 类型 | 占用空间 | 范围(有符号) | 什么时候用 |
|---|---|---|---|
TINYINT |
1 字节 | -128 ~ 127 | 状态、标志位 |
INT |
4 字节 | -21亿 ~ 21亿 | 普通 ID、数量 |
BIGINT |
8 字节 | 极大 | 主键(高并发系统) |
DECIMAL(12,2) |
变长 | 精确小数 | 金额必用,不能用 float |
为什么金额不能用 float:
0.1 + 0.2在浮点数里等于0.30000000000000004,钱算错了麻烦大了。
字符串类型
VARCHAR(n):长度可变,存用户名、标题、描述——大多数情况用这个CHAR(n):长度固定,存身份证号、手机号这类固定长度的编码TEXT:存长文章,但不能建普通索引,尽量少用
时间类型
DATETIME:存什么时区就是什么,不自动转换,推荐存 UTC 时间TIMESTAMP:会随时区设置转换,范围只到 2038 年(有 Y2K38 问题)
建完整的业务表
1 | -- 商品表、订单表、订单明细表 |
五、基础查询:SELECT 怎么写
最简单的查询结构
1 | SELECT 要查哪些列 |
实战:查询用户订单
1 | -- 查用户 1 的所有订单,按时间倒序,最新的在最前面 |
预期:返回用户 1 的订单,最新的排在第一行。
1 | -- 查询已支付订单的完整明细(关联四张表) |
预期:返回订单 1 和 3 的商品明细,并计算每行小计。
小技巧:ORDER BY 里加主键(
order_id),保证相同时间戳下的排序稳定,翻页不会乱。
思考与练习
- 试着查询库存不足 60 件、价格在 200~400 元之间的商品。
DELETE FROM users WHERE user_id = 1和TRUNCATE TABLE users有什么区别?试试看。- 给
products表加一个category列(商品分类),用什么类型合适?
本章核心总结
- 数据库解决多人并发、断电恢复、大数据量查询三大问题
- SQL 四类命令各司其职:DDL 管结构、DML 改数据、DQL 查数据、DCL 管权限
- 金额用
DECIMAL,不用float;字符串优先VARCHAR;时间推荐DATETIME存 UTC
下一步学习建议
保存好这个初始化脚本,后续每篇文章都在这个库里做实验。下一篇学习更强大的查询:聚合统计、多表连接、子查询和窗口函数。