SQL 防混淆指南:先定对象,再选动词
写 SQL 时,你是不是经常把 DROP 和 DELETE 搞混?是不是纠结过为什么 SELECT 有 FROM,而 UPDATE 没有?
其实,只要回到事情的最根本:你到底在动什么? 所有的混淆都会迎刃而解。SQL 的本质只处理两类对象,只要抓住这个核心,就能解决绝大多数的语法混淆问题。
一、明确你在动什么对象?
SQL 的操作对象只有两类,这是所有混乱的根源:
- 结构:库、表、字段。你可以理解为"楼、房间、家具布局"。
- 数据 :表里的行(记录)。你可以理解为"住在里面的人"。
核心逻辑:结构是容器,数据是内容。容器用一套词,内容用另一套词。
二、按对象选动词 (DDL vs DML)
弄清对象后,动词就固定了,千万别串。
1. 动结构(容器) -> 用 DDL
- 建 :
CREATE(如CREATE TABLE) - 改 :
ALTER(如ALTER TABLE ... ADD COLUMN) - 拆 :
DROP(如DROP TABLE)
2. 动数据(内容) -> 用 DML - 插 :
INSERT(如INSERT INTO ... VALUES) - 改 :
UPDATE(如UPDATE ... SET) - 删 :
DELETE(如DELETE FROM ...) - 查 :
SELECT(如SELECT ... FROM)
三、弄懂 FROM 的本质
为什么 DELETE 有 FROM,DROP 没有?SELECT 有,UPDATE 没有?
FROM 的本质是"指明从哪个容器里提取或删除内容"。
- 有 FROM 的语句:都是"从表里拿/删行"
SELECT ... FROM 表(从表里取行)DELETE FROM 表(从表里删行)
- 没 FROM 的语句:对整个容器直接操作,或把内容塞进容器
DROP TABLE 表(直接拆毁整个表,不是从里面删行)UPDATE 表 SET ...(直接修改这个表上的数据,不从别处取)INSERT INTO 表(把数据塞进这个表)
四、DROP vs DELETE 终极对比
这是最高频的混淆点,看这张表就够了:
| 维度 | DROP | DELETE |
|---|---|---|
| 删除对象 | 整个数据库对象(库/表/列等) | 表中的行(数据) |
| 结构是否保留 | 连结构一起删 | 只删数据,保留表结构 |
| 能否回滚 | 通常不可回滚 | 在事务中可以回滚 |
| 有无 FROM | 无(DROP TABLE 表) |
有(DELETE FROM 表) |
一句话记忆:DROP 是拆楼(楼和人都没了),DELETE 是搬走住户(楼还在,人没了)。
五、写 SQL 前的实战三步法
下次写增删查改前,按这个流程走,绝不出错:
- 想对象:我在动结构(容器),还是动数据(内容)?
- 定动词:动结构用 CREATE / ALTER / DROP;动数据用 INSERT / UPDATE / DELETE / SELECT。
- 查细节 :套模板写完后,检查该不该有
FROM或WHERE。
六、高频混淆点速查表
对照下面这张表,避开最常见的错误写法:
| 场景 | 错误写法 | 正确写法 | 核心原因 |
|---|---|---|---|
| 删整张表 | DELETE TABLE 表 |
DROP TABLE 表 |
删对象用 DROP,DELETE 是删行 |
| 清空表数据但保留结构 | DROP TABLE 表 |
TRUNCATE TABLE 表 |
DROP 会连结构一起删掉 |
| 删除某条数据 | DROP FROM 表 WHERE ... |
DELETE FROM 表 WHERE ... |
删行用 DELETE,DROP 没有 FROM |
| 修改字段类型 | UPDATE 表 SET 列 类型 ... |
ALTER TABLE 表 ALTER COLUMN 列 类型 |
改结构用 ALTER,UPDATE 是改数据 |
| 插入一行 | UPDATE INTO 表 ... |
INSERT INTO 表 ... VALUES ... |
插入用 INSERT,不是 UPDATE |
七、防混淆顺口溜
只要想清楚动作和对象,SQL 就再也写不串:
结构三兄弟:建 CREATE,改 ALTER,拆 DROP。
数据四兄弟:插 INSERT,改 UPDATE,删 DELETE,查 SELECT。
FROM 记法:从表里拿/删数据就写 FROM,整体操作对象就不写。