2.7SQL 四大分类:理解与避坑

张开发
2026/4/12 3:44:57 15 分钟阅读

分享文章

2.7SQL 四大分类:理解与避坑
2.7SQL 四大分类理解与避坑开篇为什么SQL语句分四类搞不清会出大问题我刚入行时以为SQL就是SELECT查数据。有一次运营要我把某个店铺的订单金额全部打9折我写了个UPDATE orders SET amount amount * 0.9忘了加WHERE条件把全店几万条订单的金额都改了。财务对账时发现GMV对不上我被叫去喝茶。后来我才知道UPDATE属于DML数据操纵语言和查询用的DQL是两类东西执行前必须确认范围。SQL语句按照功能分为四大类DDL、DML、DQL、DCL。数据分析师最常用的是DQL查询但其他三类在工作中也会遇到。搞不清它们的区别和适用场景轻则写错语句重则造成数据安全事故。这一章帮你建立SQL语言的完整认知框架搞清楚每一类语句什么时候用、怎么用、有什么坑。学习前准备已完成MySQL环境搭建和可视化工具安装准备一份电商订单样例数据可用上一章的orders表。SQL语言四大分类的整体框架分类与核心定位分类英文全称核心定位电商数据分析师使用频率DDLData Definition Language定义数据库结构库、表、索引⭐⭐建表时用DMLData Manipulation Language操纵数据增、删、改⭐⭐⭐导入数据、修正数据DQLData Query Language查询数据取数、分析⭐⭐⭐⭐⭐每天用DCLData Control Language控制权限用户、权限⭐基本不用DBA负责电商数据分析工作中的使用场景DDL新项目启动需要建订单表、用户表表结构变更时添加字段。DML运营导入外部数据、批量修正错误订单状态。DQL日常取数、做报表、活动复盘、用户分析——核心中的核心。DCL通常由DBA或运维负责分析师很少接触但需要了解基础概念。我的踩坑经历我第一次面试时面试官问“DDL和DML有什么区别”我答不上来。后来才明白这是SQL入门的常识题。理解分类能帮你避免写错语句类型比如在查询分析里误用DELETE。DDL数据定义语言详解核心定义与常用语句DDL用于定义或修改数据库对象的结构库、表、视图、索引。常用语句CREATE创建数据库、表、索引ALTER修改表结构加字段、改字段类型DROP删除数据库、表TRUNCATE清空表数据保留结构电商场景高频使用场景新店铺上线创建shop_orders订单表。运营要求订单表增加“发货时间”字段。大促前创建临时表存储实时数据。活动结束后清空临时表。基础语法与实操案例案例1创建订单表CREATE TABLE orders_618 ( order_id VARCHAR(50) PRIMARY KEY COMMENT 订单号, user_id INT NOT NULL COMMENT 用户ID, amount DECIMAL(10,2) NOT NULL COMMENT 金额, order_status TINYINT DEFAULT 1 COMMENT 状态, create_time DATETIME NOT NULL COMMENT 下单时间 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;案例2添加字段ALTER TABLE orders_618 ADD COLUMN delivery_time DATETIME COMMENT 发货时间;案例3清空临时表数据保留结构TRUNCATE TABLE orders_temp;案例4删除测试表DROP TABLE IF EXISTS test_orders;避坑提醒DROP和TRUNCATE不可逆执行前务必确认。TRUNCATE不能回滚在MySQL中默认自动提交。ALTER TABLE加字段时如果表很大会锁表建议在低峰期执行。生产环境不要随意DROP应先RENAME到_old观察一段时间。DML数据操纵语言详解核心定义与常用语句DML用于对表中的数据进行增、删、改。常用语句INSERT插入新数据UPDATE修改已有数据DELETE删除数据电商场景高频使用场景运营从Excel导入历史订单数据INSERT。批量修正错误状态如将“待支付”改为“已取消”。删除测试订单或退款订单。基础语法与实操案例案例1插入单条订单INSERT INTO orders_618 (order_id, user_id, amount, order_status, create_time) VALUES (ORD001, 1001, 299.00, 1, NOW());案例2批量插入从另一张表INSERT INTO orders_backup SELECT * FROM orders WHERE create_time 2024-01-01;案例3更新订单状态UPDATE orders_618 SET order_status 2 WHERE order_id ORD001;案例4删除已取消的订单DELETE FROM orders_618 WHERE order_status 3;避坑提醒重要UPDATE和DELETE必须加WHERE条件否则会操作全表。我当年就犯过这个错。执行前先用SELECT确认范围SELECT * FROM orders_618 WHERE order_status 3; -- 先看要删多少条 DELETE FROM orders_618 WHERE order_status 3; -- 确认无误再执行大批量修改建议分批执行加LIMIT避免锁表过久。线上环境建议开启事务出错了可以ROLLBACKSTART TRANSACTION; UPDATE orders SET amount amount * 0.9 WHERE order_id ORD001; -- 检查结果如果正确则 COMMIT否则 ROLLBACK COMMIT;我的踩坑经历有一次我需要把某个用户的所有订单金额减10元写了UPDATE orders SET amount amount - 10忘了WHERE user_id 123。结果整张表金额都变了幸亏有每小时备份恢复数据花了2小时。从那以后我写任何UPDATE/DELETE都先写WHERE再写语句主体。DQL数据查询语言详解核心定义与常用语句DQL用于从数据库中查询数据。核心语句是SELECT配合各种子句FROM、WHERE、GROUP BY、HAVING、ORDER BY、LIMIT等。电商场景高频使用场景数据分析师的主战场每日GMV统计SELECT SUM(amount) FROM orders WHERE create_time CURDATE()店铺销售排行SELECT shop_name, SUM(amount) FROM orders GROUP BY shop_name用户复购分析SELECT user_id, COUNT(*) FROM orders GROUP BY user_id HAVING COUNT(*) 1活动效果对比SELECT DATE(create_time), SUM(amount) FROM orders WHERE create_time BETWEEN 2025-06-01 AND 2025-06-18 GROUP BY DATE(create_time)基础语法与实操案例案例1查询已支付订单的总额SELECT SUM(amount) AS total_gmv FROM orders_618 WHERE order_status 2;案例2按用户统计订单数和总金额SELECT user_id, COUNT(*) AS order_cnt, SUM(amount) AS total_amount FROM orders_618 WHERE order_status IN (2, 4) GROUP BY user_id ORDER BY total_amount DESC LIMIT 10;案例3多表关联查询订单对应的用户名SELECT o.order_id, u.user_name, o.amount FROM orders_618 o JOIN users u ON o.user_id u.user_id WHERE o.order_status 2;重点学习要求DQL是数据分析师使用频率最高的SQL类别必须熟练掌握。重点掌握SELECT、WHERE、GROUP BY、JOIN、子查询、窗口函数。性能优化合理使用索引、避免SELECT *、大表加LIMIT。避坑提醒生产环境查询必须加LIMIT尤其是SELECT *。我见过有人执行SELECT * FROM orders把数据库内存打爆。日期范围查询注意索引WHERE DATE(create_time) 2025-01-01无法使用索引应改为WHERE create_time 2025-01-01 AND create_time 2025-01-02。不要在查询中使用SELECT DISTINCT除非必要它会增加排序开销。DCL数据控制语言详解核心定义与常用语句DCL用于控制数据库的访问权限。常用语句GRANT授予权限REVOKE收回权限电商场景高频使用场景DBA创建只读账号给数据分析师GRANT SELECT ON trade_db.* TO analyst%撤销某用户的写权限REVOKE INSERT, UPDATE, DELETE ON trade_db.* FROM temp_user%基础语法与实操案例案例1创建只读用户仅用于数据分析-- 创建用户 CREATE USER data_analystlocalhost IDENTIFIED BY strong_password; -- 授予只读权限 GRANT SELECT ON ecommerce_shop.* TO data_analystlocalhost; -- 刷新权限 FLUSH PRIVILEGES;案例2查看当前用户权限SHOW GRANTS FOR data_analystlocalhost;案例3撤销权限REVOKE SELECT ON ecommerce_shop.* FROM data_analystlocalhost;合规避坑提醒数据分析师永远不要有写权限INSERT/UPDATE/DELETE。如果公司给你写权限说明权限管理有问题。密码必须强密码不要用123456。不要使用root账号日常查询应该用只读账号。 电商数据合规提示根据数据安全规范数据分析师应使用只读账号所有查询操作留日志。严禁通过DCL给自己提权。如果确实需要修改数据必须走工单审批流程由DBA执行。综合实操案例618大促订单数据全流程处理中的四大分类应用案例背景某服饰类目店铺618大促结束后需要完成以下任务创建临时表存储实时订单数据DDL将CSV导出的订单明细导入临时表DML查询各店铺GMV排名DQL修正错误状态DML清理临时表DDL分步操作步骤1创建数据库和临时表DDLCREATE DATABASE IF NOT EXISTS promotion_618 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE promotion_618; CREATE TABLE orders_temp ( order_id VARCHAR(50) PRIMARY KEY, shop_name VARCHAR(50) NOT NULL, amount DECIMAL(10,2) NOT NULL, order_status TINYINT DEFAULT 1, create_time DATETIME NOT NULL ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;步骤2导入数据DML - INSERT假设已经从CSV导入可视化工具导入也可以手动插入示例INSERT INTO orders_temp VALUES (ORD001, 女装旗舰店, 299.00, 2, 2025-06-01 10:00:00), (ORD002, 女装旗舰店, 189.00, 1, 2025-06-01 11:00:00), (ORD003, 男装专营店, 599.00, 2, 2025-06-02 09:30:00);步骤3查询各店铺GMVDQLSELECT shop_name, SUM(amount) AS gmv, COUNT(*) AS order_cnt FROM orders_temp WHERE order_status 2 -- 已支付 GROUP BY shop_name ORDER BY gmv DESC;步骤4修正错误状态DML - UPDATE发现ORD002应该是已支付修正UPDATE orders_temp SET order_status 2 WHERE order_id ORD002;步骤5清理临时表DDL - DROP确认数据已归档后DROP TABLE orders_temp;结果验证步骤3查询结果女装旗舰店GMV488元299189男装专营店599元。步骤4执行后再次查询ORD002状态应为2。 电商数据合规提示临时表中如果包含用户手机号等敏感信息使用完后必须DROP不可保留。本案例中的订单数据已脱敏。本章踩坑清单与合规总结四大分类常见踩坑分类常见错误正确做法DDL在生产库执行DROP TABLE先RENAME备份确认无影响再删除DMLUPDATE/DELETE忘记加WHERE先SELECT确认范围再写条件DQLSELECT *无LIMIT加LIMIT 100或只取需要的列DCL使用root账号日常查询申请只读账号权限最小化电商数据合规红线权限分离数据分析师只能拥有SELECT权限。任何写操作必须通过审批流程。操作日志生产库的UPDATE、DELETE、DROP应开启审计日志。数据脱敏DQL查询结果中如果包含手机号、地址应脱敏处理后再导出。结语SQL四大分类是SQL体系的骨架。DDL定义结构DML操纵数据DQL查询分析DCL控制权限。数据分析师的核心是DQL但其他三类也要懂这样才能安全、高效地完成工作。有问题的评论区留言我看到会回复。

更多文章