DDL:Data Definition Language(数据定义语言)
DML:Data Manipulation Language(数据操作语言)
DQL:Data Query Language(数据查询语言)💡 注意:不同资料中对 DQL 的归类略有差异——有些将
SELECT
归入 DML,但主流教学和数据库厂商(如 Oracle、MySQL 官方文档)常将其单独列为 DQL,因其只读不写,语义和用途显著不同。
🆚 三大类语言核心对比
特性 | DDL | DML | DQL |
---|---|---|---|
全称 | Data Definition Language | Data Manipulation Language | Data Query Language |
用途 | 定义/修改数据库结构(库、表、索引等) | 操作表中的数据(增、删、改) | 查询表中的数据 |
是否修改数据 | ❌ 不操作表数据(只改结构) | ✅ 修改表数据 | ❌ 只读,不修改数据 |
是否自动提交 | ✅ 自动提交事务(不可回滚) | ❌ 通常在事务中,可回滚(InnoDB) | ❌ 无事务影响(只读) |
常见语句 | CREATE , ALTER , DROP , TRUNCATE | INSERT , UPDATE , DELETE | SELECT |
作用对象 | 数据库、表、视图、索引、约束等 | 表中的行(记录) | 表中的行(记录) |
权限要求 | 高(如 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(只查不改)