DML(Data Manipulation Language,数据操作语言)
目录
插入数据(INSERT)
插入多条数据
使用 INSERT IGNORE 忽略重复记录
使用子查询插入数据
使用 REPLACE 替换现有记录
使用 INSERT ... ON DUPLICATE KEY UPDATE 处理冲突
UPDATE 语句语法
更新单个示例
更新多条记录示例
使用子查询更新
DELETE 语句语法
要删除单条记录
删除多条记录
删除所有记录
DML(Data Manipulation Language,数据操作语言)用于在数据库中执行数据操作,包括数据的插入、更新和删除。以下是常见的 DML 语句及其总结:
插入数据(INSERT
)
插入多条数据
语法格式
INSERT INTO 表名 (列名1, 列名2, 列名3, ...)
VALUES
(值1, 值2, 值3, ...),
(值1, 值2, 值3, ...),
(值1, 值2, 值3, ...);
- 表名:要插入数据的目标表的名称。
- 列名1, 列名2, 列名3, ...:要插入数据的列名,可以插入多个列。
- 值1, 值2, 值3, ...:对应列名的值,每列的值按顺序提供,插入多条记录时用逗号分隔。
示例:
-- 向 `employees` 表中插入多条记录
INSERT INTO employees (id, name, department_id, salary)
VALUES
(2, 'Jane Smith', 102, 55000),
(3, 'Emily Johnson', 103, 60000),
(4, 'Michael Brown', 101, 52000);
使用 INSERT IGNORE
忽略重复记录
语法
INSERT IGNORE INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);
示例
-- 向 `employees` 表中插入记录,如果主键冲突则忽略
INSERT IGNORE INTO employees (id, name, department_id, salary)
VALUES (1, 'John Doe', 101, 50000);
使用子查询插入数据
使用子查询插入数据可以从一个表中选择数据并将其插入到另一个表中。这种方法非常适合在需要将数据从一个表迁移或复制到另一个表时使用。以下是语法和示例的解释:
INSERT INTO 目标表名 (列名1, 列名2, ...)
SELECT 列名1, 列名2, ...
FROM 源表名
WHERE 条件;
/*
目标表名:要插入数据的目标表的名称。
列名1, 列名2, ...:目标表中的列名,需要插入数据的列。
源表名:提供数据的源表的名称。
列名1, 列名2, ...:源表中的列名,对应于目标表中的列。
条件:筛选源表数据的条件,可选。
*/
示例:
INSERT INTO employees (id, name, department_id, salary)
SELECT id, name, department_id, salary
FROM temp_employees
WHERE hire_date > '2024-01-01';
使用 REPLACE
替换现有记录
REPLACE
语句用于在 MySQL 中插入新记录,如果目标表中已经存在具有相同主键或唯一键的记录,则先删除原记录,然后插入新记录。这对于处理冲突数据或更新现有记录非常有用。
语法 :
REPLACE INTO 表名 (列名1, 列名2, 列名3, ...)
VALUES (值1, 值2, 值3, ...);
/*
表名:要插入或替换数据的表的名称。
列名1, 列名2, 列名3, ...:要插入数据的列名。
值1, 值2, 值3, ...:对应列的值。
*/
REPLACE
语句会先删除原记录,然后插入新记录。这意味着原记录的主键或唯一键的约束将会被重新应用。REPLACE
语句不会影响记录的其他列,如果有其他列有值而不是在VALUES
中提供的,它们会被删除。
示例:
REPLACE INTO employees (id, name, department_id, salary)
VALUES (1, 'John Doe', 101, 52000);
使用 INSERT ... ON DUPLICATE KEY UPDATE
处理冲突
INSERT ... ON DUPLICATE KEY UPDATE
语句用于在 MySQL 中插入数据时处理冲突。如果插入的数据导致主键或唯一键冲突,这条语句会执行更新操作,而不是插入新记录。它是一种有效的方法来确保在数据冲突时能够更新现有记录。
语法:
INSERT INTO 表名 (列名1, 列名2, ...)
VALUES (值1, 值2, ...)
ON DUPLICATE KEY UPDATE 列名1 = 新值1, 列名2 = 新值2, ...;
/*
表名:要插入或更新数据的表的名称。
列名1, 列名2, ...:插入数据的列名。
值1, 值2, ...:插入数据的值。
ON DUPLICATE KEY UPDATE:指定当插入操作发生主键或唯一键冲突时要执行的更新操作。
列名1 = 新值1, 列名2 = 新值2, ...:指定冲突时需要更新的列及其新值。
*/
示例:
INSERT INTO products (id, name, price, quantity)
VALUES (1, 'Widget A', 25.00, 150)
ON DUPLICATE KEY UPDATE price = VALUES(price), quantity = VALUES(quantity);
- 插入新记录:如果没有主键或唯一键冲突,
INSERT ... ON DUPLICATE KEY UPDATE
会像普通INSERT
一样插入新记录。 - 更新现有记录:如果插入操作导致主键或唯一键冲突,会执行
ON DUPLICATE KEY UPDATE
子句中的更新操作。 - VALUES() 函数:
VALUES(column_name)
用于引用插入值中的值,确保更新时使用的是冲突的插入值。
UPDATE
语句语法
UPDATE 表名
SET 列名1 = 新值1, 列名2 = 新值2, ...
[WHERE 条件];
/*
表名:要更新数据的表的名称。
列名1, 列名2, ...:要更新的列名。
新值1, 新值2, ...:要设置的新值。
WHERE 条件(可选):指定更新的条件。如果不使用 WHERE 子句,将会更新表中的所有记录。
*/
更新单个示例
-- 更新 id 为 1 的员工的薪资
UPDATE employees
SET salary = 52000
WHERE id = 1;
更新多条记录示例
-- 将所有部门编号为 101 的员工薪资增加 5000
UPDATE employees
SET salary = salary + 5000
WHERE department_id = 101;
使用子查询更新
-- 假设有两个表:employees 和 departments,我们要根据 departments 表中的数据更新 employees 表的薪资。
UPDATE employees
SET salary = (
SELECT AVG(salary)
FROM employees
WHERE department_id = employees.department_id
)
WHERE department_id IN (
SELECT id
FROM departments
WHERE department_name = 'Sales'
);
/*
目标:更新 employees 表中 department_id 为 'Sales' 部门的员工的 salary。
更新内容:将这些员工的薪资设置为其所在部门中所有员工薪资的平均值。
条件:只更新 department_id 为 'Sales' 部门的员工。
*/
DELETE
语句语法
DELETE FROM 表名
[WHERE 条件];
/*
表名:要删除数据的表的名称。
WHERE 条件(可选):指定删除的条件。如果省略 WHERE 子句,则会删除表中的所有记录。
*/
要删除单条记录
DELETE FROM employees WHERE id = 1;
删除多条记录
假设我们要删除所有 department_id
为 101
的员工记录。
DELETE FROM employees WHERE department_id = 101;
删除所有记录
如果我们要删除 employees
表中的所有记录,但保留表结构,可以省略 WHERE
子句:
DELETE FROM employees;