当前位置: 首页 > article >正文

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_id101 的员工记录。

DELETE FROM employees WHERE department_id = 101;

删除所有记录

如果我们要删除 employees 表中的所有记录,但保留表结构,可以省略 WHERE 子句:

DELETE FROM employees;

http://www.kler.cn/a/300880.html

相关文章:

  • Golang Gin系列-3:Gin Framework的项目结构
  • 【Idea启动项目报错NegativeArraySizeException】
  • 虚拟拨号技术(GOIP|VOIP)【基于IP的语音传输转换给不法分子的境外来电披上一层外衣】: Voice over Internet Protocol
  • 《探索烟雾目标检测开源项目:技术与应用的深度剖析》
  • 读取长文本,使用读取底表
  • 人工智能-机器学习之多分类分析(项目实战二-鸢尾花的多分类分析)
  • Kubernetes上安装Metallb和Ingress并部署应用程序
  • 本地安装Ollama+WebUI
  • 大模型实战教程:使用Langchain与ChatGLM实现本地知识库
  • Linux驱动.之驱动开发思维,设备,驱动,总线分析思想,驱动的分类(字符设备,块设备,网络设备)
  • 多线程和高并发-17题
  • 使用 Homebrew 在 macOS 上安装 Conda
  • flume系列之:记录一次flume agent进程被异常oom kill -9的原因定位
  • 达林顿管阵列ULN2803(8路反向器电路)
  • C++学习笔记(18)
  • java八股!5(线程创建+并发容器+线程锁)
  • react18基础教程系列--packagejson文件分析
  • “人人都是产品经理”到AI产品经理,赶上风口的人都赚到了钱
  • 「iOS学习」——Masonry学习
  • 区块链学习笔记3--以太坊
  • C#在Winform中截图指定控件中的内容生成图像
  • QGis二次开发 —— 3、程序加载栅格tif与矢量shp文件可进行切换控制,可进行导出/导入工程(附源码)
  • 基于SpringBoot+Vue的小区停车场管理系统
  • 机器学习--支持向量机(SVM)
  • 数据分析-螺旋环状气泡图
  • 聊一下测试计划