尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

SQL四大核心操作:INSERT、SELECT、UPDATE、DELETE实战详解

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世界了。
返回列表