1. 为什么搞懂SQL分类比背100条语法更值钱
先聊个场景。我见过不少刚入行的开发,SQL语法背得滚瓜烂熟,SELECT、INSERT、UPDATE、DELETE用得飞起,但一到面试官问“SQL怎么分类”,直接卡壳。更麻烦的是,实际工作里遇到GRANT、REVOKE这种语句,他们第一反应是“这玩意儿能写吗?是不是走错数据库了?”——这就是没建立SQL分类体系的典型症状。
SQL的分类不是教科书上用来考试的枯燥概念,它本质上是一张解决问题的地图。你拿到一个需求,脑子里先反应出“这属于哪一类SQL”,然后才知道该用哪套语法、注意哪些坑、怎么调性能。举个例子:你接到一个任务要把表里的重复数据清理掉,如果脑子里没有DML和查询语句的清晰分界,你可能会写出全表扫描的慢SQL,而不是用DELETE配合ROW_NUMBER()精准打击。分类思维直接决定你写出的SQL质量和执行效率。
另外,从热搜词可以看出来,大家搜“SQL面试题”“SQL基础”“SQL语句复习”的频率非常高。面试题里几乎必考的一类就是“SQL分类”,而工作中高频踩坑的“慢SQL优化”“SQL注入”“动态SQL”也都和分类有关。可以说,搞懂分类是打通SQL学习和实战的第一块基石。
这篇文章我不会给你堆砌一堆术语,而是用我实际开发和带团队的经验,把SQL的分类讲透:按功能分、按执行特征分、按数据库产品分、按实战场景分。每一类我都会结合具体代码和踩坑经历来拆解,让你看完能直接用上。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 按功能划分:DDL、DML、DCL、TCL四大族的职责边界
这是最经典、也最核心的SQL分类方式。四大族的划分标准是语句对数据库对象和数据的操作性质。很多人的误区是只把SQL当成“查数据”的工具,但实际上SQL是一个完整的语言体系,它不仅能查数据,还能定义数据结构、控制访问权限、管理事务。
2.1 DDL(数据定义语言):和数据结构的对话
DDL的全称是Data Definition Language,中文叫数据定义语言,它负责的是数据库对象的结构操作。这里的“对象”包括数据库、表、索引、视图、存储过程、触发器等等。常用的关键词就几个:CREATE、ALTER、DROP、TRUNCATE、RENAME。
我实际开发中一个很深刻的体会是:DDL的执行代价往往被新人低估。很多人以为ALTER TABLE加个字段是小事,但在生产环境的超大表上执行ALTER TABLE,可能会锁表很久,直接拖垮线上业务。我之前维护过一个千万级的订单表,为了加一个索引,DBA反复确认才敢在凌晨低峰期执行。所以对待DDL,永远要有敬畏心。
还有一点要说清楚:TRUNCATE和DELETE虽然都能清空表数据,但两者有本质区别。TRUNCATE是DDL操作,它直接释放数据页,不能加WHERE条件,执行后无法用事务回滚(在部分数据库实现中);而DELETE是DML操作,可以按条件删除,且支持事务回滚。这个区别在面试里是高频考点,在实战中则关系到你是否会误删数据。我个人有个习惯:凡是生产环境要执行DDL,必然先在测试库跑一遍,确认锁表时间和影响行数。
2.2 DML(数据操作语言):数据的日常增删改查
DML是Data Manipulation Language,数据操作语言,它处理的是表里的数据本身。四个基础操作就是SELECT、INSERT、UPDATE、DELETE。这里注意,虽然SELECT严格来说有时候会被单独讨论,但在绝大多数面试和实际分类中,它都被归入DML范畴。
DML里最容易出问题的是UPDATE和DELETE不带WHERE条件。有个梗叫“全表更新/删除”,说的就是这种事故。我在带新人时反复强调:写UPDATE和DELETE时,先写SELECT把要影响的数据查出来看一眼,再改成UPDATE或DELETE执行。这个习惯能救命的。另外,大批量DELETE会导致事务日志膨胀、锁竞争剧烈,实际工作中我通常会分批删除,比如每批DELETE ... LIMIT 1000(MySQL)或者DELETE TOP (1000)(SQL Server),循环执行,避免一次性锁住太多数据。
SELECT的学问更深,后面专门讲。这里只说一句:DML的`S
