语法格式:
INSERT INTO 表名 (列名1, 列名2, ...)
VALUES (值1, 值2, ...);
示例:
-- 创建学生表
CREATE TABLE students (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age TINYINT UNSIGNED,
gender ENUM('男', '女') DEFAULT '男',
email VARCHAR(100)
);
-- 插入单条数据
INSERT INTO students (name, age, gender, email)
VALUES ('张三', 20, '男', 'zhangsan@example.com');
语法格式:
INSERT INTO 表名
VALUES (值1, 值2, ...);
示例:
-- 必须按列顺序提供所有值
INSERT INTO students
VALUES (NULL, '李四', 22, '女', 'lisi@example.com');
⚠️ 注意:不推荐省略列名,表结构变化时容易出错。
语法格式:
INSERT INTO 表名 (列名1, 列名2, ...)
VALUES
(值1, 值2, ...),
(值1, 值2, ...),
(值1, 值2, ...);
示例:
INSERT INTO students (name, age, gender, email)
VALUES
('王五', 21, '男', 'wangwu@example.com'),
('赵六', 19, '女', 'zhaoliu@example.com'),
('孙七', 23, '男', 'sunqi@example.com');
单条插入:
INSERT INTO students (name, age) VALUES ('学生1', 20);
INSERT INTO students (name, age) VALUES ('学生2', 21);
INSERT INTO students (name, age) VALUES ('学生3', 22);
批量插入:
INSERT INTO students (name, age)
VALUES
('学生1', 20),
('学生2', 21),
('学生3', 22);
性能对比:
语法格式:
INSERT INTO 表名
SET 列名1 = 值1, 列名2 = 值2, ...;
示例:
INSERT INTO students
SET name = '周八', age = 20, gender = '男';
优点:
语法格式:
INSERT INTO 目标表 (列名1, 列名2, ...)
SELECT 列名1, 列名2, ...
FROM 源表
[WHERE 条件];
示例:
-- 创建备份表
CREATE TABLE students_backup (
id INT PRIMARY KEY,
name VARCHAR(50),
age TINYINT UNSIGNED,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 复制数据
INSERT INTO students_backup (id, name, age)
SELECT id, name, age FROM students;
-- 只复制年龄大于20的学生
INSERT INTO students_backup (id, name, age)
SELECT id, name, age
FROM students
WHERE age > 20;
语法格式:
INSERT IGNORE INTO 表名 (列名1, 列名2, ...)
VALUES (值1, 值2, ...);
示例:
-- 创建有唯一约束的表
CREATE TABLE unique_test (
id INT PRIMARY KEY,
email VARCHAR(100) UNIQUE
);
-- 插入数据
INSERT INTO unique_test VALUES (1, 'test@example.com');
-- 重复插入会报错
INSERT INTO unique_test VALUES (2, 'test@example.com');
-- ERROR 1062 (23000): Duplicate entry 'test@example.com' for key 'email'
-- 使用IGNORE忽略错误
INSERT IGNORE INTO unique_test VALUES (2, 'test@example.com');
-- Query OK, 0 rows affected
语法格式:
REPLACE INTO 表名 (列名1, 列名2, ...)
VALUES (值1, 值2, ...);
特点:
示例:
-- 插入数据
INSERT INTO unique_test VALUES (1, 'test1@example.com');
-- 使用REPLACE替换
REPLACE INTO unique_test VALUES (1, 'test2@example.com');
-- 查看结果
SELECT * FROM unique_test;
输出:
+----+--------------------+
| id | email |
+----+--------------------+
| 1 | test2@example.com |
+----+--------------------+
语法格式:
INSERT INTO 表名 (列名1, 列名2, ...)
VALUES (值1, 值2, ...)
ON DUPLICATE KEY UPDATE 列名1 = 新值1, 列名2 = 新值2, ...;
示例:
-- 创建表
CREATE TABLE counter (
id INT PRIMARY KEY,
count INT DEFAULT 0
);
-- 插入或更新
INSERT INTO counter (id, count)
VALUES (1, 1)
ON DUPLICATE KEY UPDATE count = count + 1;
-- 第一次执行:插入 (1, 1)
-- 第二次执行:更新为 (1, 2)
-- 第三次执行:更新为 (1, 3)
语法格式:
UPDATE 表名
SET 列名1 = 值1, 列名2 = 值2, ...
[WHERE 条件];
示例:
-- 更新单个字段
UPDATE students
SET age = 21
WHERE name = '张三';
-- 更新多个字段
UPDATE students
SET age = 22, email = 'newemail@example.com'
WHERE name = '李四';
⚠️ 危险操作:
-- 更新所有记录
UPDATE students SET age = 20;
建议:
单条件更新:
UPDATE students
SET gender = '女'
WHERE name = '王五';
多条件更新:
UPDATE students
SET age = age + 1
WHERE age < 20 AND gender = '男';
-- 年龄加1
UPDATE students SET age = age + 1 WHERE id = 1;
-- 字符串拼接
UPDATE students
SET email = CONCAT(name, '@example.com')
WHERE email IS NULL;
语法格式:
UPDATE 表1
JOIN 表2 ON 表1.列 = 表2.列
SET 表1.列 = 值
[WHERE 条件];
示例:
-- 创建订单表和客户表
CREATE TABLE customers (
id INT PRIMARY KEY,
name VARCHAR(50),
level VARCHAR(20)
);
CREATE TABLE orders (
id INT PRIMARY KEY,
customer_id INT,
amount DECIMAL(10, 2),
discount DECIMAL(5, 2)
);
-- 根据客户等级更新订单折扣
UPDATE orders o
JOIN customers c ON o.customer_id = c.id
SET o.discount = 0.1
WHERE c.level = 'VIP';
语法格式:
UPDATE 表名
SET 列名 = 值
[WHERE 条件]
ORDER BY 排序列
LIMIT 数量;
示例:
-- 更新年龄最大的3个学生
UPDATE students
SET gender = '男'
ORDER BY age DESC
LIMIT 3;
语法格式:
DELETE FROM 表名
[WHERE 条件];
示例:
-- 删除单条记录
DELETE FROM students WHERE id = 1;
-- 删除多条记录
DELETE FROM students WHERE age < 18;
⚠️ 危险操作:
-- 删除所有记录
DELETE FROM students;
建议:
单条件删除:
DELETE FROM students WHERE name = '张三';
多条件删除:
DELETE FROM students
WHERE age < 18 OR email IS NULL;
-- 删除没有订单的客户
DELETE FROM customers
WHERE id NOT IN (
SELECT DISTINCT customer_id FROM orders
);
语法格式:
DELETE 表1, 表2
FROM 表1
JOIN 表2 ON 表1.列 = 表2.列
WHERE 条件;
示例:
-- 删除订单及相关客户
DELETE o, c
FROM orders o
JOIN customers c ON o.customer_id = c.id
WHERE c.level = 'inactive';
语法格式:
DELETE FROM 表名
[WHERE 条件]
ORDER BY 排序列
LIMIT 数量;
示例:
-- 删除年龄最小的3个学生
DELETE FROM students
ORDER BY age ASC
LIMIT 3;
语法格式:
TRUNCATE TABLE 表名;
示例:
TRUNCATE TABLE students;
| 特性 | TRUNCATE | DELETE |
|---|---|---|
| 速度 | 快 | 慢 |
| 回滚 | 不支持 | 支持 |
| WHERE | 不支持 | 支持 |
| 自增值 | 重置 | 不重置 |
| 触发器 | 不触发 | 触发 |
| 外键 | 不能删除 | 可以删除 |
性能对比:
-- TRUNCATE:快速清空
TRUNCATE TABLE students;
-- DELETE:逐行删除
DELETE FROM students;
语法格式:
CREATE TABLE 新表 AS
SELECT * FROM 源表;
示例:
-- 复制表结构和数据
CREATE TABLE students_copy AS
SELECT * FROM students;
-- 复制部分数据
CREATE TABLE students_2024 AS
SELECT * FROM students
WHERE YEAR(create_time) = 2024;
语法格式:
CREATE TABLE 新表 LIKE 源表;
示例:
CREATE TABLE students_template LIKE students;
语法格式:
INSERT INTO 目标数据库.表名
SELECT * FROM 源数据库.表名;
示例:
-- 从school数据库复制到backup数据库
INSERT INTO backup.students
SELECT * FROM school.students;
使用SELECT INTO OUTFILE:
SELECT * FROM students
INTO OUTFILE '/tmp/students.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';
使用LOAD DATA INFILE:
LOAD DATA INFILE '/tmp/students.csv'
INTO TABLE students
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';
| 特性 | 说明 |
|---|---|
| 原子性(Atomicity) | 事务要么全部执行,要么全部不执行 |
| 一致性(Consistency) | 事务前后数据保持一致 |
| 隔离性(Isolation) | 并发事务互不干扰 |
| 持久性(Durability) | 事务提交后永久保存 |
开始事务:
START TRANSACTION;
-- 或
BEGIN;
提交事务:
COMMIT;
回滚事务:
ROLLBACK;
-- 创建账户表
CREATE TABLE accounts (
id INT PRIMARY KEY,
name VARCHAR(50),
balance DECIMAL(10, 2)
);
-- 插入数据
INSERT INTO accounts VALUES
(1, '张三', 1000.00),
(2, '李四', 1000.00);
-- 开始事务
START TRANSACTION;
-- 张三转账100给李四
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
-- 检查余额
SELECT * FROM accounts;
-- 提交事务
COMMIT;
-- 开始事务
START TRANSACTION;
-- 更新数据
UPDATE students SET age = 100 WHERE id = 1;
-- 发现错误,回滚
ROLLBACK;
设置保存点:
SAVEPOINT 保存点名;
回滚到保存点:
ROLLBACK TO SAVEPOINT 保存点名;
示例:
START TRANSACTION;
INSERT INTO students (name, age) VALUES ('测试1', 20);
SAVEPOINT sp1;
INSERT INTO students (name, age) VALUES ('测试2', 21);
SAVEPOINT sp2;
INSERT INTO students (name, age) VALUES ('测试3', 22);
-- 回滚到sp2
ROLLBACK TO SAVEPOINT sp2;
-- 提交事务
COMMIT;
-- 最终只插入了测试1和测试2
更新前确认:
-- 先查询要更新的数据
SELECT * FROM students WHERE age < 18;
-- 确认无误后再更新
UPDATE students SET status = 'minor' WHERE age < 18;
删除前确认:
-- 先查询要删除的数据
SELECT * FROM students WHERE age < 18;
-- 确认无误后再删除
DELETE FROM students WHERE age < 18;
-- 开始事务
START TRANSACTION;
-- 执行操作
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
-- 检查结果
SELECT * FROM accounts;
-- 确认无误后提交
COMMIT;
-- 或发现错误回滚
-- ROLLBACK;
-- 创建备份表
CREATE TABLE students_backup AS SELECT * FROM students;
-- 执行危险操作
DELETE FROM students WHERE age < 18;
-- 如果需要恢复
INSERT INTO students SELECT * FROM students_backup;
✅ INSERT插入数据,支持批量插入 ✅ UPDATE更新数据,必须使用WHERE ✅ DELETE删除数据,TRUNCATE快速清空 ✅ 事务保证数据一致性 ✅ 操作前备份和确认
完成本章学习后,请确认您能够: