📚 DDL / DML / DQL 对比速查表

DDL:Data Definition Language(数据定义语言)
DML:Data Manipulation Language(数据操作语言)
DQL:Data Query Language(数据查询语言)

💡 注意:不同资料中对 DQL 的归类略有差异——有些将 SELECT 归入 DML,但主流教学和数据库厂商(如 Oracle、MySQL 官方文档)常将其单独列为 DQL,因其只读不写,语义和用途显著不同。


🆚 三大类语言核心对比

特性DDLDMLDQL
全称Data Definition LanguageData Manipulation LanguageData Query Language
用途定义/修改数据库结构(库、表、索引等)操作表中的数据(增、删、改)查询表中的数据
是否修改数据❌ 不操作表数据(只改结构)✅ 修改表数据❌ 只读,不修改数据
是否自动提交自动提交事务(不可回滚)❌ 通常在事务中,可回滚(InnoDB)❌ 无事务影响(只读)
常见语句CREATE, ALTER, DROP, TRUNCATEINSERT, UPDATE, DELETESELECT
作用对象数据库、表、视图、索引、约束等表中的行(记录)表中的行(记录)
权限要求高(如 CREATE, DROP 权限)中(如 INSERT, UPDATE 权限)低(通常只需 SELECT 权限)

📌 详细语句分类

1. DDL(数据定义语言)

用于定义或修改数据库对象的结构。

-- 数据库
CREATE DATABASE db_name;
DROP DATABASE db_name;

-- 表
CREATE TABLE users (...);
ALTER TABLE users ADD COLUMN email VARCHAR(100);
DROP TABLE users;

-- 索引
CREATE INDEX idx_name ON users(name);
DROP INDEX idx_name ON users;

-- 视图
CREATE VIEW v_users AS SELECT id, name FROM users;
DROP VIEW v_users;

-- 注意:TRUNCATE 虽清空数据,但属于 DDL(重置表结构,自增ID归零,且自动提交)
TRUNCATE TABLE users;
⚠️ TRUNCATE 是 DDL(不是 DML)!它会删除并重建表,因此不能回滚,且重置自增计数器

2. DML(数据操作语言)

用于对表中的数据进行增、删、改操作。

-- 插入
INSERT INTO users (name, age) VALUES ('Alice', 25);

-- 更新
UPDATE users SET age = 26 WHERE name = 'Alice';

-- 删除
DELETE FROM users WHERE age < 18;

-- 注意:DELETE 是 DML,可回滚;TRUNCATE 是 DDL,不可回滚。
✅ DML 语句在 InnoDB 引擎下支持事务,可通过 ROLLBACK 撤销。

3. DQL(数据查询语言)

用于从数据库中检索数据。

-- 基础查询
SELECT name, age FROM users;

-- 带条件、排序、分组
SELECT dept, COUNT(*) FROM users 
WHERE age > 20 
GROUP BY dept 
ORDER BY COUNT(*) DESC 
LIMIT 10;
🔍 SELECT唯一的 DQL 语句(有时也包含 SHOW,但严格来说 SHOW 属于 MySQL 扩展命令,非标准 SQL)。

🧩 补充说明

问题说明
TRUNCATE 是 DDL 还是 DML?DDL。它会释放存储空间、重置自增ID,且隐式提交事务,无法回滚。
SELECT 属于 DML 吗?传统 ANSI SQL 将 SELECT 归为 DML,但现代实践中常单独列为 DQL,因其无副作用。
事务中能用 DDL 吗?在 MySQL 中,DDL 会隐式提交当前事务,因此不能与 DML 在同一事务中回滚。
哪些操作会自动提交?所有 DDL 语句(如 CREATE, ALTER, DROP, TRUNCATE)都会自动提交。

✅ 快速记忆口诀

Define → DDL(建库建表)
Manipulate → DML(增删改数据)
Query → DQL(只查不改)

添加新评论