【计算基础|MySQL01】【上手】安装连接、数据类型与建库建表
很多人学 MySQL 的第一周就卡住了:本地装了半天装不上、连上了不知道建库要写什么字符集、建表时 INT(11) 到底什么意思搞不清、存个 emoji 直接报 Incorrect string value。这些坑不解决,后面写 SQL 全是玄学。
这篇不堆理论,目标是让你照着敲就能把 MySQL 8 跑起来、连上、建库建表并插进数据。全程用 Docker 起一个干净的 MySQL 8,每条命令都给:语法 → 实例 → 预期输出 → 易错点。结尾建一个电商 demo 库(users / products / orders 三张表),后面三篇都在这套表上练手。
环境:macOS + Docker Desktop,MySQL 8.0.46 容器,端口 3306,root 密码 root123。所有 SQL 均在该实例上真实执行,输出原样贴入。
一、用 Docker 十分钟把 MySQL 8 跑起来
结论先给:别在本机直接装 MySQL,用 Docker 起容器。卸载干净、版本随意切、不污染系统,出问题删掉容器重来就行。
1.1 一条命令起容器
bash
docker run -d --name mysql8 \
-e MYSQL_ROOT_PASSWORD=root123 \
-e MYSQL_DATABASE=demo \
-p 3306:3306 \
mysql:8.0
| 参数 | 作用 |
|---|---|
-d |
后台运行 |
--name mysql8 |
容器起名,后面都用它 |
-e MYSQL_ROOT_PASSWORD=root123 |
设置 root 密码(必填,不然起不来) |
-e MYSQL_DATABASE=demo |
首次启动自动建一个 demo 库(可选) |
-p 3306:3306 |
把容器 3306 映射到本机 3306 |
✅ 成功标志 :容器状态是 Up,并且 docker logs mysql8 末尾出现 ready for connections。
1.2 看启动日志 / 启停容器
bash
# 看日志(首次启动要初始化数据目录,约 10~20 秒,急着连会报 connection refused)
docker logs mysql8
# 停止 / 启动 / 重启
docker stop mysql8
docker start mysql8
docker restart mysql8
日志末尾这一行就代表准备好了:
text
[Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.46' port: 3306 MySQL Community Server - GPL.
⚠️ 易错点 :容器刚 docker run 完立刻连,大概率报 Can't connect to local MySQL server。MySQL 首次启动要做数据目录初始化,等 10 秒再连。想看它到底好了没,用:
bash
docker exec mysql8 mysqladmin ping -uroot -proot123
# 返回 mysqld is alive 就成了
二、怎么连上去:命令行与图形客户端
2.1 命令行连接
进容器里连(最省事,不用装本机客户端):
bash
docker exec -it mysql8 mysql -uroot -proot123
如果本机装了 mysql 客户端,也可以连映射出来的端口:
bash
mysql -h 127.0.0.1 -P 3306 -uroot -proot123
| 参数 | 含义 |
|---|---|
-h |
主机,本机连容器写 127.0.0.1,别写 localhost(会走 socket 文件) |
-P |
端口,大写 P,默认 3306 |
-u |
用户名 |
-p |
密码,注意 -p 和密码之间不要有空格 ;也可以只写 -p 回车后交互输入 |
连上后常用快捷键:
| 命令 | 作用 |
|---|---|
\q 或 exit |
退出 |
\G |
把查询结果纵向显示(列太多、横着看串行了就用它) |
source /路径/x.sql |
执行一个 SQL 文件 |
--prompt |
自定义提示符,如 mysql --prompt="\\u@\\h:\\R:\\m 库:\\d> " |
⚠️ 易错点 :-proot123 密码紧跟 p 写;写成 -p root123 会被当成要连的数据库名。另外命令行直接带密码会报警告 Using a password on the command line interface can be insecure,忽略即可,练习环境无所谓。
2.2 图形客户端连接配置
命令行敲多了眼瞎,实际开发用图形客户端。三个主流选择:
| 客户端 | 特点 |
|---|---|
| DataGrip | JetBrains 全家桶,智能提示最强,我们日常主力 |
| Navicat | 老牌国产,可视化表设计方便,收费 |
| DBeaver | 开源免费,支持几乎所有数据库 |
连接配置都长一样,照着填:
text
Host : 127.0.0.1
Port : 3306
User : root
Password : root123
Database : demo(可先不填,连上再选)
⚠️ 易错点 :MySQL 8 默认用 caching_sha2_password 认证插件,老版本客户端(如旧 Navicat)可能连不上报 Authentication plugin 'caching_sha2_password' cannot be loaded。要么升级客户端,要么在容器里把用户改回老插件:
sql
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root123';
三、库的增删改查
3.1 语法与实例
sql
-- 建库:指定字符集和排序规则(强烈建议显式写)
CREATE DATABASE demo DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 看所有库
SHOW DATABASES;
-- 切库
USE demo;
-- 看当前在哪个库
SELECT DATABASE();
-- 删库(高危)
DROP DATABASE demo;
SHOW DATABASES 真实输出(MySQL 8 自带 4 个系统库):
text
Database
demo
information_schema
mysql
performance_schema
sys
| 系统库 | 作用 |
|---|---|
mysql |
用户权限、账号密码都在这,别乱删 |
information_schema / sys |
元数据(表结构、字段、权限) |
performance_schema |
性能监控数据 |
⚠️ 避坑 :DROP DATABASE 删库不可恢复(除非有备份),它会把库下所有表和数据一起干掉。练习时别手滑在生产库上敲。
3.2 字符集:utf8mb4 是绕不开的坎
结论先给:MySQL 8 默认就是 utf8mb4,建库建表一律用 utf8mb4,别再用 utf8。
| 字符集 | 最多每字符字节 | 能存 emoji 吗 | 说明 |
|---|---|---|---|
utf8(即 utf8mb3) |
3 字节 | ❌ 不能 | MySQL 历史遗留,已废弃,最多存 BMP 内字符 |
utf8mb4 |
4 字节 | ✅ 能 | MySQL 8 默认,真正的 UTF-8 |
为什么强调这个?存个 emoji 就知道了。我建了个两列表,一列 utf8mb3、一列 utf8mb4:
sql
CREATE TABLE t_emo(c1 VARCHAR(100) CHARSET utf8mb3, c2 VARCHAR(100) CHARSET utf8mb4);
INSERT INTO t_emo(c2) VALUES ('你好🌍🎉');
SELECT c2, CHAR_LENGTH(c2) AS chars, LENGTH(c2) AS bytes FROM t_emo;
输出:
text
c2 chars bytes
你好🌍🎉 4 14
你好🌍🎉 是 4 个字符,占 14 字节(中文每字 3 字节、emoji 每个 4 字节)。而往 utf8mb3 列插 emoji 直接报错:
text
ERROR 1366 (HY000): Incorrect string value: '\xF0\x9F\x8C\x8D' for column 'c1' at row 1
🔴 这就是经典的 Incorrect string value 报错------不是数据错了,是列的字符集不支持 4 字节字符。
排序规则(COLLATE)两个常用对比:
| COLLATE | 特点 |
|---|---|
utf8mb4_unicode_ci |
按 Unicode 标准排序,更准确,推荐 |
utf8mb4_general_ci |
老规则,速度略快但排序不严谨 |
_ci 结尾表示 case insensitive (大小写不敏感),即 'ABC' 和 'abc' 视为相等。
查看当前字符集:
sql
SHOW VARIABLES LIKE 'character%';
输出(注意 character_set_database 是 utf8mb4,而命令行客户端连接默认可能是 latin1------这也是为什么我后面执行 SQL 时都加了 --default-character-set=utf8mb4):
text
character_set_client latin1
character_set_connection latin1
character_set_database utf8mb4
character_set_server utf8mb4
character_set_system utf8mb3
⚠️ 易错点 :库是 utf8mb4,但客户端连接如果是 latin1,中文/emoji 仍可能乱码。连接时加 --default-character-set=utf8mb4,或在 SQL 开头执行 SET NAMES utf8mb4;。
四、常用数据类型速查
建表选类型是个"选对了不显眼、选错了出大事"的活。下面按类别给速查表,每个都在本机跑过。
4.1 整数
| 类型 | 字节 | 有符号范围 | 无符号范围(UNSIGNED) |
|---|---|---|---|
| TINYINT | 1 | -128 ~ 127 | 0 ~ 255 |
| SMALLINT | 2 | -32768 ~ 32767 | 0 ~ 65535 |
| MEDIUMINT | 3 | -8388608 ~ 8388607 | 0 ~ 16777215 |
| INT | 4 | -21亿 ~ 21亿 | 0 ~ 42亿 |
| BIGINT | 8 | 约 ±9.2×10^18 | 更大 |
sql
CREATE TABLE t_int(a TINYINT, b SMALLINT, c INT, d BIGINT, e INT UNSIGNED);
INSERT INTO t_int VALUES (127, 32767, 2147483647, 9223372036854775807, 4294967295);
SELECT * FROM t_int;
输出:
text
a b c d e
127 32767 2147483647 9223372036854775807 4294967295
🔴 重点 :INT(11) 里的 11 不是"存 11 位数字",而是显示宽度 ,跟能存多大完全无关。UNSIGNED 才是真正扩大范围的关键字(状态值、年龄这种不可能为负的用它)。MySQL 8.0.17 起已废弃 ZEROFILL(用前导零补显示宽度),别再写。
4.2 小数:金额必须用 DECIMAL
| 类型 | 特点 | 用在哪 |
|---|---|---|
DECIMAL(M,D) |
精确存储,M 总位数 D 小数位 | 🔴 金额、价格,必用 |
FLOAT / DOUBLE |
近似值,有精度误差 | 科学计算、对精度不敏感的统计 |
sql
CREATE TABLE t_num(d DECIMAL(10,2), f FLOAT);
INSERT INTO t_num VALUES (0.1, 0.1), (0.2, 0.2);
SELECT d, f, d+d AS dec_sum, f+f AS float_sum FROM t_num;
输出:
text
d f dec_sum float_sum
0.10 0.1 0.20 0.20000000298023224
0.20 0.2 0.40 0.4000000059604645
⚠️ 避坑 :0.1 + 0.2 在 FLOAT 下不是 0.2,而是 0.20000000298023224------这就是浮点精度问题。钱用 FLOAT 存,对账时会差几分钱 ,生产事故级别。金额一律 DECIMAL(10,2) 起步。
4.3 字符串
| 类型 | 特点 | 上限 |
|---|---|---|
CHAR(M) |
定长,不足补空格 | 最多 255 字符 |
VARCHAR(M) |
变长,按实际存 | 最多 65535 字节(整行) |
TEXT |
长文本(TINY/MEDIUM/LONG 四档) | 最大 4GB |
BLOB |
二进制(存图片、文件) | 最大 4GB |
sql
CREATE TABLE t_str(c CHAR(4), v VARCHAR(4));
INSERT INTO t_str VALUES ('ab','ab'), ('中文','中文');
SELECT CONCAT('[',c,']') AS c_val, CONCAT('[',v,']') AS v_val FROM t_str;
输出:
text
c_val v_val
[ab] [ab]
[中文] [中文]
怎么选:长度固定用 CHAR (如手机号、MD5 哈希),长度不固定用 VARCHAR (如用户名、地址)。CHAR 虽然补空格,但读取时尾随空格会被自动去掉,所以上面 [ab] 看不到补的空格。
4.4 日期时间
| 类型 | 格式 | 范围 / 特点 |
|---|---|---|
DATE |
YYYY-MM-DD |
日期 |
TIME |
HH:MM:SS |
时间 |
DATETIME |
YYYY-MM-DD HH:MM:SS |
范围 1000~9999 年,不受时区影响 |
TIMESTAMP |
同上 | 4 字节,1970~2038 年,受时区影响,自动转 UTC |
YEAR |
YYYY |
年 |
sql
CREATE TABLE t_date(d DATE, t TIME, dt DATETIME, ts TIMESTAMP);
INSERT INTO t_date VALUES ('2026-09-24','14:30:00','2026-09-24 14:30:00','2026-09-24 14:30:00');
SELECT * FROM t_date;
输出:
text
d t dt ts
2026-09-24 14:30:00 2026-09-24 14:30:00 2026-09-24 14:30:00
🔴 DATETIME vs TIMESTAMP 怎么选 :业务时间(如订单创建时间)用 DATETIME,不随时区变;需要跨时区转换、或记录"上次修改时间"自动更新才用 TIMESTAMP。TIMESTAMP 还有个 2038 问题(4 字节存秒数上限),新系统别把关键时间押在它身上。
4.5 JSON(MySQL 5.7+)
sql
CREATE TABLE t_json(j JSON);
INSERT INTO t_json VALUES ('{"name":"lonez","tags":["db","mysql"],"age":28}');
SELECT j->>'$.name' AS name, JSON_EXTRACT(j,'$.tags[0]') AS tag0, j->'$.age' AS age FROM t_json;
输出:
text
name tag0 age
lonez "db" 28
取 JSON 字段三种写法:JSON_EXTRACT(j,'$.name')、j->'$.name'(带引号)、j->>'$.name'(去引号,常用)。
4.6 枚举与集合
| 类型 | 特点 |
|---|---|
ENUM |
单选,最多 65535 个值 |
SET |
多选,最多 64 个值 |
sql
CREATE TABLE t_enum(gender ENUM('M','F','U'), hobbies SET('读书','打球','编程'));
INSERT INTO t_enum VALUES ('M','读书,编程'), ('F','打球');
SELECT * FROM t_enum;
输出:
text
gender hobbies
M 读书,编程
F 打球
⚠️ 避坑 :ENUM 加新值要 ALTER TABLE,扩展性差;状态字段现在更常用 TINYINT + 注释(如 status TINYINT COMMENT '0待支付 1已支付')。
五、约束:给数据上规矩
约束是"不满足条件就不让你插"的规则。建表时写清楚,比在应用层校验可靠得多。
| 约束 | 作用 | 一张表能几个 |
|---|---|---|
PRIMARY KEY |
主键,唯一且非空 | 只能 1 个 |
AUTO_INCREMENT |
自增 | 一般配主键 |
NOT NULL |
非空 | 随意 |
UNIQUE |
唯一 | 可多个 |
DEFAULT |
默认值 | 随意 |
CHECK |
自定义条件 | MySQL 8.0.16+ 真正生效 |
FOREIGN KEY |
外键 | 可多个 |
实战建一个综合演示表:
sql
CREATE TABLE t_cons(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
age INT DEFAULT 18,
status TINYINT CHECK (status IN (0,1,2))
);
INSERT INTO t_cons(name,email,status) VALUES ('张三','z@a.com',1),('李四','l@a.com',2);
SELECT * FROM t_cons;
输出:
text
id name email age status
1 张三 z@a.com 18 1
2 李四 l@a.com 18 2
三条违规各自报错(这就是约束的意义):
sql
INSERT INTO t_cons(name) VALUES (NULL);
-- ERROR 1048 (23000): Column 'name' cannot be null
INSERT INTO t_cons(name,email) VALUES ('王五','z@a.com');
-- ERROR 1062 (23000): Duplicate entry 'z@a.com' for key 't_cons.email'
INSERT INTO t_cons(name,email,status) VALUES ('赵六','z@b.com',9);
-- ERROR 3819 (HY000): Check constraint 't_cons_chk_1' is violated.
⚠️ 三个高频认知纠正:
- 自增不保证连续。删掉 id=2 再插新行,新行拿到的是 id=4,不是 3:
text
id name
1 张三
4 孙七
回滚、删除、插入失败都会在自增序列上"留洞"。别拿自增值当业务序号用。
-
UNIQUE 列可以有多个 NULL(NULL 不等于任何值,多个 NULL 不算重复)。
-
外键在互联网大厂常被禁用 。原因:外键检查拖性能、分库分表后跨库没法建外键、表之间耦合太重。一般靠应用层保证一致性 ,表里留个
user_id字段即可,不真建 FOREIGN KEY 约束。
六、DDL:建表、改表、删表
6.1 建表完整语法
sql
CREATE TABLE 表名(
字段 类型 约束,
...
PRIMARY KEY(主键),
INDEX 索引名(字段)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
两个结尾选项必须懂:
| 选项 | 作用 |
|---|---|
ENGINE=InnoDB |
存储引擎,支持事务、行锁、外键。MySQL 8 默认就是它,别写 MyISAM |
DEFAULT CHARSET=utf8mb4 |
表级字符集,跟库保持一致 |
6.2 改表 ALTER TABLE
sql
-- 加列
ALTER TABLE users ADD COLUMN phone VARCHAR(20) AFTER email;
-- 改列类型
ALTER TABLE users MODIFY COLUMN balance DECIMAL(12,2) NOT NULL DEFAULT 0.00;
-- 加索引
ALTER TABLE users ADD INDEX idx_status(status);
⚠️ 避坑 :大表上 ALTER TABLE 会锁表/拷贝全表,线上改表要用 pt-online-schema-change 或 gh-ost,别直接在高峰期执行。
6.3 TRUNCATE vs DELETE:别再混
sql
CREATE TABLE t_trunc(id INT PRIMARY KEY AUTO_INCREMENT, v VARCHAR(20));
INSERT INTO t_trunc(v) VALUES ('a'),('b'),('c');
DELETE FROM t_trunc;
INSERT INTO t_trunc(v) VALUES ('after_delete');
SELECT * FROM t_trunc;
text
id v
4 after_delete
sql
TRUNCATE TABLE t_trunc;
INSERT INTO t_trunc(v) VALUES ('after_truncate');
SELECT * FROM t_trunc;
text
id v
1 after_truncate
| 对比 | DELETE FROM t |
TRUNCATE TABLE t |
|---|---|---|
| 类型 | DML | DDL |
| 可回滚 | ✅ 事务里能 ROLLBACK | ❌ 不可回滚 |
| 自增值 | 不重置(接着往上长,留洞) | 🔴 重置为 1 |
| 触发器 | 会触发 | 不触发 |
| 速度 | 逐行删,慢 | 直接清表,快 |
6.4 看表结构
sql
-- 看建表语句(最完整,含索引、引擎、字符集)
SHOW CREATE TABLE orders\G
-- 看字段概要(快)
DESC users;
SHOW CREATE TABLE orders 真实输出:
text
CREATE TABLE `orders` (
`id` bigint NOT NULL AUTO_INCREMENT,
`user_id` bigint NOT NULL,
`product_id` bigint NOT NULL,
`quantity` int NOT NULL DEFAULT '1',
`amount` decimal(10,2) NOT NULL,
`status` tinyint NOT NULL DEFAULT '0' COMMENT '0待支付 1已支付 2已发货 3完成 4取消',
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_user` (`user_id`),
KEY `idx_product` (`product_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
DESC users 输出:
text
Field Type Null Key Default Extra
id bigint NO PRI NULL auto_increment
username varchar(50) NO NULL
email varchar(100) NO UNI NULL
age tinyint unsigned YES NULL
balance decimal(10,2) NO 0.00
status tinyint NO 1
created_at datetime NO CURRENT_TIMESTAMP DEFAULT_GENERATED
七、实操:建一个电商 demo 库
把前面学的全用上,建 shop 库,三张表:users(用户)、products(商品)、orders(订单)。后面三篇都在这套表上练。
sql
CREATE DATABASE shop DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE shop;
CREATE TABLE users(
id BIGINT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
age TINYINT UNSIGNED,
balance DECIMAL(10,2) NOT NULL DEFAULT 0.00,
status TINYINT NOT NULL DEFAULT 1 COMMENT '1正常 0禁用',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE uk_email(email)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE products(
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
price DECIMAL(10,2) NOT NULL,
stock INT NOT NULL DEFAULT 0,
category VARCHAR(30),
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE orders(
id BIGINT PRIMARY KEY AUTO_INCREMENT,
user_id BIGINT NOT NULL,
product_id BIGINT NOT NULL,
quantity INT NOT NULL DEFAULT 1,
amount DECIMAL(10,2) NOT NULL,
status TINYINT NOT NULL DEFAULT 0 COMMENT '0待支付 1已支付 2已发货 3完成 4取消',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
INDEX idx_user(user_id),
INDEX idx_product(product_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO users(username,email,age,balance) VALUES
('alice','alice@test.com',25,1000.00),
('bob','bob@test.com',30,500.50),
('carol','carol@test.com',28,2000.00);
INSERT INTO products(name,price,stock,category) VALUES
('机械键盘',399.00,50,'外设'),
('无线鼠标',99.50,200,'外设'),
('显示器',1299.00,20,'数码');
INSERT INTO orders(user_id,product_id,quantity,amount,status) VALUES
(1,1,1,399.00,1),
(1,2,2,199.00,1),
(2,3,1,1299.00,0);
插完查一遍验证:
text
-- users
id username email age balance status created_at
1 alice alice@test.com 25 1000.00 1 2026-09-24 07:32:36
2 bob bob@test.com 30 500.50 1 2026-09-24 07:32:36
3 carol carol@test.com 28 2000.00 1 2026-09-24 07:32:36
-- products
id name price stock category created_at
1 机械键盘 399.00 50 外设 2026-09-24 07:32:36
2 无线鼠标 99.50 200 外设 2026-09-24 07:32:36
3 显示器 1299.00 20 数码 2026-09-24 07:32:36
-- orders
id user_id product_id quantity amount status created_at
1 1 1 1 399.00 1 2026-09-24 07:32:36
2 1 2 2 199.00 1 2026-09-24 07:32:36
3 2 3 1 1299.00 0 2026-09-24 07:32:36
✅ 成功标志 :三张表都 SELECT * 出来了,字段类型、默认值、自增 id 都符合预期。这套数据就是后面三篇的练习底表。
建表时有几个刻意的设计,先记着,后面会反复讲为什么:
- 主键一律
BIGINT AUTO_INCREMENT,不用 INT(怕溢出),更不用 UUID。 - 金额
balance/price/amount全是DECIMAL,不用 FLOAT。 - 状态用
TINYINT+ COMMENT 注释,不用 ENUM。 - 时间用
DATETIME+DEFAULT CURRENT_TIMESTAMP,自动填当前时间。 - 订单表的
user_id/product_id只加普通索引,不建外键约束(大厂惯例)。
总结:你真正需要记住的 8 件事
- 用 Docker 起 MySQL :
docker run -d --name mysql8 -e MYSQL_ROOT_PASSWORD=root123 -p 3306:3306 mysql:8.0,等日志 ready 再连。 - 连接 :
docker exec -it mysql8 mysql -uroot -proot123,或本机mysql -h127.0.0.1 -P3306 -uroot -p;\G纵显、\q退出。 - 字符集一律 utf8mb4 :utf8 是 utf8mb3 存不了 emoji,存 emoji 报 1366;连接记得
--default-character-set=utf8mb4。 - 金额用 DECIMAL,FLOAT 会有精度误差(0.1+0.2≠0.2);状态用 TINYINT;时间用 DATETIME。
INT(11)的 11 不是长度是显示宽度,范围靠类型和 UNSIGNED 决定,ZEROFILL 已废弃。- 约束:主键唯一非空全表一个;自增不连续会留洞;UNIQUE 允许多个 NULL;CHECK 要 8.0.16+ 才生效;外键生产常禁用。
- TRUNCATE 是 DDL 不可回滚、自增重置为 1;DELETE 是 DML 可回滚、自增不重置。
- 看表结构用
SHOW CREATE TABLE 表\G(最全)和DESC 表(最快)。
验证清单
- 能一条
docker run起 MySQL 8 容器,并等到ready for connections - 能用命令行和图形客户端各连上一次
- 能说出 utf8mb4 和 utf8mb3 的区别,并复现一次 emoji 报 1366
- 建表时金额用 DECIMAL、状态用 TINYINT、时间用 DATETIME
- 能分别复现 NOT NULL(1048)、UNIQUE(1062)、CHECK(3819) 三种报错
- 能解释 DELETE 和 TRUNCATE 在自增值上的区别
- 在本机建好 shop 库和 users/products/orders 三张表并插入示例数据
- 会用
SHOW CREATE TABLE和DESC查看表结构
参考资源
- MySQL 8.0 官方文档:dev.mysql.com/doc/refman/...
- 数据类型官方手册:dev.mysql.com/doc/refman/...
- 字符集与排序规则:dev.mysql.com/doc/refman/...
- 约束与外键:dev.mysql.com/doc/refman/...
- Docker 官方 mysql 镜像:hub.docker.com/_/mysql
下一篇《【上手】SQL 增删改查》讲:INSERT 批量插入、UPDATE/DELETE 不加 WHERE 的高危后果、SELECT 的列筛选与别名、WHERE 里 AND/OR/IN/LIKE/IS NULL 的真实坑、ORDER BY 与 LIMIT 分页,并在 shop 库上写 20 个可运行的查询练习。