SQL 四大语言分类详解:DDL、DML、DCL、DQL

SQL(结构化查询语言)通常被分为四种主要类型,每种类型负责不同的数据库操作。下面我将详细介绍这四类SQL语言的语法和用途。

一、DDL (Data Definition Language) 数据定义语言

功能:定义和管理数据库对象结构(表、视图、索引等)

主要命令:

CREATE - 创建数据库对象

sql 复制代码
-- 创建数据库
CREATE DATABASE school;

-- 创建表
CREATE TABLE students (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(50) NOT NULL,
  age INT CHECK (age > 0),
  class_id INT,
  FOREIGN KEY (class_id) REFERENCES classes(id)
);

-- 创建索引
CREATE INDEX idx_name ON students(name);

-- 创建视图
CREATE VIEW student_view AS
SELECT id, name FROM students WHERE age > 10;

ALTER - 修改数据库对象

sql 复制代码
-- 添加列
ALTER TABLE students ADD COLUMN gender CHAR(1);

-- 修改列类型
ALTER TABLE students MODIFY COLUMN name VARCHAR(100);

-- 删除列
ALTER TABLE students DROP COLUMN gender;

DROP - 删除数据库对象

sql 复制代码
DROP TABLE IF EXISTS temp_students;
DROP VIEW student_view;

TRUNCATE - 清空表数据(保留结构)

sql 复制代码
TRUNCATE TABLE log_data;

二、DML (Data Manipulation Language) 数据操作语言

功能:操作数据库中的数据记录

主要命令:

  1. INSERT - 插入数据
sql 复制代码
-- 插入单条记录
INSERT INTO students (name, age, class_id)
VALUES ('张三', 15, 1);

-- 插入多条记录
INSERT INTO students (name, age, class_id)
VALUES ('李四', 16, 1), 
       ('王五', 14, 2);

-- 从其他表插入数据
INSERT INTO graduate_students
SELECT * FROM students WHERE age > 18;

UPDATE - 更新数据

sql 复制代码
-- 更新单列
UPDATE students SET age = 16 WHERE name = '张三';

-- 更新多列
UPDATE students 
SET age = age + 1, class_id = 3
WHERE id = 5;

-- 使用子查询更新
UPDATE students
SET class_id = (SELECT id FROM classes WHERE name = '高三')
WHERE age > 17;

DELETE - 删除数据

sql 复制代码
-- 删除特定记录
DELETE FROM students WHERE id = 10;

-- 删除所有记录
DELETE FROM temp_students;

-- 使用子查询删除
DELETE FROM students
WHERE class_id IN (SELECT id FROM classes WHERE grade = '毕业班');

MERGE - 合并操作(UPSERT)

sql 复制代码
-- MySQL语法
INSERT INTO students (id, name, age)
VALUES (1, '张三', 15)
ON DUPLICATE KEY UPDATE age = 16;

-- PostgreSQL语法
INSERT INTO students (id, name, age)
VALUES (1, '张三', 15)
ON CONFLICT (id) DO UPDATE SET age = 16;

三、DQL (Data Query Language) 数据查询语言

功能:查询数据库中的数据

主要命令:

  1. SELECT - 查询数据
sql 复制代码
-- 基本查询
SELECT * FROM students;

-- 条件查询
SELECT name, age FROM students WHERE age > 15;

-- 排序
SELECT * FROM students ORDER BY age DESC, name ASC;

-- 分组聚合
SELECT class_id, COUNT(*) as student_count, AVG(age) as avg_age
FROM students
GROUP BY class_id
HAVING COUNT(*) > 5;

-- 连接查询
SELECT s.name, c.class_name
FROM students s
JOIN classes c ON s.class_id = c.id;

-- 子查询
SELECT name FROM students
WHERE class_id IN (SELECT id FROM classes WHERE grade = '高一');

-- 分页查询
SELECT * FROM students LIMIT 10 OFFSET 20;  -- MySQL
SELECT * FROM students OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;  -- SQL标准

WITH (CTE) - 公用表表达式

sql 复制代码
WITH top_students AS (
  SELECT * FROM students ORDER BY score DESC LIMIT 10
)
SELECT * FROM top_students WHERE gender = 'F';

四、DCL (Data Control Language) 数据控制语言

功能:控制数据库访问权限和事务处理

主要命令:

  1. GRANT - 授予权限
sql 复制代码
-- 授予SELECT权限
GRANT SELECT ON students TO user1;

-- 授予所有权限
GRANT ALL PRIVILEGES ON database.* TO 'admin'@'localhost';

-- 授予特定列权限
GRANT SELECT (name, age), UPDATE (age) ON students TO teacher_role;

REVOKE - 撤销权限

sql 复制代码
-- 撤销权限
REVOKE INSERT ON students FROM user2;

-- 撤销所有权限
REVOKE ALL PRIVILEGES ON database.* FROM 'old_admin'@'localhost';

COMMIT - 提交事务

sql 复制代码
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;

ROLLBACK - 回滚事务

sql 复制代码
BEGIN TRANSACTION;
DELETE FROM orders WHERE status = 'pending';
-- 发现错误
ROLLBACK;

SAVEPOINT - 设置保存点

sql 复制代码
BEGIN TRANSACTION;
INSERT INTO log (message) VALUES ('Operation started');
SAVEPOINT sp1;
UPDATE data SET value = 10 WHERE id = 1;
-- 部分回滚
ROLLBACK TO SAVEPOINT sp1;
COMMIT;

五、四种语言对比总结

类别 全称 主要功能 常用命令 特点
DDL Data Definition Language 定义数据结构 CREATE, ALTER, DROP, TRUNCATE 自动提交,不可回滚
DML Data Manipulation Language 操作数据记录 INSERT, UPDATE, DELETE, MERGE 需要显式提交,可回滚
DQL Data Query Language 查询数据 SELECT, WITH 不改变数据,只检索
DCL Data Control Language 权限控制 GRANT, REVOKE, COMMIT, ROLLBACK 管理访问和事务

六、实际应用示例

场景:学生管理系统操作

sql 复制代码
-- DDL: 创建表结构
CREATE TABLE classes (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(50) NOT NULL,
  grade VARCHAR(20)
) ENGINE=InnoDB;

-- DML: 插入班级数据
INSERT INTO classes (name, grade) VALUES 
('一班', '高一'), ('二班', '高一'), ('三班', '高二');

-- DQL: 查询班级信息
SELECT * FROM classes WHERE grade = '高一';

-- DML: 更新班级信息
UPDATE classes SET grade = '高三' WHERE name = '三班';

-- DCL: 创建用户并授权
CREATE USER 'teacher'@'%' IDENTIFIED BY 'password';
GRANT SELECT, UPDATE ON school.students TO 'teacher'@'%';
GRANT SELECT ON school.classes TO 'teacher'@'%';

-- DDL: 添加索引提高查询性能
CREATE INDEX idx_class_grade ON classes(grade);

-- 事务处理示例 (DCL)
BEGIN TRANSACTION;
  -- DML: 转班操作
  UPDATE students SET class_id = 2 WHERE id = 101;
  UPDATE class_stats SET student_count = student_count - 1 WHERE class_id = 1;
  UPDATE class_stats SET student_count = student_count + 1 WHERE class_id = 2;
COMMIT;
相关推荐
老邓计算机毕设1 天前
SSM学生选课系统xvbna(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·学生选课系统·ssm 框架·高校教学管理
枷锁—sha1 天前
【PortSwigger Academy】SQL 注入绕过登录 (Login Bypass)
数据库·sql·学习·安全·网络安全
逍遥德1 天前
PostgreSQL 中唯一约束(UNIQUE CONSTRAINT) 和唯一索引(UNIQUE INDEX) 的核心区别
数据库·sql·postgresql·dba
工业甲酰苯胺1 天前
字符串分割并展开成表格的SQL实现方法
数据库·sql
科技块儿1 天前
IP定位技术:游戏反外挂体系中的精准识别引擎
数据库·tcp/ip·游戏
衫水1 天前
[特殊字符] MySQL 常用指令大全
数据库·mysql·oracle
卓怡学长1 天前
m115乐购游戏商城系统
java·前端·数据库·spring boot·spring·游戏
小句1 天前
SQL中JOIN语法详解 GROUP BY语法详解
数据库·sql
阿杰 AJie1 天前
MySQL 里给表添加索引
数据库·mysql
昊昊该干饭了1 天前
一个真实查询需求如何从表设计走到高效 SQL
数据库·sql