MySQL修炼手册7:数据修改基础:INSERT、UPDATE、DELETE语句详解

写在开头

在掌握了MySQL数据库的基础之后,学习如何对数据进行有效的修改是至关重要的。本篇博客旨在提供一个深入的指南,涵盖了数据修改的三大基础操作:插入(INSERT)、更新(UPDATE)、删除(DELETE)。为了更好地理解这些概念,我们首先创建一个示例表“水果表”,然后逐一解析每个操作的具体用法。

首先,让我们创建一个简单的“水果表”来演示这些操作:

CREATE TABLE fruits (id INT AUTO_INCREMENT,name VARCHAR(50),quantity INT,PRIMARY KEY (id)
);

这个表有三个字段:id(一个自增的主键),name(水果的名称),以及quantity(水果的数量)。

1 插入数据:INSERT语句

插入数据是数据库操作的基础,了解INSERT语句的多种用法对于高效地管理MySQL数据库至关重要。

1.1 基本插入

最基本的INSERT语句用于向表中添加单行数据。其语法如下:

INSERT INTO table_name (column1, column2, column3) VALUES (value1, value2, value3);

例如,向水果表插入一行数据:

INSERT INTO fruits (name, quantity) VALUES ('Apple', 10);

1.2 插入多行数据

你可以一次性插入多行数据,这对于批量数据处理非常有用。语法如下:

INSERT INTO table_name (column1, column2) VALUES (value1, value2), (value3, value4), ...;

例如,一次插入多种水果:

INSERT INTO fruits (name, quantity) VALUES ('Banana', 20), ('Orange', 30), ('Grapes', 15);

1.3 插入部分列

如果表中的其他列有默认值或允许为空,你可以只插入部分列的数据。例如:

INSERT INTO table_name (column1) VALUES (value1);

在水果表中,如果quantity有默认值,可以只插入name

INSERT INTO fruits (name) VALUES ('Pineapple');

1.4 使用NULL值

在允许NULL值的列中,你可以显式地插入NULL。例如:

INSERT INTO table_name (column1, column2) VALUES (NULL, value2);

如果quantity列允许NULL值:

INSERT INTO fruits (name, quantity) VALUES ('Mango', NULL);

1.5 从其他表中插入

你也可以使用一个SELECT语句从另一个表中插入数据:

INSERT INTO table_name1 (column1, column2) SELECT column1, column2 FROM table_name2;

例如,从一个临时水果表插入数据到主水果表:

INSERT INTO fruits (name, quantity) SELECT name, quantity FROM temp_fruits;

1.6 插入数据并返回ID

对于自增主键的表,插入数据后你可能需要得到新插入行的ID。这可以通过LAST_INSERT_ID()函数实现:

INSERT INTO table_name (column1, column2) VALUES (value1, value2);
SELECT LAST_INSERT_ID();

1.7 插入默认值

如果表的所有列都有默认值,可以这样插入一行默认值:

INSERT INTO table_name DEFAULT VALUES;

1.8 插入JSON数据

对于存储JSON数据的列,可以这样插入:

INSERT INTO table_name (json_column) VALUES ('{"key": "value"}');

通过这些丰富多样的INSERT用法,你可以灵活地处理各种数据插入场景,从而更有效地管理MySQL数据库。

1.9 插入时忽略错误

在某些情况下,你可能希望在插入时忽略主键或唯一约束导致的错误,而不是终止操作。这可以通过INSERT IGNORE实现:

INSERT IGNORE INTO table_name (column1, column2) VALUES (value1, value2);

这将忽略由于重复键引起的错误,而不是抛出一个错误。

1.10 条件插入

有时你可能只在满足特定条件时才执行插入。虽然INSERT本身不支持条件语句,但可以与SELECT语句结合来实现这一点:

INSERT INTO table_name (column1, column2) SELECT value1, value2 FROM dual WHERE condition;

例如,只有当某个条件为真时才插入数据:

INSERT INTO fruits (name, quantity) SELECT 'Peach', 20 FROM dual WHERE EXISTS (SELECT * FROM users WHERE username = 'admin');

1.11 使用ON DUPLICATE KEY UPDATE

当尝试插入的行在表中已存在具有相同的唯一键或主键时,ON DUPLICATE KEY UPDATE子句允许你更新行而不是插入新行:

INSERT INTO table_name (column1, column2) VALUES (value1, value2) ON DUPLICATE KEY UPDATE column2 = value2;

这对于需要插入或更新记录的情况非常有用。

1.12 插入数据并获取信息

使用INSERT ... ON DUPLICATE KEY UPDATE时,你可以使用LAST_INSERT_ID()ROW_COUNT()来获取插入或更新操作的详细信息:

INSERT INTO table_name (column1, column2) VALUES (value1, value2) ON DUPLICATE KEY UPDATE column2 = VALUES(column2);
SELECT LAST_INSERT_ID(), ROW_COUNT();

1.13 插入数据到分区表

如果你的表被分区了,你可以像往常一样使用INSERT语句。MySQL会自动将数据插入到适当的分区:

INSERT INTO partitioned_table (column1, column2) VALUES (value1, value2);

1.14 使用子查询插入

你可以使用一个复杂的子查询来插入数据,这对于需要从多个表中提取数据的情况非常有用:

INSERT INTO table_name (column1, column2) SELECT column1, SUM(column2) FROM another_table GROUP BY column1;

1.15 插入并加锁

在某些高并发情况下,你可能需要在插入时对表加锁以保证数据一致性:

LOCK TABLES table_name WRITE;
INSERT INTO table_name (column1, column2) VALUES (value1, value2);
UNLOCK TABLES;

2 更新数据:UPDATE语句

在MySQL中,UPDATE语句是用来修改表中现有数据的强大工具。它的基本语法是:

UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;

我们将通过不同的示例来展示UPDATE语句的多样用法

2.1 更新单个字段

最基本的用法是更新表中单个字段的值。例如,假设我们要将水果表中苹果的数量更新为20:

UPDATE fruits
SET quantity = 20
WHERE name = 'Apple';

2.2 更新多个字段

UPDATE可以同时修改多个字段。例如,苹果的名称改为“Green Apple”,数量改为30:

UPDATE fruits
SET name = 'Green Apple', quantity = 30
WHERE name = 'Apple';

2.3 使用条件表达式

可以使用更复杂的条件表达式来更新特定的数据。例如,增加所有数量少于10的水果的数量:

UPDATE fruits
SET quantity = quantity + 10
WHERE quantity < 10;

2.4 使用ORDER BY和LIMIT

在某些情况下,你可能需要按特定顺序更新记录,并限制更新的行数。例如,仅更新数量最少的两种水果的数量:

UPDATE fruits
SET quantity = quantity + 5
ORDER BY quantity ASC
LIMIT 2;

2.5 更新与其他表关联的数据

你还可以更新与其他表关联的数据。假设有另一个表suppliers,记录了水果的供应商。如果要更新特定供应商供应的所有水果的价格,可以使用:

UPDATE fruits
SET price = price * 1.1
WHERE id IN (SELECT fruit_id FROM suppliers WHERE supplier_name = 'ABC供应商');

2.6 使用CASE语句进行条件更新

CASE语句可以在更新时提供更多的灵活性。例如,根据水果的存货量来调整价格:

UPDATE fruits
SET price = CASEWHEN quantity < 20 THEN price * 0.9WHEN quantity BETWEEN 20 AND 50 THEN priceELSE price * 1.1
END;

2.7 使用数学函数和表达式

可以在UPDATE语句中使用各种数学函数和表达式。例如,将所有水果的数量增加当前数量的10%:

UPDATE fruits
SET quantity = quantity * 1.1;

2.8 利用JOIN进行复杂更新

当需要根据其他表中的数据来更新一个表时,可以使用JOIN语句。例如,如果我们有一个供应商表suppliers和水果表fruits,且想根据供应商的某些条件来更新水果的价格,可以这样做:

UPDATE fruits
JOIN suppliers ON fruits.supplier_id = suppliers.id
SET fruits.price = fruits.price * 1.05
WHERE suppliers.country = 'China';

这个语句会将所有中国供应商提供的水果价格提高5%。

2.9 使用子查询更新

在某些情况下,你可能需要根据从同一表或不同表中检索到的数据来更新记录。例如,假设你想将最畅销水果的价格提高10%:

UPDATE fruits
SET price = price * 1.1
WHERE name = (SELECT nameFROM salesGROUP BY nameORDER BY SUM(quantity) DESCLIMIT 1
);

这里,子查询找出了销量最高的水果名称,并更新了其价格。

2.10 使用TRIGGERS自动更新

在某些高级应用中,你可能想在某些事件发生时自动执行更新。这可以通过在数据库中创建触发器(TRIGGERS)来实现。例如,每次向sales表中添加一条新记录时,自动更新fruits表中相应水果的数量:

CREATE TRIGGER update_fruit_quantity
AFTER INSERT ON sales
FOR EACH ROW
BEGINUPDATE fruitsSET quantity = quantity - NEW.sold_quantityWHERE name = NEW.fruit_name;
END;

在这个例子中,每次在sales表中添加新销售记录后,fruits表中相应水果的数量将自动减去销售数量。

2.11 使用安全更新

为了避免错误地更新过多的行,MySQL提供了安全更新模式。当启用时,如果UPDATE语句没有使用WHERE子句(或没有唯一索引),MySQL将拒绝执行更新。这可以防止不小心更新了表中的所有记录。你可以通过以下命令启用安全更新模式:

SET SQL_SAFE_UPDATES = 1;

之后,任何没有明确WHERE子句或唯一索引的UPDATE语句都会被拒绝执行。

3 删除数据:DELETE语句

在MySQL中,DELETE语句是用来删除表中一行或多行数据的强大工具。理解其多样的用法对于有效管理数据库至关重要。以下是一些常用的DELETE语句用法:

3.1 DELETE语句的基本语法

基本的DELETE语句格式如下:

DELETE FROM table_name WHERE condition;
  • table_name 是你想要从中删除记录的表名。
  • WHERE condition 是用来指定哪些行应该被删除的条件。如果省略了WHERE子句,所有行都会被删除,这将清空表但不会删除表本身。

3.2 删除特定行

根据特定条件删除行。例如,删除水果表中所有“Apple”的记录:

DELETE FROM fruits WHERE name = 'Apple';

3.3 使用比较运算符

可以使用比较运算符(如<, >, <=, >=)来删除行。例如,删除所有数量少于20的水果:

DELETE FROM fruits WHERE quantity < 20;

3.4 使用逻辑运算符

使用AND、OR等逻辑运算符来组合条件。例如,删除名称为“Apple”且数量小于10的记录:

DELETE FROM fruits WHERE name = 'Apple' AND quantity < 10;

3.5 删除满足IN条件的行

当需要删除匹配特定列表中值的行时,可以使用IN。例如,删除所有名称是“Apple”,“Banana”,或“Orange”的水果:

DELETE FROM fruits WHERE name IN ('Apple', 'Banana', 'Orange');

3.6 使用LIKE操作符进行模糊删除

使用LIKE操作符删除满足模糊匹配条件的行。例如,删除所有名字以“A”开头的水果:

DELETE FROM fruits WHERE name LIKE 'A%';

3.7 使用LIMIT控制删除行数

使用LIMIT来限制删除操作影响的行数。例如,只删除两条水果记录:

DELETE FROM fruits LIMIT 2;

3.8 使用ORDER BY和LIMIT组合

结合ORDER BYLIMIT来删除特定顺序的记录。例如,删除数量最少的3种水果:

DELETE FROM fruits ORDER BY quantity ASC LIMIT 3;

3.9 删除关联表中的数据

在有外键约束的关联表中,要谨慎进行删除操作。删除操作必须遵守外键约束,或者需要首先删除或更新子表中的关联行。

3.10 安全的删除操作

在执行删除操作前,建议先用SELECT语句进行测试,确保你将删除正确的行。例如:

SELECT * FROM fruits WHERE quantity < 10;

检查返回的结果,如果是你想要删除的数据,再执行相应的DELETE语句。

写在最后

通过本篇博客,我们深入探讨了MySQL中的数据修改基础操作:INSERT、UPDATE、DELETE语句。从创建一个简单的水果表开始,我们逐步展示了如何插入新数据、更新现有数据,以及删除不需要的数据。这些操作是数据库管理中非常重要的技能。掌握它们不仅有助于管理和维护数据库中的数据,还能提高你处理数据的灵活性和效率。

请记住,实践是学习数据库管理的关键。我建议你在自己的数据库环境中创建这样的表,并尝试执行这些操作。随着实践的增多,你将对MySQL的使用更加得心应手。如果在学习过程中遇到任何问题,不妨继续探索或寻求帮助。祝你在MySQL的学习之旅上取得更多进步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/620194.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java数据结构与算法:单链表 SinglyLinkedList

单链表 SinglyLinkedList 创建实现类并实现方法 package com.lhs;public class SinglyLinkedList<E> implements List<E>{// 头节点private Node<E> first;// 尾节点private Node<E> last;// 节点数量private int size;public static class Node<…

微信小程序开发学习笔记《12》下拉刷新事件

微信小程序开发学习笔记《12》下拉刷新事件 博主正在学习微信小程序开发&#xff0c;希望记录自己学习过程同时与广大网友共同学习讨论。建议仔细阅读官方文档 一、什么是下拉刷新 下拉刷新是移动端的专有名词&#xff0c;指的是通过手指在屏幕上的下拉滑动操作&#xff0c;…

php反序列化漏洞基础

一、序列化 serialize(): 序列化是将对象或类转换为字符串的过程,以便在程序运行过程中对其进行持久化存储或传输的操作。在PHP中,序列化主要用于将类对象或数组转换成字节流的形式,以便于存储在磁盘或传输到其他系统。 通过序列化,可以将对象或类转换成一串字符串,然后可…

【数据开发】HiveSQL 临时表分步执行(with, as )与时间函数(时间戳unix_timestamp)

1、分步执行&#xff08;with…as…&#xff09; Hive SQL中的WITH…AS…语句可以用于分步执行&#xff0c;即将一个大的查询语句拆分成多个小的查询语句&#xff0c;每个小的查询语句都可以使用WITH…AS…语句定义一个临时表&#xff0c;然后在后面的查询语句中使用这些临时表…

linux相关操作

1&#xff1a;掌握虚拟机快照的制作和还原 然后转到就欧克了&#xff0c;相当于游戏存档。 2&#xff1a;linux基础命令 1&#xff1a;掌握linux系统的目录结构 linux没有盘符概念&#xff0c;只有一个根目录/&#xff0c;所有文件都在它之下 路径的描述方式&#xff1a; 在l…

uniapp中uview组件库丰富的Table 表格的使用方法

目录 #平台差异说明 #基本使用 #兼容性 #API #Table Props #Td Props #Th Props 表格组件一般用于展示大量结构化数据的场景 #平台差异说明 AppH5微信小程序支付宝小程序百度小程序头条小程序QQ小程序√√√√√√√ #基本使用 本组件标签类似HTML的table表格&#…

redis被攻击:安全问题

1 必须修改端口号 port 323422 2 必须设置密码&#xff0c;并且有一定的复杂度 requirepass dske#123 3 绑定bind ip bind 127.0.0.1 4 使用无登录权限的用户运行redis 配置文件路径 /www/server/redis/redis.conf 一般都是安装文件里 如果忘记密码和端口号也可以去配置文件…

node连接Mysql失败

报错信息 Error: connect ETIMEDOUTat Connection._handleConnectTimeout (d:\课设\服务器端\node_modules\mysql\lib\Connection.js:409:13)at Object.onceWrapper (node:events:628:28)at Socket.emit (node:events:514:28)at Socket._onTimeout (node:net:589:8)at listOnT…

计算机毕设项目(一)基于flask+mongo+angular实现爬取加密货币信息并使用LSTM模型预测价格的论坛可视化平台

文章目录 加密货币平台项目介绍技术栈1. 用户管理2. 新闻和帖子管理3. 加密货币数据4. 对话获取5. 数据获取 服务端代码完整代码 加密货币平台项目介绍 这个项目是一个基于 Flask 和 MongoDB 的深度学习应用程序&#xff0c;通过爬虫爬取加密货币行情和介绍信息&#xff0c;并…

rust嵌入式开发补充

本文是对rust嵌入式开发的补充&#xff0c;就当时遗留的一些问题进行增补与修正。 RTIC中的任务处理 在上篇文章中还不是很理解rtic的工作机制。但写东东进行总结的好处就体现出来了&#xff0c;在上篇文章中提到了rtic的app入口本就是一个进程宏&#xff0c;所以在写完文章后…

(Java企业 / 公司项目)分布式事务Seata详解(含Seata+Nacos组合使用)

一. Seata介绍 Seata 是一款开源的分布式事务解决方案&#xff0c;致力于在微服务架构下提供高性能和简单易用的分布式事务服务。在 Seata 开源之前&#xff0c;其内部版本在阿里系内部一直扮演着应用架构层数据一致性的中间件角色&#xff0c;帮助经济体平稳的度过历年的双11&…

数字化转型与数据化思维

什么是数字化转型&#xff0c;什么是数据化思维&#xff0c;它们之间有什么关系&#xff1f; 数字化转型&#xff08;Digital Transformation&#xff09;是指企业或组织利用数字技术从根本上改变其业务活动、流程、文化和商业模式的过程&#xff0c;以适应不断变化的市场环境…

【Vue3/Vue2】判断设备是移动端还是pc端跳转不同路由router

Vue3代码 APP文件中写入js代码 1、首先&#xff0c;通过isMobile()函数判断用户的设备类型。该函数使用正则表达式匹配navigator.userAgent字符串&#xff0c;以确定用户是在移动设备上访问网页还是在桌面设备上访问网页 2、然后&#xff0c;在onMounted()钩子函数中&#…

http的tcp连接

http的tcp连接 三次握手 1、客户端第一次发起握手&#xff0c;请求建立tcp连接。 2、服务端接收到请求&#xff0c;知道客户端发送正常&#xff0c;为了让客户端知道服务端发送和接收信息正常&#xff0c;发起第二次握手&#xff0c;告诉客户端接收到了请求&#xff0c;并答…

vue3 - 自定义弹框组件

写了一个弹框组件 <template><transition name"modal-fade"><div v-if"showFlag" class"myModal"><div class"content"><div class"topBox"><div class"leftTitle"><spa…

线性代数——行列式按行(列)展开

目录 一、余子式&#xff1a;将行列式某元素所在行和列的元素全去掉 剩余部分所构成的行列式&#xff0c;称为该元素的余子式 二、代数余子式 三、行列式等于它的任一行&#xff08;列&#xff09;的各元素与对应代数余子式乘积之和 四、行列式某行元素&#xff08;列&…

单机物理机部署Datax

一、概述 DataX 是阿里巴巴开源的一个异构数据源离线同步工具&#xff0c;致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。 源码地址&#xff1a;https://github.com/alibaba/DataX 为了解决异构数据…

什么是云服务器?云服务器的工作原理是介绍

阿里云服务器ECS英文全程Elastic Compute Service&#xff0c;云服务器ECS是一种安全可靠、弹性可伸缩的云计算服务&#xff0c;阿里云提供多种云服务器ECS实例规格&#xff0c;如经济型e实例、通用算力型u1、ECS计算型c7、通用型g7、GPU实例等&#xff0c;阿里云百科aliyunbai…

Linux shell jq工具操作文档(jq --help使用示例)

文章目录 jq工具介绍jq --help解读英文中文 使用示例1. 使用最简单的过滤器。将输入复制到输出&#xff0c;不做任何修改&#xff08;除了格式化&#xff09;2. 使用 -c 选项进行紧凑输出而非美化输出3. 使用 -n 选项以 null 作为单一输入值&#xff08;用于创建新json&#xf…

STL——stack容器和queue容器详解

目录 &#x1f4a1;stack &#x1f4a1;基本概念 常用接口 &#x1f4a1;queue &#x1f4a1;基本概念 &#x1f4a1;常用接口 &#x1f4a1;stack &#x1f4a1;基本概念 栈&#xff08;stack&#xff09;&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端…