MySQL【基本查询上 – 表的增删改查】

【MySQL 笔记】基本查询(上)—— 表的增删改查(CRUD)详解

这是 MySQL 最基础、最常用的四大操作:增(Insert)、删(Delete)、改(Update)、查(Select),也叫 CRUD。

几乎所有业务代码最终都会落到这四个语句上。

一、四大操作对比速查表

操作英文SQL 关键字是否返回受影响行数是否可回滚(事务内)最常用场景注意事项
CreateINSERT INTO是(ROW_COUNT())新增用户、订单、日志字段顺序/自增/默认值
DeleteDELETE FROM软删除、清理过期数据WHERE 务必写!
UpdateUPDATE … SET修改用户信息、订单状态WHERE + LIMIT 防误操作
ReadSELECT … FROM是(返回结果集)否(读不加锁时)几乎所有查询字段、条件、排序、分页

二、完整语法模板(建议收藏)

1. 增(INSERT)

-- 1. 标准单行插入(推荐写列名)
INSERT INTO 表名 (列1, 列2, 列3, ...)
VALUES (值1, 值2, 值3, ...);

-- 2. 多行插入(性能更好)
INSERT INTO users (username, password, created_at)
VALUES 
    ('zhangsan', '123456', NOW()),
    ('lisi',    'abcdef', NOW()),
    ('wangwu',  'qwe123', NOW());

-- 3. 从另一张表插入(INSERT ... SELECT)
INSERT INTO users_archive (id, username, archived_at)
SELECT id, username, NOW()
FROM users
WHERE status = 'deleted';

-- 4. 插入或更新(MySQL 特有)
INSERT INTO users (id, username, last_login)
VALUES (1001, 'admin', NOW())
ON DUPLICATE KEY UPDATE 
    username = VALUES(username),
    last_login = NOW();

2. 删(DELETE)

-- 危险操作!永远带 WHERE
DELETE FROM users 
WHERE id = 1001;

-- 删除多条
DELETE FROM orders 
WHERE status = 'cancelled' 
  AND created_at < DATE_SUB(NOW(), INTERVAL 30 DAY);

-- 限制删除行数(防手滑)
DELETE FROM temp_logs 
WHERE create_time < '2025-01-01' 
LIMIT 1000;

-- 清空表(比 DELETE 快得多,但不能回滚)
TRUNCATE TABLE temp_table;

3. 改(UPDATE)

-- 基础更新
UPDATE users 
SET nickname = '张三丰', 
    updated_at = NOW()
WHERE id = 1001;

-- 批量更新 + 条件表达式
UPDATE products 
SET stock = stock - 1,
    updated_at = NOW()
WHERE id IN (5001, 5002, 5003) 
  AND stock > 0;

-- 带 JOIN 的更新(非常实用)
UPDATE orders o
INNER JOIN users u ON o.user_id = u.id
SET o.status = 'completed',
    o.updated_at = NOW()
WHERE u.status = 'active' 
  AND o.created_at >= '2026-01-01';

-- 防误操作:加 LIMIT
UPDATE users 
SET is_vip = 1 
WHERE register_date >= '2026-01-01' 
LIMIT 100;

4. 查(SELECT)—— 基础篇

-- 1. 全表查询(开发环境可用,生产慎用)
SELECT * FROM users;

-- 2. 指定字段(推荐)
SELECT id, username, nickname, created_at 
FROM users;

-- 3. 别名(AS 可省略)
SELECT username AS 用户名, 
       nickname AS 昵称, 
       created_at AS 注册时间
FROM users;

-- 4. 去重
SELECT DISTINCT city 
FROM users;

-- 5. 基本条件
SELECT * 
FROM orders 
WHERE status = 'pending' 
  AND amount > 100 
  AND created_at >= '2026-03-01';

-- 6. 排序 + 分页(最常用组合)
SELECT id, order_no, amount, created_at
FROM orders
WHERE user_id = 1001
ORDER BY created_at DESC
LIMIT 10 OFFSET 20;   -- 第3页,每页10条

三、高频组合写法(面试/实战必会)

-- 1. 新增用户并获取自增ID
INSERT INTO users (username, password) VALUES ('admin', '123456');
SELECT LAST_INSERT_ID();   -- 或在代码中用返回结果获取

-- 2. 软删除(推荐生产环境做法)
UPDATE users 
SET is_deleted = 1, 
    deleted_at = NOW()
WHERE id = 1001;

-- 3. 批量插入且忽略重复(INSERT IGNORE)
INSERT IGNORE INTO tags (name) 
VALUES ('科技'), ('财经'), ('科技');   -- 第二条科技被忽略

-- 4. 更新 + 条件计数
UPDATE users 
SET login_count = login_count + 1,
    last_login_ip = '192.168.1.1',
    last_login_time = NOW()
WHERE username = 'zhangsan';

-- 5. 查询今天注册的用户
SELECT * 
FROM users 
WHERE DATE(created_at) = CURDATE();

四、写 SQL 的安全 & 性能小贴士(2026 年视角)

  1. 永远不要在生产环境写 DELETE FROM table / UPDATE table SET ... 而不带 WHERE
  2. SELECT 确认影响范围,再改成 UPDATE / DELETE
  3. 大批量操作建议:
  • 分批 LIMIT + 循环执行
  • 或使用 INSERT ... ON DUPLICATE KEY UPDATE
  1. 字段顺序与表结构一致时可省略列名,但不推荐(可读性差)
  2. TRUNCATEDELETE FROM 快 10~100 倍,但:
  • 不能 WHERE
  • 清空自增计数
  • 不能回滚(非事务安全)

下一期预告:基本查询(下)—— WHERE 条件全家桶 + 模糊查询 + 排序分页 + 聚合函数

有哪个增删改查的写法你觉得最容易出错,或者项目里最常用的模式,欢迎留言讨论~
祝大家 CRUD 写得又稳又快!🛠️

文章已创建 5186

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部