SQL四大核心操作:INSERT、SELECT、UPDATE、DELETE实战详解
1. 背景与核心概念在上一篇文章中我们初步认识了SQLStructured Query Language及其在数据操作中的基础地位。如果说上一章是“认识工具”那么本章将进入“使用工具”的阶段。对于任何希望与数据库打交道的开发者、数据分析师或运维人员而言掌握SQL的核心操作是必经之路。无论是从零开始构建一个用户管理系统还是从海量日志中提取关键业务指标都离不开对数据表进行增、删、改、查这四项基本操作。本章将系统性地讲解SQL的四大核心语句INSERT插入、SELECT查询、UPDATE更新和DELETE删除。我们将从最基础的语法开始逐步深入到实际应用中的复杂场景和注意事项。通过本章的学习你将能够独立完成对数据库中数据的完整生命周期管理并为后续学习更高级的查询、表连接和事务控制打下坚实的基础。2. 环境准备与版本说明在开始动手实践之前确保你有一个可以运行的数据库环境至关重要。本文的示例将基于MySQL 8.0版本但其核心语法在PostgreSQL、SQLite、Microsoft SQL Server等主流关系型数据库中大同小异你可以根据自己使用的数据库进行微调。基础环境要求数据库服务MySQL 8.0 或其它兼容SQL-92标准的数据库。客户端工具任意你熟悉的工具如命令行客户端mysql(MySQL自带)图形化工具MySQL Workbench, DBeaver, Navicat, DataGrip等。示例数据库我们将创建一个简单的students学生信息表用于演示。初始化示例表在你连接的数据库中执行以下SQL语句来创建我们的练习环境。-- 1. 创建一个名为 learning_sql 的数据库如果不存在 CREATE DATABASE IF NOT EXISTS learning_sql; USE learning_sql; -- 2. 创建 students 表 DROP TABLE IF EXISTS students; CREATE TABLE students ( id INT PRIMARY KEY AUTO_INCREMENT COMMENT 学生ID主键自增长, name VARCHAR(50) NOT NULL COMMENT 学生姓名, age INT COMMENT 学生年龄, email VARCHAR(100) UNIQUE COMMENT 邮箱唯一约束, enrollment_date DATE DEFAULT (CURRENT_DATE) COMMENT 入学日期默认为当天, score DECIMAL(5, 2) COMMENT 成绩最多5位数含2位小数 ) COMMENT学生信息表; -- 3. 查看表结构确认创建成功 DESC students;执行DESC students;后你应该能看到类似下面的表结构描述这表明环境已就绪。--------------------------------------------------------------------- | Field | Type | Null | Key | Default | Extra | --------------------------------------------------------------------- | id | int | NO | PRI | NULL | auto_increment | | name | varchar(50) | NO | | NULL | | | age | int | YES | | NULL | | | email | varchar(100) | YES | UNI | NULL | | | enrollment_date| date | YES | | curdate() | | | score | decimal(5,2) | YES | | NULL | | ---------------------------------------------------------------------3. 核心语法与操作详解3.1 插入数据 - INSERT向数据库表中添加新记录使用INSERT INTO语句。这是数据产生的源头。基础语法INSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...);示例与解释指定列插入推荐明确列出要插入数据的列名值与列一一对应。未列出的列将采用默认值或NULL。-- 插入一条完整记录 INSERT INTO students (name, age, email, enrollment_date, score) VALUES (张三, 20, zhangsanexample.com, 2023-09-01, 85.50); -- 插入一条记录只提供部分列的值id自增enrollment_date有默认值 INSERT INTO students (name, age, email) VALUES (李四, 22, lisiexample.com);id字段因设置了AUTO_INCREMENT数据库会自动生成一个唯一递增值。enrollment_date字段设置了默认值CURRENT_DATE所以未提供时自动填入当天日期。score字段允许NULL因此未提供值即为NULL。省略列名插入必须为表中所有列除了自增列提供值且顺序必须与表定义完全一致。不推荐使用因为表结构变更极易导致语句失败。-- 假设知道id下一个是3且所有列都需要值 INSERT INTO students VALUES (3, 王五, 21, wangwuexample.com, 2023-08-15, 92.00);批量插入一次性插入多条数据效率远高于多次执行单条插入。INSERT INTO students (name, age, email, score) VALUES (赵六, 19, zhaoliuexample.com, 78.00), (钱七, 23, qianqiexample.com, 88.50), (孙八, 20, sunbaexample.com, 91.00);关键注意事项唯一约束冲突如果插入的数据违反了UNIQUE约束例如重复的email语句将执行失败。在生产中我们常使用INSERT IGNORE或INSERT ... ON DUPLICATE KEY UPDATE来处理冲突。非空约束标记为NOT NULL的列如name必须提供值。数据类型匹配提供的值必须与列定义的数据类型兼容。3.2 查询数据 - SELECTSELECT是SQL中使用最频繁的语句用于从表中检索数据。其能力非常强大本节介绍其基础形式。基础语法SELECT column1, column2, ... FROM table_name [WHERE condition] [ORDER BY column_name [ASC|DESC]] [LIMIT number];示例与解释查询所有列使用星号(*)通配符。SELECT * FROM students;查询特定列明确指定需要的列这是最佳实践能减少不必要的数据传输。SELECT name, email, score FROM students;使用WHERE子句过滤只返回满足条件的行。-- 查找年龄大于等于20岁的学生 SELECT * FROM students WHERE age 20; -- 查找姓名为‘张三’的学生 SELECT * FROM students WHERE name 张三; -- 组合条件年龄大于20且成绩高于80分 SELECT name, age, score FROM students WHERE age 20 AND score 80.00; -- 使用IN查找特定值 SELECT * FROM students WHERE name IN (张三, 李四, 王五); -- 模糊查询查找姓‘张’的学生%代表任意多个字符 SELECT * FROM students WHERE name LIKE 张%;使用ORDER BY排序指定结果集的显示顺序。-- 按成绩降序排列从高到低 SELECT name, score FROM students ORDER BY score DESC; -- 先按年龄升序年龄相同再按成绩降序 SELECT name, age, score FROM students ORDER BY age ASC, score DESC;使用LIMIT限制结果数量常用于分页或只查看前几条记录。-- 查看前3条记录 SELECT * FROM students LIMIT 3; -- 分页查询从第2条记录开始偏移量1取2条记录 -- 公式LIMIT (page_number - 1) * page_size, page_size SELECT * FROM students LIMIT 1, 2; -- 返回第2、3条记录3.3 更新数据 - UPDATE修改表中已存在的记录使用UPDATE语句。务必谨慎使用通常需要配合WHERE子句否则会更新整张表基础语法UPDATE table_name SET column1 value1, column2 value2, ... WHERE condition;示例与解释更新特定记录为符合条件的学生更新信息。-- 将‘张三’的成绩改为90.00 UPDATE students SET score 90.00 WHERE name 张三; -- 同时更新多个字段为‘李四’增加年龄并更新邮箱 UPDATE students SET age age 1, email new_lisiexample.com WHERE name 李四;基于现有值更新可以使用表达式。-- 为所有成绩低于60分的学生增加10分但不超过100分 UPDATE students SET score LEAST(score 10.00, 100.00) WHERE score 60.00;致命警告-- 危险操作没有WHERE子句将更新表中所有行 UPDATE students SET score 0;在执行UPDATE前强烈建议先用一个SELECT语句验证WHERE条件是否准确匹配到了你预期的行。-- 先查询确认 SELECT * FROM students WHERE name 张三; -- 确认无误后再执行更新 UPDATE students SET score 90.00 WHERE name 张三;3.4 删除数据 - DELETE从表中删除记录使用DELETE FROM语句。这是危险程度最高的DML操作因为数据删除后通常难以恢复除非有备份或启用事务。必须使用WHERE子句基础语法DELETE FROM table_name WHERE condition;示例与解释删除特定记录-- 删除邮箱为‘zhangsanexample.com’的学生记录 DELETE FROM students WHERE email zhangsanexample.com; -- 删除所有年龄小于18岁的学生记录 DELETE FROM students WHERE age 18;清空整张表有两种方式区别巨大。-- 方式一DELETE FROM DML操作 DELETE FROM students; -- 逐行删除可回滚在事务内自增计数器不重置。 -- 方式二TRUNCATE TABLE DDL操作 TRUNCATE TABLE students; -- 直接删除表并重建结构速度快不可回滚自增计数器重置。DELETE FROM table是DML操作会写日志支持WHERE在事务中可回滚。对于大表删除速度较慢。TRUNCATE TABLE是DDL操作不写逐行日志不可用WHERE执行速度快且会重置自增ID。操作需更高权限且数据无法通过事务回滚。核心安全准则备份优先在执行可能影响大量数据的DELETE或UPDATE前对表或相关数据进行备份。事务包裹在正式环境中将删除操作放在一个事务中先执行确认无误后再提交(COMMIT)发现问题可立即回滚(ROLLBACK)。START TRANSACTION; -- 开始事务 DELETE FROM students WHERE score 60.00; -- 此时可以查询确认删除是否正确 SELECT * FROM students; -- 如果确认无误 COMMIT; -- 如果发现问题 ROLLBACK;4. 完整实战案例学生成绩管理系统基础操作现在让我们综合运用以上四种操作模拟一个简单的学生成绩管理场景。场景描述新学期开始批量录入新生信息。查询所有学生的基本信息。老师批改试卷后需要更新部分学生的成绩。有学生退学需要删除其记录。期末需要列出成绩优秀的学生名单。操作步骤-- 步骤1批量插入新生数据 INSERT INTO students (name, age, email, enrollment_date, score) VALUES (周九, 18, zhoujiuexample.com, 2024-03-01, NULL), (吴十, 19, wushiexample.com, 2024-03-01, 76.50), (郑十一, 20, zhengshiyiexample.com, 2024-03-01, 88.00); -- 步骤2查询所有学生按入学日期倒序排列 SELECT id, name, age, email, enrollment_date, score FROM students ORDER BY enrollment_date DESC, id ASC; -- 步骤3更新成绩假设周九的成绩出来了吴十的成绩录入有误需修正 UPDATE students SET score 92.50 WHERE name 周九; UPDATE students SET score score 5.00 WHERE name 吴十; -- 将76.5改为81.5 -- 步骤4删除退学学生假设‘孙八’退学 DELETE FROM students WHERE name 孙八; -- 步骤5查询成绩大于等于90分的学生按成绩从高到低排序 SELECT name, score, email FROM students WHERE score 90.00 ORDER BY score DESC;执行完以上步骤后你可以通过SELECT * FROM students;查看表中最终的数据状态理解每一步操作对数据产生的影响。5. 常见问题与排查思路在学习和使用基础SQL操作时你可能会遇到以下典型问题问题现象可能原因排查与解决思路INSERT失败Duplicate entry ‘xxx’ for key ‘email’违反了唯一约束试图插入重复的邮箱。1. 检查待插入的email值是否已存在。2. 使用SELECT查询确认。3. 考虑使用INSERT IGNORE忽略重复或REPLACE INTO替换或ON DUPLICATE KEY UPDATE更新。INSERT失败Column ‘name’ cannot be null违反了非空约束试图向NOT NULL列插入NULL值。检查INSERT语句确保为所有NOT NULL列提供了有效值。UPDATE或DELETE影响了太多行WHERE条件过于宽泛或完全遗漏。立即使用ROLLBACK回滚事务如果开启了。务必在操作前用SELECT ... WHERE ...预览受影响的数据。为UPDATE/DELETE语句添加精确的WHERE条件。DELETE FROM table执行极慢对大表执行无条件的DELETE会逐行删除并记录日志消耗大量资源和时间。1. 如果确实需要清空表考虑使用TRUNCATE TABLE注意不可回滚。2. 如果需要删除大量数据但非全部尝试分批删除DELETE FROM table WHERE id 10000 LIMIT 1000;。SELECT查询结果不符合预期WHERE条件逻辑错误或对NULL值处理不当。1. 检查WHERE中的逻辑运算符(AND,OR)。2. 注意NULL的比较column NULL是无效的应使用column IS NULL或column IS NOT NULL。3. 注意字符串大小写某些数据库默认区分大小写。自增ID不连续执行过DELETE操作后自增计数器不会回退。插入失败的事务也可能消耗ID。这是正常现象自增ID的唯一性和递增性是关键连续性不是必须的。不要试图手动修改自增ID值来“修复”间隙。6. 最佳实践与工程建议掌握语法只是第一步在真实项目中遵循最佳实践能避免无数坑。始终使用WHERE子句对UPDATE和DELETE养成先写WHERE的习惯。可以在客户端工具中设置安全模式禁止执行无WHERE的更新/删除。操作前先SELECT在执行UPDATE或DELETE前务必用相同的WHERE条件执行一次SELECT确认目标数据无误。使用事务保证原子性对于一组相关的更新操作如转账A账户扣款B账户加款务必使用事务(BEGIN;...COMMIT;)包裹确保要么全部成功要么全部失败回滚。进行数据备份在执行可能影响大量数据或重要数据的操作前对表进行备份。可以使用CREATE TABLE table_backup AS SELECT * FROM original_table;。明确列出插入的列名INSERT INTO table (col1, col2) VALUES ...的写法更清晰、更安全即使表结构后续增加新列语句也不会出错。避免使用SELECT *在生产代码中明确指定需要查询的列。这能减少网络I/O提高查询性能并使代码意图更清晰。谨慎处理NULL值在设计表时认真考虑每个字段是否允许为NULL。在查询时牢记与NULL的任何比较,,结果都是UNKNOWN需使用IS NULL或IS NOT NULL。为常用查询条件建立索引在WHERE和ORDER BY子句中频繁使用的列上创建索引可以极大提升SELECT查询速度后续章节详述。7. 总结与学习路线本章我们深入探讨了SQL的四大核心数据操作语言DML语句INSERT、SELECT、UPDATE和DELETE。你现在应该能够熟练地向数据库中添加新数据。使用各种条件灵活地检索所需数据。安全地修改已有数据。理解删除数据的风险并掌握安全删除的方法。这些是操作数据库的基石。然而真实世界的数据关系远比单表操作复杂。在接下来的学习中你将接触到更强大的概念数据查询的进阶多表连接JOIN、分组聚合GROUP BYHAVING、子查询等这将让你能从多个关联表中提取复杂信息。数据完整性深入理解主键、外键约束以及事务的ACID属性确保数据的一致性和可靠性。数据库设计如何科学地设计表结构范式以应对复杂的业务需求。建议你立即在本地数据库环境中按照本文的示例一步步练习并尝试设计自己的小场景如简单的博客文章表、商品订单表进行增删改查操作。实践是巩固SQL知识最有效的方式。当你对这些基础操作感到得心应手时就可以自信地迈向更复杂的SQL世界了。

相关新闻

Python自动化歌单:Flask+yt-dlp构建本地循环播放服务器

Python自动化歌单:Flask+yt-dlp构建本地循环播放服务器

这次我们来看一个名为“循环歌单”的项目,它本质上是一个围绕特定主题(如“我的世界皓宸の小曲”)进行视频或音频内容搬运、整理和循环播放的工具或脚本。对于喜欢特定UP主或游戏背景音乐的观众来说,这类工具能自动化地收集、整理…

2026/8/14 1:26:54 阅读更多 →
网页视频下载插件VideoDownloadHelper完整上手教程:5分钟搞定第一个视频

网页视频下载插件VideoDownloadHelper完整上手教程:5分钟搞定第一个视频

网页视频下载插件VideoDownloadHelper完整上手教程:5分钟搞定第一个视频 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper VideoDow…

2026/8/14 1:26:54 阅读更多 →
阴阳师自动化脚本终极指南:解放双手的3大智能解决方案

阴阳师自动化脚本终极指南:解放双手的3大智能解决方案

阴阳师自动化脚本终极指南:解放双手的3大智能解决方案 【免费下载链接】OnmyojiAutoScript Onmyoji Auto Script | 阴阳师脚本 项目地址: https://gitcode.com/gh_mirrors/on/OnmyojiAutoScript 你是否还在为阴阳师繁重的日常任务而烦恼?每天需要…

2026/8/14 1:26:54 阅读更多 →

最新新闻

发明专利从申请到授权,最长3年,每个阶段都在淘汰人

发明专利从申请到授权,最长3年,每个阶段都在淘汰人

一、2-3年的马拉松:发明专利的完整生命周期发明专利从申请到授权,整体周期通常为2-3年。据国家知识产权局公开数据,发明专利审查周期已压减至15.5个月(自实质审查请求生效起算),但加上申请、公布、实审请求…

2026/8/14 4:12:02 阅读更多 →
Python可迭代对象与迭代器:从基础协议到高效数据处理

Python可迭代对象与迭代器:从基础协议到高效数据处理

1. 从“能循环”到“懂循环”:重新认识Python可迭代对象如果你写过几行Python代码,肯定用过for item in my_list:这样的循环。你可能觉得这理所当然,列表嘛,不就是用来循环的吗?但你想过没有,为什么字典、字…

2026/8/14 4:12:02 阅读更多 →
揭秘网站建设包括哪些内容从0到1的全流程解析与避坑指南

揭秘网站建设包括哪些内容从0到1的全流程解析与避坑指南

很多人以为,建个网站就像搭积木,找个模板套一下,买个域名填进去,完事了。如果真这么简单,那世界上早就没有烂尾项目了。作为在这个行业里摸爬滚打多年的老兵,我见过太多老板或市场负责人,兴冲冲地拿着几万块钱预算来找我,结果做出来的东西惨不忍睹,不仅没用,反而成了…

2026/8/14 4:12:02 阅读更多 →
一招告别卡顿:Mem Reduct 3.5.2 免费内存清理工具完整使用教程

一招告别卡顿:Mem Reduct 3.5.2 免费内存清理工具完整使用教程

一招告别卡顿:Mem Reduct 3.5.2 免费内存清理工具完整使用教程 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/me/memreduct…

2026/8/14 4:12:02 阅读更多 →
SQL进阶:掌握WHERE、GROUP BY与HAVING,实现高效数据查询与分析

SQL进阶:掌握WHERE、GROUP BY与HAVING,实现高效数据查询与分析

如果你刚开始学 SQL,可能会觉得它很简单——不就是 SELECT * FROM table 吗?但当你真正面对一个业务系统,需要从海量数据里快速、准确地找到关键信息,或者需要设计一个既能支撑业务增长又易于维护的数据库结构时,你会…

2026/8/14 4:12:02 阅读更多 →
网红藏餐推荐哪家朋友推荐多

网红藏餐推荐哪家朋友推荐多

来拉萨旅游,吃饭绝对是头等大事。打开小红书、抖音,满屏都是“必打卡藏餐”推荐,但等你真正走进去,才发现十有八九踩了雷——要么环境嘈杂得像菜市场,要么菜品油腻到怀疑人生,更别提那些用料理包糊弄人的“…

2026/8/14 4:11:02 阅读更多 →

日新闻

临沂网站建设铭镇:深耕本土数字生态,以匠心铸就企业品牌核心竞争力

临沂网站建设铭镇:深耕本土数字生态,以匠心铸就企业品牌核心竞争力

在这个流量为王、视觉至上的互联网时代,对于临沂乃至整个山东乃至全国的传统中小企业来说,拥有一张精美的“数字名片”早已不再是可选项,而是生存的必答题。每当夜幕降临,沂河两岸灯火辉煌,物流之都的喧嚣逐渐沉淀为对未来的思考。我们常常听到老板们在茶余饭后探讨:为什…

2026/8/14 0:00:26 阅读更多 →
Flutter与OpenHarmony实现剧本杀组队表单开发实战

Flutter与OpenHarmony实现剧本杀组队表单开发实战

1. 项目概述在移动应用开发领域,跨平台框架Flutter因其高效的开发体验和出色的性能表现,已经成为众多开发者的首选。而OpenHarmony作为新兴的操作系统平台,其开放性和灵活性为开发者提供了全新的可能性。本文将聚焦于一个实际应用场景——剧本…

2026/8/14 0:00:26 阅读更多 →
大连网站建设找简维科技:为您打造懂业务更懂用户的数字化转型引擎

大连网站建设找简维科技:为您打造懂业务更懂用户的数字化转型引擎

在这个数字化浪潮席卷全球的今天,企业想要在激烈的市场竞争中站稳脚跟,拥有一张好看的“数字名片”已经远远不够了。很多老板在刚开始接触互联网业务时,都有一个共同的困惑:为什么我花了钱建的网站,就像是在真空中自嗨?访客进来转了两圈就跑了,线索石沉大海,甚至连客服…

2026/8/14 0:01:27 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/13 2:38:34 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/13 10:41:52 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/13 10:41:51 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/13 10:41:50 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/13 10:41:49 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/13 10:41:49 阅读更多 →