SQL系列总结(三):DML(数据操纵语言)

2023-07-01 15:52:16 浏览数 (2)

环境说明: 数据库: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子句中指明部分属性列名时,表示仅对这几项属性进行赋值:

代码语言:javascript复制
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语句中用以生成要插入的批量数据。其语句格式为:

代码语言:javascript复制
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版)》 王珊 萨师煊 编著

0 人点赞