环境说明: 数据库:Mysql 5.5 连接软件:Navicat
前言
SQL总结系列目录:
- SQL系列总结(一):DDL(数据定义语言)- Roookie博客 | 记录 · 收纳 · 分享 (wlplove.com)
- SQL系列总结(二):DQL(数据查询语言)- Roookie博客 | 记录 · 收纳 · 分享 (wlplove.com)
- SQL系列总结(三):DML(数据操纵语言) - Roookie博客 | 记录 · 收纳 · 分享 (wlplove.com)
- SQL系列总结(四):DCL(数据控制语言) - Roookie博客 | 记录 · 收纳 · 分享 (wlplove.com)
- SQL系列总结(五):TCL(事务控制语言) - Roookie博客 | 记录 · 收纳 · 分享 (wlplove.com)
数据操纵语言(Data Manipulation Language, DML)是对于数据库中的数据的基本操作。具体操作增、删、改这三种,对应的关键词是:增——INSERT
、删——DELETE
、改——UPDATE
。
在使用数据库的系统开发过程中,对于数据库的基本操作就是“增、删、改、查”,以“CRUD
”(分别为 Create, Read, Update, Delete)来称呼。
准备数据
本篇博客中出现的SQL语句实例基于下面的三张数据表:
{tabs-pane label="学生表"}
Student(Sno,Sname,Ssex,Sage,Sdept)
代码语言:javascript复制-- 创建表:
CREATE TABLE Student(Sno CHAR(6) Primary KEY, -- 学号 主键
Sname VARCHAR(20), -- 名字
Ssex CHAR(2), -- 性别
Sage INT, -- 年龄
Sdept VARCHAR(20) -- 系部
)ENGINE=INNODB DEFAULT CHARSET=utf8;
-- 插入数据:
INSERT INTO Student VALUES('202101','李勇','男',20,'计算机系');
INSERT INTO Student VALUES('202102','刘晨','女',19,'计算机系');
INSERT INTO Student VALUES('202103','王敏','女',18,'数学系');
INSERT INTO Student VALUES('202104','张立','男',18,'信息系');
{/tabs-pane}
{tabs-pane label="课程表"}
Course(Cno,Cname,Cpno,Ccredit)
代码语言:javascript复制-- 创建表:
CREATE TABLE Course(Cno CHAR(1) PRIMARY KEY, -- 课程号 主键
Cname VARCHAR(20), -- 课程名
Cpno CHAR(1), -- 前置学科课程号
Ccredit INT -- 学分
)ENGINE=INNODB DEFAULT CHARSET=utf8;
-- 插入数据:
INSERT INTO Course VALUES('1','数据库','5',4);
INSERT INTO Course VALUES('2','数学','null',2);
INSERT INTO Course VALUES('3','信息系统','1',4);
INSERT INTO Course VALUES('4','操作系统','6',3);
INSERT INTO Course VALUES('5','数据结构','7',4);
INSERT INTO Course VALUES('6','数据处理','',2);
INSERT INTO Course VALUES('7','C语言','6',4);
{/tabs-pane}
{tabs-pane label="学生选课表"}
SC(Sno,Cno,Grade)
代码语言:javascript复制-- 创建表:
CREATE TABLE SC(Sno CHAR(6), -- 学号 主键
Cno CHAR(1), -- 课程号 主键
Grade INT, -- 成绩
PRIMARY key(Sno,Cno) -- 设置表级约束条件
)ENGINE=INNODB DEFAULT CHARSET=utf8;
-- 插入数据:
INSERT INTO SC VALUES('202101','1',92);
INSERT INTO SC VALUES('202101','2',85);
INSERT INTO SC VALUES('202101','3',88);
INSERT INTO SC VALUES('202102','2',90);
INSERT INTO SC VALUES('202102','3',80);
{/tabs-pane}
0x01.插入数据
SQL数据插入语句有两种形式,一种是插入一个元组(即一行数据),另一种是插入子查询结果,子查询结果可以是多个元组(多行数据)。
1.插入元组
为表中所有字段都添加数据:
代码语言:javascript复制INSERT INTO <表名> VALUES(<数据1>,<数据2> ···);
INTO子句
中并没有指明任何属性,表示给所有字段添加值,因此新插入的元组必须在每个属性列上都具有值。VALUE子句
对新元组的各属性列赋值,括号中属性列的次序与CREATE TABLE
中的属性次序一一对应。
例:将一个新学生的全部数据插入到Student表中。(学号:202105,姓名:陈东,性别:男,所在系:信息系,年龄:18) INSERT INTO Student VALUES("202105","陈东","男",18,"信息系");
当在INTO子句
中指明部分属性列名时,表示仅对这几项属性进行赋值:
INSERT INTO <表名> (<属性列1>,<属性列2> ···) VALUES(<数据1>,<数据2> ···);
INTO子句
指出了要在哪些属性上赋值,没有出现的属性类将默认取空值。其中,表定义时说明了NOT NULL的属性列不能取空值,否则会报错VAlUE子句
中属性的顺序可以与CREATE TABLE
中的顺序不一样,但必须与INTO子句
中的属性字段一一对应
例:向选课表中插入一条选课记录 (学号:202103,课程号:1) INSERT INTO SC (Sno,Cno) VALUES('202103','1');
2.插入子查询结果
子查询不仅可以嵌套在SELECT语句
中来构造父查询的条件,也可以嵌套在INSERT语句
中用以生成要插入的批量数据。其语句格式为:
INSERT INTO <表名> (<属性列1>,<属性列2> ···) [子查询语句];
-- 可以理解为在原来查询语句的基础上将VALUE子句变为了子查询语句
0x02.修改数据
1.普通修改
修改操作也称为更新操作,其语句的一般格式为:
代码语言:javascript复制UPDATE <表名> SET <列名>=<表达式>,<列名>=<表达式>··· [WHERE <条件>];
- 其功能是修改指定表中满足
WHERE子句
条件的元组 SET子句
后的等式表示给要修改的属性赋予新值,用于取代原来的属性列值
例:将学生李勇的年龄改为22 UPDATE Student SET Sage='22' WHERE Sname='李勇';
如果省略WHERE子句
,则修改的对象为表中的所有元组
例:将所有的学生的年龄增加一岁 UPDATE Student SET Sage=Sage 1
2.带有子查询的修改语句
子查询也可以嵌套在UPDATE语句
中,用以构造修改的条件。
例:将计算机系全体学生的成绩置零 UPDATE SC SET Grade=0 WHERE Sno IN (SELECT Sno FROM Student WHERE Sdept="计算机系");
0x03.删除数据
1.普通删除
删除语句的一般格式为:
代码语言:javascript复制DELETE FROM <表名> WHERE <条件>;
DELETE
语句执行完之后会返回删除的行数以及WHERE
条件匹配的行数。
例:删除学号为202103的学生记录 DELETE FROM Student WHERE Sno='202103'; 删除学号为202101,202102,202103的学生记录 DELETE FROM Student WHERE Sno IN ('202101','202102','202103');
WHERE子句
可以省略,此时为清空全表数据。请注意是数据的删除,表的结构依然存在。如:
例:删除所有学生的选课记录 DELETE FROM SC;-- 执行结果就是表SC变成了一个空表
2.带有子查询的删除语句
同修改语句,子查询也可以嵌套在DELETE语句
中,用来构造执行删除操作的条件。
例:删除系所有学生的选课记录 DELETE FROM SC WHERE Sno IN (SELECT Sno FROM Student WHERE Sdept='信息系'); 主要参考资料:《数据库系统概论(第5版)》 王珊 萨师煊 编著