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语言四大分类的整体框架
分类与核心定位
| 分类 | 英文全称 | 核心定位 | 电商数据分析师使用频率 |
|---|---|---|---|
| DDL | Data Definition Language | 定义数据库结构(库、表、索引) | ⭐⭐(建表时用) |
| DML | Data Manipulation Language | 操纵数据(增、删、改) | ⭐⭐⭐(导入数据、修正数据) |
| DQL | Data Query Language | 查询数据(取数、分析) | ⭐⭐⭐⭐⭐(每天用) |
| DCL | Data Control Language | 控制权限(用户、权限) | ⭐(基本不用,DBA负责) |
电商数据分析工作中的使用场景
-
DDL:新项目启动,需要建订单表、用户表;表结构变更时添加字段。
-
DML:运营导入外部数据、批量修正错误订单状态。
-
DQL :日常取数、做报表、活动复盘、用户分析------核心中的核心。
-
DCL:通常由DBA或运维负责,分析师很少接触,但需要了解基础概念。
我的踩坑经历 :我第一次面试时,面试官问"DDL和DML有什么区别",我答不上来。后来才明白,这是SQL入门的常识题。理解分类能帮你避免写错语句类型 ,比如在查询分析里误用DELETE。
DDL(数据定义语言)详解
核心定义与常用语句
DDL用于定义或修改数据库对象的结构(库、表、视图、索引)。常用语句:
-
CREATE:创建数据库、表、索引 -
ALTER:修改表结构(加字段、改字段类型) -
DROP:删除数据库、表 -
TRUNCATE:清空表数据(保留结构)
电商场景高频使用场景
-
新店铺上线,创建
shop_orders订单表。 -
运营要求订单表增加"发货时间"字段。
-
大促前创建临时表存储实时数据。
-
活动结束后清空临时表。
基础语法与实操案例
案例1:创建订单表
SQL
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 '下单时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
案例2:添加字段
SQL
ALTER TABLE orders_618 ADD COLUMN delivery_time DATETIME COMMENT '发货时间';
案例3:清空临时表数据(保留结构)
SQL
TRUNCATE TABLE orders_temp;
案例4:删除测试表
SQL
DROP TABLE IF EXISTS test_orders;
避坑提醒
-
DROP和TRUNCATE不可逆,执行前务必确认。TRUNCATE不能回滚(在MySQL中默认自动提交)。 -
ALTER TABLE加字段时,如果表很大,会锁表,建议在低峰期执行。 -
生产环境不要随意
DROP,应先RENAME到_old观察一段时间。
DML(数据操纵语言)详解
核心定义与常用语句
DML用于对表中的数据进行增、删、改。常用语句:
-
INSERT:插入新数据 -
UPDATE:修改已有数据 -
DELETE:删除数据
电商场景高频使用场景
-
运营从Excel导入历史订单数据(
INSERT)。 -
批量修正错误状态(如将"待支付"改为"已取消")。
-
删除测试订单或退款订单。
基础语法与实操案例
案例1:插入单条订单
SQL
INSERT INTO orders_618 (order_id, user_id, amount, order_status, create_time)
VALUES ('ORD001', 1001, 299.00, 1, NOW());
案例2:批量插入(从另一张表)
SQL
INSERT INTO orders_backup SELECT * FROM orders WHERE create_time < '2024-01-01';
案例3:更新订单状态
SQL
UPDATE orders_618 SET order_status = 2 WHERE order_id = 'ORD001';
案例4:删除已取消的订单
SQL
DELETE FROM orders_618 WHERE order_status = 3;
避坑提醒(重要)
-
UPDATE和DELETE必须加WHERE条件,否则会操作全表。我当年就犯过这个错。
-
执行前先用
SELECT确认范围:
SQL
SELECT * FROM orders_618 WHERE order_status = 3; -- 先看要删多少条
DELETE FROM orders_618 WHERE order_status = 3; -- 确认无误再执行
-
大批量修改建议分批执行(加
LIMIT),避免锁表过久。 -
线上环境建议开启事务,出错了可以
ROLLBACK:
SQL
START 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:查询已支付订单的总额
SQL
SELECT SUM(amount) AS total_gmv
FROM orders_618
WHERE order_status = 2;
案例2:按用户统计订单数和总金额
SQL
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:多表关联查询订单对应的用户名
SQL
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:创建只读用户(仅用于数据分析)
SQL
-- 创建用户
CREATE USER 'data_analyst'@'localhost' IDENTIFIED BY 'strong_password';
-- 授予只读权限
GRANT SELECT ON ecommerce_shop.* TO 'data_analyst'@'localhost';
-- 刷新权限
FLUSH PRIVILEGES;
案例2:查看当前用户权限
SQL
SHOW GRANTS FOR 'data_analyst'@'localhost';
案例3:撤销权限
SQL
REVOKE SELECT ON ecommerce_shop.* FROM 'data_analyst'@'localhost';
合规避坑提醒
-
数据分析师永远不要有写权限(INSERT/UPDATE/DELETE)。如果公司给你写权限,说明权限管理有问题。
-
密码必须强密码,不要用
123456。 -
不要使用
root账号日常查询,应该用只读账号。
📌 电商数据合规提示:根据数据安全规范,数据分析师应使用只读账号,所有查询操作留日志。严禁通过DCL给自己提权。如果确实需要修改数据,必须走工单审批流程,由DBA执行。
综合实操案例:618大促订单数据全流程处理中的四大分类应用
案例背景
某服饰类目店铺618大促结束后,需要完成以下任务:
-
创建临时表存储实时订单数据(DDL)
-
将CSV导出的订单明细导入临时表(DML)
-
查询各店铺GMV排名(DQL)
-
修正错误状态(DML)
-
清理临时表(DDL)
分步操作
步骤1:创建数据库和临时表(DDL)
SQL
CREATE 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
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
步骤2:导入数据(DML - INSERT)
假设已经从CSV导入(可视化工具导入),也可以手动插入示例:
SQL
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:查询各店铺GMV(DQL)
SQL
SELECT
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应该是已支付,修正:
SQL
UPDATE orders_temp SET order_status = 2 WHERE order_id = 'ORD002';
步骤5:清理临时表(DDL - DROP)
确认数据已归档后:
SQL
DROP TABLE orders_temp;
结果验证
-
步骤3查询结果:女装旗舰店GMV=488元(299+189),男装专营店599元。
-
步骤4执行后再次查询ORD002状态应为2。
📌 电商数据合规提示 :临时表中如果包含用户手机号等敏感信息,使用完后必须DROP,不可保留。本案例中的订单数据已脱敏。
本章踩坑清单与合规总结
四大分类常见踩坑
| 分类 | 常见错误 | 正确做法 |
|---|---|---|
| DDL | 在生产库执行DROP TABLE |
先RENAME备份,确认无影响再删除 |
| DML | UPDATE/DELETE忘记加WHERE |
先SELECT确认范围,再写条件 |
| DQL | SELECT *无LIMIT |
加LIMIT 100,或只取需要的列 |
| DCL | 使用root账号日常查询 | 申请只读账号,权限最小化 |
电商数据合规红线
-
权限分离 :数据分析师只能拥有
SELECT权限。任何写操作必须通过审批流程。 -
操作日志 :生产库的
UPDATE、DELETE、DROP应开启审计日志。 -
数据脱敏:DQL查询结果中如果包含手机号、地址,应脱敏处理后再导出。
结语
SQL四大分类是SQL体系的骨架。DDL定义结构,DML操纵数据,DQL查询分析,DCL控制权限。数据分析师的核心是DQL,但其他三类也要懂,这样才能安全、高效地完成工作。
有问题的评论区留言,我看到会回复。