02-SQL语法精讲:DDL/DML/DQL/DCL 企业级常用语句全攻略

发布时间:2026/10/8 0:32:03

02-SQL语法精讲:DDL/DML/DQL/DCL 企业级常用语句全攻略 SQL语法精讲DDL/DML/DQL/DCL 企业级常用语句全攻略作者黒漂技术佬适用读者刚接触SQL、想系统掌握的同学关联场景无人售货柜、智慧农业监控系统一、SQL四大分类先搞清楚你在写哪类语句SQL语句按功能分四大类很多新手混在一起叫不清这里一张表说清楚分类全称作用常见语句DDLData Definition Language定义结构建表、改表结构CREATE / ALTER / DROPDMLData Manipulation Language操作数据增删改INSERT / UPDATE / DELETEDQLData Query Language查询数据SELECTDCLData Control Language控制权限GRANT / REVOKE记忆技巧DDL管房子结构DML管搬家数据DQL管找东西查询DCL管给钥匙权限。二、DDL数据定义语言2.1 库的操作-- 创建数据库指定字符集中文必选utf8mb4CREATEDATABASEIFNOTEXISTSvending_machineDEFAULTCHARACTERSETutf8mb4DEFAULTCOLLATEutf8mb4_general_ci;-- 查看所有数据库SHOWDATABASES;-- 使用数据库USEvending_machine;-- 删除数据库谨慎DROPDATABASEIFEXISTSvending_machine;为什么用utf8mb4而不是utf8MySQL的utf8最多只支持3字节存不了emoji表情和部分生僻字。utf8mb4才是真正的UTF-8。无人售货柜商品名里如果有特殊字符用utf8可能存进去就乱码了。2.2 表的操作创建一张无人售货柜的订单表CREATETABLEorders(order_idBIGINTPRIMARYKEYAUTO_INCREMENTCOMMENT订单ID,cabinet_idINTNOTNULLCOMMENT售货柜ID,product_idINTNOTNULLCOMMENT商品ID,quantityINTNOTNULLDEFAULT1COMMENT购买数量,unit_priceDECIMAL(8,2)NOTNULLCOMMENT单价,total_amountDECIMAL(10,2)NOTNULLCOMMENT订单总金额,pay_statusTINYINTNOTNULLDEFAULT0COMMENT0未支付 1已支付 2已退款,created_atDATETIMENOTNULLDEFAULTCURRENT_TIMESTAMPCOMMENT下单时间,paid_atDATETIMENULLCOMMENT支付时间,INDEXidx_cabinet(cabinet_id),INDEXidx_product(product_id),INDEXidx_created(created_at))ENGINEInnoDBDEFAULTCHARSETutf8mb4COMMENT无人售货柜订单表;修改表结构-- 新增列ALTERTABLEordersADDCOLUMNrefund_reasonVARCHAR(200)NULLAFTERpay_status;-- 修改列类型ALTERTABLEordersMODIFYCOLUMNrefund_reasonVARCHAR(500)NULL;-- 修改列名ALTERTABLEorders CHANGE refund_reason refund_descVARCHAR(500);-- 删除列ALTERTABLEordersDROPCOLUMNrefund_desc;-- 重命名表ALTERTABLEordersRENAMETOorder_info;-- 删除表危险操作数据全没DROPTABLEIFEXISTSorder_info;企业开发中ALTER TABLE要谨慎——在大表上加索引或改列类型可能导致长时间锁表。生产环境一般用工具如pt-online-schema-change来在线改表。三、DML数据操作语言3.1 INSERT 插入数据-- 插入单条INSERTINTOproduct(product_name,price,category)VALUES(可口可乐,3.50,饮料);-- 插入多条批量插入效率远高于循环单条插入INSERTINTOproduct(product_name,price,category)VALUES(可口可乐,3.50,饮料),(乐事薯片,7.90,零食),(红牛,6.00,饮料),(农夫山泉,2.00,饮料);-- 插入时如果主键冲突则更新UPSERTINSERTINTOproduct(product_id,product_name,price,category)VALUES(1001,可口可乐,3.80,饮料)ONDUPLICATEKEYUPDATEpriceVALUES(price);批量插入比循环单条插入快得多因为每次INSERT都有网络往返和事务开销。1000条数据批量插入可能0.1秒循环单条插入可能要10秒。3.2 UPDATE 更新数据-- 基础更新UPDATEproductSETprice3.80WHEREproduct_id1001;-- 多字段更新UPDATEproductSETprice3.80,category碳酸饮料WHEREproduct_id1001;-- 条件更新所有饮料涨价5%UPDATEproductSETpriceprice*1.05WHEREcategory饮料;永远不要忘了WHERE不带WHERE的UPDATE会更新整张表UPDATE product SET price0;会让所有商品免费——这是新手最容易犯的灾难级错误。建议先SELECT确认范围再UPDATE。3.3 DELETE 删除数据-- 删除指定记录DELETEFROMordersWHEREorder_id9999;-- 条件删除清理30天前的未支付订单DELETEFROMordersWHEREpay_status0ANDcreated_atDATE_SUB(NOW(),INTERVAL30DAY);DELETE vs TRUNCATEDELETE可以带WHERE逐行删除记录日志可回滚TRUNCATE清空整张表不可回滚但速度极快会重置自增ID生产环境清理大量数据时DELETE大批量数据可能锁表过久常配合LIMIT分批删除四、DQL数据查询语言SELECT是SQL中使用频率最高的语句也是花样最多的。4.1 基础查询-- 查询所有字段SELECT*FROMproduct;-- 查询指定字段企业规范禁止SELECT *只查需要的列SELECTproduct_name,priceFROMproduct;-- 去重查询SELECTDISTINCTcategoryFROMproduct;企业规范中禁止SELECT *的原因一是浪费带宽有些字段是TEXT类型很大二是*的列顺序依赖表结构加列后可能导致ORM映射出错。4.2 条件查询 WHERE-- 多条件SELECT*FROMproductWHEREcategory饮料ANDprice5.00;-- IN查询SELECT*FROMproductWHEREcategoryIN(饮料,零食);-- 范围查询SELECT*FROMordersWHEREcreated_atBETWEEN2024-01-01AND2024-01-31;-- 模糊查询SELECT*FROMproductWHEREproduct_nameLIKE%可乐%;4.3 聚合与分组-- 聚合函数SELECTCOUNT(*)AStotal_orders,SUM(total_amount)AStotal_revenue,AVG(total_amount)ASavg_order_amount,MAX(total_amount)ASmax_order,MIN(total_amount)ASmin_orderFROMordersWHEREpay_status1;-- 分组统计每个售货柜的销售额SELECTcabinet_id,COUNT(*)ASorder_count,SUM(total_amount)ASrevenueFROMordersWHEREpay_status1GROUPBYcabinet_id;-- HAVING过滤分组结果WHERE过滤行HAVING过滤组SELECTcabinet_id,COUNT(*)ASorder_countFROMordersWHEREpay_status1GROUPBYcabinet_idHAVINGCOUNT(*)100;-- 只看订单数超过100的柜子WHERE vs HAVINGWHERE在分组前过滤行HAVING在分组后过滤组。记住顺序WHERE → GROUP BY → HAVING。4.4 排序与分页-- 排序SELECT*FROMordersORDERBYcreated_atDESC;-- 降序最新订单在前-- 分页LIMIT偏移量, 数量SELECT*FROMordersORDERBYcreated_atDESCLIMIT0,20;-- 第1页每页20条-- 第2页SELECT*FROMordersORDERBYcreated_atDESCLIMIT20,20;4.5 连接查询 JOINJOIN是关系型数据库的核心能力——把多张表的数据关联起来。-- 查询订单关联的商品信息SELECTo.order_id,o.created_at,p.product_name,p.price,o.quantity,o.total_amountFROMorders oINNERJOINproduct pONo.product_idp.product_idWHEREo.pay_status1ORDERBYo.created_atDESCLIMIT20;-- LEFT JOIN即使没有匹配也保留左表记录SELECTc.cabinet_id,c.location,COUNT(o.order_id)ASorder_countFROMcabinet cLEFTJOINorders oONc.cabinet_ido.cabinet_idGROUPBYc.cabinet_id,c.location;JOIN类型INNER JOIN取交集LEFT JOIN保留左表全部RIGHT JOIN保留右表全部。实际开发中LEFT JOIN用得最多。4.6 子查询-- 查询比平均价格高的商品SELECT*FROMproductWHEREprice(SELECTAVG(price)FROMproduct);-- EXISTS查询有订单的商品SELECT*FROMproduct pWHEREEXISTS(SELECT1FROMorders oWHEREo.product_idp.product_id);4.7 SQL执行顺序重要理解SQL执行顺序对写复杂查询至关重要FROM → JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT注意SELECT在GROUP BY之后才执行所以WHERE里不能用SELECT起的别名。这就是为什么下面这条SQL报错-- 错误WHERE中不能使用SELECT的别名SELECTproduct_name,price*1.05ASnew_priceFROMproductWHEREnew_price5;-- 报错Unknown column new_price-- 正确写法SELECTproduct_name,price*1.05ASnew_priceFROMproductWHEREprice*1.055;五、DCL数据控制语言5.1 创建用户-- 创建用户并指定密码CREATEUSERreport_user%IDENTIFIEDBYSecurePass123!;-- %表示可以从任意IP连接192.168.1.%限制网段更安全CREATEUSERops_user192.168.1.%IDENTIFIEDBYOpsPass456!;5.2 授权 GRANT-- 授予查询权限只读账号给报表系统GRANTSELECTONvending_machine.*TOreport_user%;-- 授予增删改查权限给应用后端账号GRANTSELECT,INSERT,UPDATE,DELETEONvending_machine.*TOops_user192.168.1.%;-- 授予所有权限仅限DBA使用GRANTALLPRIVILEGESON*.*TOadminlocalhost;权限最小化原则给应用账号只授予SELECT/INSERT/UPDATE/DELETE不给DROP/ALTER权限。这样即使应用被注入攻击攻击者也删不了表结构。5.3 撤销权限 REVOKE-- 撤销删除权限REVOKEDELETEONvending_machine.*FROMops_user192.168.1.%;-- 查看用户权限SHOWGRANTSFORops_user192.168.1.%;5.4 刷新与删除用户-- 权限修改后刷新FLUSHPRIVILEGES;-- 删除用户DROPUSERreport_user%;六、企业级SQL编写规范关键词大写SELECT而不是select代码可读性更好禁止SELECT *只查需要的列减少网络传输和内存占用表名用复数或下划线风格orders、cabinet_info全小写下划线必须有注释建表语句的COMMENT字段、复杂SQL的行内注释金额用DECIMAL绝不用FLOAT/DOUBLE存金额INSERT写明字段列表不用INSERT INTO t VALUES (...)省略字段名UPDATE/DELETE必带WHERE最好先SELECT验证范围大结果集必分页LIMIT防止一次性返回过多数据避免SELECT子查询替代JOINJOIN通常比子查询效率更高线上禁止DROP/TRUNCATE删表操作必须走DBA审批流程总结分类核心语句记忆口诀DDLCREATE/ALTER/DROP盖房子、改房子、拆房子DMLINSERT/UPDATE/DELETE搬进、换掉、搬走DQLSELECT找东西DCLGRANT/REVOKE发钥匙、收钥匙四类SQL是数据库操作的基础中的基础。写SQL不难写出规范、高效的SQL需要长期积累。后面几篇会深入索引原理和查询优化帮你从能写SQL进化到写好SQL。
延伸阅读

更多相关文章

2026/10/7 2:35:47

AI编程实战指南:从工具选型到人机协作核心技能

1. 从“玩具”到“工具”:AI编程的认知重塑 最近和不少刚入行的朋友聊天,发现一个挺有意思的现象。很多人一提到“AI编程”,脑子里蹦出来的第一个画面,可能就是对着某个聊天框,输入一句“帮我写个贪吃蛇游戏”&#xf…

2026/10/8 0:32:56

树莓派驱动CRT老电视:数模信号转换与复古终端改造实战

1. 项目缘起:一台被遗忘的“数字相框”电视 最近在整理仓库时,翻出了一台老物件——Elektronika VL-100 “Digital Picture Frame” TV。这玩意儿是上世纪90年代末到21世纪初,东欧地区流行过一阵的“数字相框电视”,本质上是一台集…

2026/10/8 15:26:32

Room数据库版本不一致?从报错原理到迁移实践

1. 走近 Room 报错:错误信息拆分解读先把这个报错完整写出来,很多人拿到崩溃日志只截了一半:Room cannot verify the data integrity. Looks like youve changed schema but forgot to update the version number. You can simply fix this b…

2026/10/8 15:26:32

多核并行优化实战:从Amdahl定律到锁竞争与内存带宽

先说一个我反复遇到的场景:团队换了一台32核的新服务器跑批量计算,结果处理耗时和原来8核机器几乎一样,大家第一反应是机器有问题,第二反应是任务太小没吃满。等我把代码翻出来一看,十几处共享变量加锁,数据…

2026/10/8 15:26:32

MATLAB实现Stacking回归预测:PLS+SVM+BP+RF融合LSBoost实战

做回归预测的朋友应该都见过这类需求:拿到一批数据,要用MATLAB做一个回归模型,要求精度尽可能高,最好还能解释得通。单模型不是不能用,但遇到特征维度高、样本量不大、变量之间存在非线性关系的数据时,PLS不…

2026/10/8 15:26:32

2025 HR SaaS选型攻略:AI能力实测与口碑排名避坑指南

AI 已经不是 HR SaaS 的噱头,而是 2025 年选型时绕不开的硬指标。我最近帮两家企业做人力资源数字化选型,发现一个非常明显的趋势:过去大家比的是模块全不全、薪酬算得准不准,现在比的却是 AI 能力到底能不能落地、能不能真的帮 H…

2026/10/8 15:26:32

DeepSeek Harness桌面端深度解析:插件生态、归档管理与工程化实践

1. 桌面端来了,为什么这件事比想象中重要DeepSeek Harness 出官方桌面端这件事,我第一反应不是“终于不用开浏览器了”,而是“这套工具链终于开始往工程化方向走了”。如果你之前用过命令行版本的 DSH,应该能理解我的感受——它能…

2026/10/8 15:21:28

Agent-Reach:多Agent事件触达与调度框架的设计与实践复盘

作为长期跟AI Agent打交道的人,我一开始做Agent项目大多是“单机版”脚本思路:一个Agent程序负责一个任务,任务跑完就结束。真正让我改变的是接到一个多Agent协作项目——同一套系统里既有客服问答Agent,也有工单分类Agent、知识库…

2026/10/8 10:03:18

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/8 10:03:20

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/8 6:05:44

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 0:02:17

自然数立方等于连续奇数之和:从证明到编程验证

十几年来我一直游走在数学科普和编程教学这两块内容之间,对“看起来像魔法、拆开全是数学”的结论总是格外敏感。最近翻资料时又撞见一句话:任何一个自然数 m 的立方,都可以写成 m 个连续奇数之和。2 的立方等于 3 加 5,3 的立方等…

2026/10/8 0:02:17

C#上位机SSH连接实战:用SSH.NET补齐超时、批量与密钥认证

简介:这是一份基于 C# 开发的 SSH 连接功能半成品工程,原本作为另一个主项目的子功能模块,现独立打包分享。工程采用 WinForms 界面,包含源码、解决方案、安装部署工程、NuGet 依赖包及说明文档,适合正在做远程连接、网…

2026/10/8 0:02:17

Java SpringBoot一体化智能售后系统设计与实现全解析

毕业设计年年做,Java Web 方向的题目翻来覆去就那么几个,但“一体化智能售后系统”这个题,每次看到我都觉得值得认真聊一聊。它不是一个简单 curd 堆出来的管理系统,而是把客户、工单、派单、处理、回访、统计整条链路串起来的一套…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑