当前位置: 首页 > news >正文

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

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

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

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

主要命令:

CREATE - 创建数据库对象

-- 创建数据库
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 - 修改数据库对象

-- 添加列
ALTER TABLE students ADD COLUMN gender CHAR(1);-- 修改列类型
ALTER TABLE students MODIFY COLUMN name VARCHAR(100);-- 删除列
ALTER TABLE students DROP COLUMN gender;

DROP - 删除数据库对象

DROP TABLE IF EXISTS temp_students;
DROP VIEW student_view;

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

TRUNCATE TABLE log_data;

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

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

主要命令:

  1. INSERT - 插入数据

-- 插入单条记录
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 - 更新数据

-- 更新单列
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 - 删除数据

-- 删除特定记录
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)

-- 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 - 查询数据

-- 基本查询
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) - 公用表表达式

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 - 授予权限

-- 授予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 - 撤销权限

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

COMMIT - 提交事务

BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;

ROLLBACK - 回滚事务

BEGIN TRANSACTION;
DELETE FROM orders WHERE status = 'pending';
-- 发现错误
ROLLBACK;

SAVEPOINT - 设置保存点

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

五、四种语言对比总结

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

六、实际应用示例

场景:学生管理系统操作

-- 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;

http://www.lryc.cn/news/608322.html

相关文章:

  • 分布在内侧内嗅皮层的层Ⅱ或层Ⅲ的头部方向细胞(head direction cells)对NLP中的深层语义分析的积极影响和启示
  • 智能制造——解读CMMM评估手册【附全文阅读】
  • MyBatis 批量操作 XML 实现方式
  • 信创应用服务器TongWeb安装教程、前后端分离应用部署全流程
  • 元宇宙重构未来交通新图景
  • linux source命令使用详细介绍
  • 空间平面旋转与xoy平行
  • Node.js中path模块的使用指南
  • QT中使用OpenCV保姆级教程
  • 1分钟临时共享空间在线小工具实现
  • 安卓自动点击器:设置点击周期 / 滑动,抢票、游戏刷日常秒会
  • 2025牛客多校第六场 D.漂亮矩阵 K.最大gcd C.栈 L.最小括号串 个人题解
  • C++入门基础(三):const引用、指针和引用的关系、inline(修饰内联函数)替代宏、nullptr代替null
  • Rust进阶-part1-智能指针概述-box指针
  • Java中Lambda 表达式的解释
  • 机器学习实战:KNN算法全解析 - 从原理到创新应用
  • 机器学习消融实验:方法论演进、跨领域应用与前沿趋势
  • 大模型(五)MOSS-TTSD学习
  • 【MATLAB】(四)函数运算
  • 【MATLAB】(五)向量
  • C语言第八章指针一
  • MybatisPlus生成代码
  • MQTT协议测试环境部署
  • MybatisPlus-自动生成代码
  • 洛谷刷题8.2
  • 【AI学习】RadioDiff:代码学习
  • 福彩双色球第2025088期篮球号码分析
  • Leetcode-141.环形链表
  • 面试-python单例模式实现
  • 谈谈WebAssembly、PWA、Web Workers的作用和场景