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语言四大分类的整体框架

分类与核心定位

分类 英文全称 核心定位 电商数据分析师使用频率
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;

避坑提醒

  • DROPTRUNCATE不可逆,执行前务必确认。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,配合各种子句:FROMWHEREGROUP BYHAVINGORDER BYLIMIT等。

电商场景高频使用场景(数据分析师的主战场)

  • 每日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类别,必须熟练掌握。

  • 重点掌握:SELECTWHEREGROUP BYJOIN、子查询、窗口函数。

  • 性能优化:合理使用索引、避免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大促结束后,需要完成以下任务:

  1. 创建临时表存储实时订单数据(DDL)

  2. 将CSV导出的订单明细导入临时表(DML)

  3. 查询各店铺GMV排名(DQL)

  4. 修正错误状态(DML)

  5. 清理临时表(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权限。任何写操作必须通过审批流程。

  • 操作日志 :生产库的UPDATEDELETEDROP应开启审计日志。

  • 数据脱敏:DQL查询结果中如果包含手机号、地址,应脱敏处理后再导出。

结语

SQL四大分类是SQL体系的骨架。DDL定义结构,DML操纵数据,DQL查询分析,DCL控制权限。数据分析师的核心是DQL,但其他三类也要懂,这样才能安全、高效地完成工作。

有问题的评论区留言,我看到会回复。

相关推荐
亮子AI2 小时前
【PostgreSQL】推荐几个PostgreSQL管理工具
数据库·postgresql
AI应用实战 | RE2 小时前
011、向量数据库入门:Embeddings原理与ChromaDB实战
开发语言·数据库·langchain·php
captain3762 小时前
联合查询
数据库
华农DrLai3 小时前
怎么用大模型生成推荐的训练数据?Data Augmentation怎么做?
数据库·人工智能·大模型·nlp·prompt
XDHCOM3 小时前
ORA-31215: DBMS_LDAP PL/SQL无效LDAP修改值,Oracle报错故障修复与远程处理方案,快速解决连接配置难题
数据库·sql·oracle
深蓝电商API3 小时前
Redis在海淘场景下的缓存策略设计
数据库·redis·缓存·海淘
杰克尼3 小时前
redis(day04-达人探店)
数据库·redis·缓存
rockey6273 小时前
AScript动态脚本多语言环境支持
sql·c#·.net·script·eval·function·动态脚本
一叶飘零_sweeeet4 小时前
击穿 MySQL 性能天花板:InnoDB Buffer Pool 核心架构、LRU 优化与生产调优全解
数据库·mysql