it编程 > 数据库 > MsSqlserver

SQL 四大语言分类中DDL、DML、DCL、DQL的使用

44人参与 2025-08-04 MsSqlserver

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) 数据操作语言

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

主要命令:

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

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

主要命令:

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) 数据控制语言

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

主要命令:

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;

到此这篇关于sql 四大语言分类中ddl、dml、dcl、dql的使用的文章就介绍到这了,更多相关sql ddl dml dcl dql内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网! 

(0)

您想发表意见!!点此发布评论

推荐阅读

Oracle迁移PostgreSQL隐式类型转换配置指南

08-03

从基础语法到最佳实践详解SQL分页查询完整指南

07-30

PostgreSQL 行列转换的实现方法

07-30

SQLServer中生成雪花ID(Snowflake ID)的实现方法

08-08

SQL Server数据库日志文件收缩的实现示例

07-30

SQL中两列合并为一列的技巧总结(推荐!)

08-09

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论