【计算基础|MySQL01】【上手】安装连接、数据类型与建库建表

【计算基础|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.

⚠️ 三个高频认知纠正:

  1. 自增不保证连续。删掉 id=2 再插新行,新行拿到的是 id=4,不是 3:
text 复制代码
id  name
1   张三
4   孙七

回滚、删除、插入失败都会在自增序列上"留洞"。别拿自增值当业务序号用。

  1. UNIQUE 列可以有多个 NULL(NULL 不等于任何值,多个 NULL 不算重复)。

  2. 外键在互联网大厂常被禁用 。原因:外键检查拖性能、分库分表后跨库没法建外键、表之间耦合太重。一般靠应用层保证一致性 ,表里留个 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 件事

  1. 用 Docker 起 MySQL :docker run -d --name mysql8 -e MYSQL_ROOT_PASSWORD=root123 -p 3306:3306 mysql:8.0,等日志 ready 再连。
  2. 连接 :docker exec -it mysql8 mysql -uroot -proot123,或本机 mysql -h127.0.0.1 -P3306 -uroot -p;\G 纵显、\q 退出。
  3. 字符集一律 utf8mb4 :utf8 是 utf8mb3 存不了 emoji,存 emoji 报 1366;连接记得 --default-character-set=utf8mb4。
  4. 金额用 DECIMAL,FLOAT 会有精度误差(0.1+0.2≠0.2);状态用 TINYINT;时间用 DATETIME。
  5. INT(11) 的 11 不是长度是显示宽度,范围靠类型和 UNSIGNED 决定,ZEROFILL 已废弃。
  6. 约束:主键唯一非空全表一个;自增不连续会留洞;UNIQUE 允许多个 NULL;CHECK 要 8.0.16+ 才生效;外键生产常禁用。
  7. TRUNCATE 是 DDL 不可回滚、自增重置为 1;DELETE 是 DML 可回滚、自增不重置。
  8. 看表结构用 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 查看表结构

参考资源


下一篇《【上手】SQL 增删改查》讲:INSERT 批量插入、UPDATE/DELETE 不加 WHERE 的高危后果、SELECT 的列筛选与别名、WHERE 里 AND/OR/IN/LIKE/IS NULL 的真实坑、ORDER BY 与 LIMIT 分页,并在 shop 库上写 20 个可运行的查询练习。

相关推荐
花间相见1 小时前
【计算基础|MySQL02】【上手】SQL 增删改查
数据库·后端
ITxiaobing20231 小时前
IP 库与 AppsFlyer 国家/地区数据不一致,如何系统地对账?
数据库·网络协议·tcp/ip
姜鱼问生1 小时前
密码明明一样,为什么 GPG 说“错的“?
后端·算法·架构
.Bryce.2 小时前
在智能体中使用A2A工具:让大模型自己决定“该找谁帮忙“
android·java·服务器·redis·后端·agent·a2a
xiaoqiMikko2 小时前
fastjson 1.2.84 的补丁关掉了一个缓存:addAccept 包前缀白名单下,反序列化慢了 13~28 倍
java·后端·性能优化
崎岖Qiu2 小时前
MCP 的架构、协议分层与通信过程
后端·ai·架构·agent·mcp
这个DBA有点耶2 小时前
从时间到语义:时序数据库与向量数据库的核心机制、选型与多模融合趋势
数据库·mysql·架构
Henry-SAP2 小时前
SAP PP主数据关联业务视角全解析
后端
对空六课2 小时前
RFM分层边界变化的回溯计算
大数据·服务器·前端·数据库·人工智能·算法·数据分析