Appearance
2026-08-29 · MySQL 学习笔记 03
MySQL 增删改查
用便利店场景,一张商品表:
sql
CREATE TABLE goods (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '主键',
name VARCHAR(50) NOT NULL COMMENT '商品名',
price DECIMAL(10,2) NOT NULL COMMENT '单价',
stock INT NOT NULL DEFAULT 0 COMMENT '库存',
category VARCHAR(20) COMMENT '分类',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
) COMMENT '商品表';1. 插入 INSERT
sql
-- 单条
INSERT INTO goods (name, price, stock, category) VALUES ('可乐', 3.50, 100, '饮料');
-- 多条(括号逗号连着写)
INSERT INTO goods (name, price, stock, category) VALUES
('矿泉水', 2.00, 200, '饮料'),
('薯片', 6.50, 50, '零食'),
('面包', 5.00, 80, '食品');id和create_time不用写,自增 + 自动填时间;- 列的顺序和值的顺序要一一对应。
2. 查询 SELECT
sql
-- 全查
SELECT * FROM goods;
-- 只查需要的列(工作里推荐)
SELECT name, price FROM goods;
-- 别名:给列起个临时名,结果表头显示
SELECT name AS 商品名, price AS 单价 FROM goods;SELECT * 学习时随便用,项目代码里尽量写列名——表加列时 * 会把不想要的数据也查出来。
3. 条件过滤 WHERE
sql
-- 精确
SELECT * FROM goods WHERE name = '可乐';
SELECT * FROM goods WHERE category = '饮料';
-- 不等、比较
SELECT * FROM goods WHERE price > 5;
SELECT * FROM goods WHERE price <= 5;
-- 多个条件:AND(同时满足)OR(满足其一)
SELECT * FROM goods WHERE category = '饮料' AND price < 3;
SELECT * FROM goods WHERE category = '饮料' OR category = '零食';
-- 区间:BETWEEN ... AND
SELECT * FROM goods WHERE price BETWEEN 2 AND 6;
-- 在集合里:IN
SELECT * FROM goods WHERE category IN ('饮料', '零食');
-- 模糊:LIKE,% 代表任意长度字符
SELECT * FROM goods WHERE name LIKE '%水%'; -- 名字里带"水"
SELECT * FROM goods WHERE name LIKE '可乐%'; -- 以"可乐"开头
-- 空值判断:IS NULL / IS NOT NULL(不能用 = null!)
SELECT * FROM goods WHERE category IS NULL;4. 修改 UPDATE
sql
UPDATE goods SET price = 3.00 WHERE name = '可乐';
UPDATE goods SET price = 3.00, stock = 90 WHERE name = '可乐'; -- 改多列UPDATE 必须带 WHERE。 不带 WHERE 就是全表更新:
sql
UPDATE goods SET price = 3.00; -- 所有商品变 3 块5. 删除 DELETE
sql
DELETE FROM goods WHERE name = '酸奶';DELETE 必须带 WHERE。
sql
DELETE FROM goods; -- 表清空删光又要保留表结构(清空计数器也归零)用 TRUNCATE TABLE goods;,但同样慎用。
6. 改完怎么确认
改完顺手查一眼:
sql
SELECT * FROM goods WHERE name = '可乐';7. 三个高频坑
| 坑 | 后果 | 解法 |
|---|---|---|
| UPDATE / DELETE 忘写 WHERE | 全表数据被改/被删 | 写完 SELECT 复制改的习惯,先 SELECT * FROM ... WHERE ... 看命中哪些行 |
| 中文乱码 | 存进去是乱码 | 建库用 utf8mb4;命令行连库加 --default-character-set=utf8mb4 |
| 值类型写错 | 存的脏数据 | 字符串必须加引号,数字不加,日期用 '2026-08-29' 格式 |