文章目录
- 前言
- 一、数据更新之插入数据
- 1.插入单个元组
- (1)语句格式
- (2)语法说明
- INTO子句
- VALUES子句
- 插入规则
- (3)举例讲解
- 例子1:
- 例子2:
- 易犯错误
- 2.插入子查询结果
- (1)语句格式
- (2)语法说明
- INTO子句(与插入单条元组类似)
- 子查询
- 查询规则
- (3)举例讲解
- 例子1:新建一张表存放每部门员工的平均工资。
- 二、数据更新之修改数据
- 1.修改某一个元组的值
- (1)语法格式
- (2)语法说明
- SET子句
- WHERE子句
- 语法规则
- (3)举例讲解
- 例子1:部门调整
- 2.修改多个元组的值
- (1)举例讲解
- 例子1:为员工发放薪金
- 3.带子查询的修改语句
- (1)语法结构
- (2)举例讲解
- 例子1:不知道部门编号的情况下发奖金
- 三、数据更新之删除数据
- 1.删除某一元组的值
- (1)语法格式
- (2)语法说明
- FROM子句
- WHERE子句
- (3)举例讲解
- 例子1:删除离职人员信息
- 2.删除多个元组的值
- (1)举例讲解
- 例子1:解散部门
- 3.带子查询的删除语句
- (1)语法格式
- (2)举例讲解
- 例子1:不知道部门编号的情况下解散部门
- 4.删除的易错点
- (1)违反完整性约束条件
- (2)DELETE不支持CASCADE
- 总结
前言
本文主要讲解了SQL语言中的数据更新的语法,并且举例进行相关知识的说明和讲解。
一、数据更新之插入数据
1.插入单个元组
插入单个元组可以理解为给表插入一行数据
(1)语句格式
功能:将新元组插入指定表中
INSERT
INTO <表名> [(<属性1>[,<属性2>...])]
VALUES (<常量1>[,<常量2>]...);
(2)语法说明
INTO子句
- 指定要插入数据的表名及属性列
- 属性列的顺序可与表定义中的顺序不一致
- 没有指定属性列:表示要插入的是一条完整的元组,且属性列属性与表定义中的顺序一致
- 指定部分属性列:插入的元组在其余属性列上取空值(ORACLE这条不适用)
VALUES子句
- 提供的值必须与INTO子句匹配
– 值的个数
– 值的类型
插入规则
DBMS在执行插入语句时会检查所插元组是否破坏表上已定义的完整性规则
a.实体完整性
b.参照完整性
c.用户定义的完整性
- 对于有NOT NULL约束的属性列是否提供了非空值
- 对于有UNIQUE约束的属性列是否提供了非重复值
- 对于有值域约束的属性列所提供的属性值是否在值域范围内
(3)举例讲解
首先给出目前表的完整性情况:
1、DEPT表有三个字段,分别为DEPTNO、DNAME、LOC
2、其中DEPTNO是主键,不能为空值
3、DNAME和LOC 可以为空值
4、DEPTNO的字符类型是2位整数,DNAME和LOC是字符串
例子1:
插入单个元组进入表:
INSERT
INTO DEPT
VALUES ('50','MARKETING','BEIJING');
结果:
例子2:
目前公司打算组建一个技术部(部门编号为60,部门名称为TECHNOLOGY,部门还没想好落户在哪个城市)。
插入方法1:
INSERT
INTO DEPT
VALUES ('60','TECHNOLOGY','');
插入方法2:
INSERT
INTO DEPT
VALUES ('60','TECHNOLOGY',NULL);
易犯错误
NULL值多了单引号,表示插入的是NULL这个单词,而不是插入的空值
正确代码:
INSERT
INTO DEPT
VALUES ('60','TECHNOLOGY',NULL);
错误代码:
INSERT
INTO DEPT
VALUES ('60','TECHNOLOGY','NULL');
结果会发现错误的代码相当于把NULL当成字符串写入了表中。
2.插入子查询结果
将子查询结果插入到指定表中
(1)语句格式
INSERT
INTO <表名> [(<属性1>[,<属性2>...])]
子查询;
(2)语法说明
INTO子句(与插入单条元组类似)
- 指定要插入数据的表名及属性列
- 属性列的顺序可与表定义中的顺序不一致
- 没有指定属性列:表示要插入的是一条完整的元组
- 指定部分属性列:插入的元组在其余属性列上取空值(ORACLE这条不适用)
子查询
SELECT子句目标列必须与INTO子句匹配
- 值的个数
- 值的类型
查询规则
DBMS在执行插入语句时会检查所插元组是否破坏表上已定义的完整性规则
a.实体完整性
b.参照完整性
c.用户定义的完整性
- 对于有NOT NULL约束的属性列是否提供了非空值
- 对于有UNIQUE约束的属性列是否提供了非重复值
- 对于有值域约束的属性列所提供的属性值是否在值域范围内
(3)举例讲解
例子1:新建一张表存放每部门员工的平均工资。
数据存放在表EMP中:
思路:
- 第一步,先建一张表,表字段DEPTNO、AVGSAL
- 第二步,查询EMP表中的部门平均工资,将查到的值插入新建的表中
CREATE TABLE DEPT_AVGSAL
(
DEPTNO NUMBER(2,0) NOT NULL,
AVGSAL NUMBER(6,2) NOT NULL,
CONSTRAINT DEPT_AVGSAL_PK PRIMARY KEY
(
DEPTNO
)
ENABLE
);
INSERT
INTO DEPT_AVGSAL(DEPTNO,AVGSAL)
SELECT DEPTNO,AVG(SAL)
FROM EMP
GROUP BY DEPTNO;
结果为:
二、数据更新之修改数据
1.修改某一个元组的值
修改指定表中满足WHERE子句条件的元组
(1)语法格式
UPDATE <表名>
SET <列名>=<表达式>[,<列名>=<表达式>]…
[WHERE <条件>];
(2)语法说明
SET子句
指定修改方式
- 要修改的列
- 修改后取值
WHERE子句
指定要修改的元组
- 缺省表示要修改表中的所有元组
语法规则
DBMS在执行修改语句时会检查修改操作是否破坏表上已定义的完整性规则
a.实体完整性
b.主码不允许修改
c.用户定义的完整性
- NOT NULL约束
- UNIQUE约束
- 值域约束
(3)举例讲解
例子1:部门调整
将SMITH的部门调整到MARKETING(部门编号50)
原始表如下:
UPDATE EMP
SET DEPTNO=50
WHERE ENAME='SMITH';
2.修改多个元组的值
语法格式和规则与修改单个元组的值一致,不作赘述
(1)举例讲解
例子1:为员工发放薪金
将所有人工资增加100元,设置RESEARCH部门(假设知道部门编号为20)的员工月奖金为100元
原来数据如下:
分两步操作:
UPDATE EMP
SET SAL=SAL+100;
UPDATE EMP
SET COMM=100
WHERE DEPTNO=20;
结果:
3.带子查询的修改语句
(1)语法结构
UPDATE <表名>
SET <列名>=<表达式>[,<列名>=<表达式>]…
WHERE (子查询);
(2)举例讲解
例子1:不知道部门编号的情况下发奖金
所有数据与之前的例子一致,这里只放代码,不做过多赘述
UPDATE EMP
SET COMM=200
WHERE(
SELECT DEPTNO
FROM EMP
WHERE DNAME='ACCOUNTING'
);
三、数据更新之删除数据
1.删除某一元组的值
删除指定表中满足WHERE子句条件的元组
(1)语法格式
DELETE
FROM <表名>
[WHERE <条件>];
(2)语法说明
FROM子句
指定从哪个表删除
WHERE子句
- 指定要删除的元组所满足的条件
- 缺省表示要修改表中的所有元组
(3)举例讲解
例子1:删除离职人员信息
员工MARTIN离职,需要删除他的基本信息
DELETE
FROM EMP
WHERE ENAME='MARTIN';
2.删除多个元组的值
语法格式和规则与修改单个元组的值一致,不作赘述
(1)举例讲解
例子1:解散部门
公司裁员,解散RESEARCH部门(假设知道部门编号为20),删除RESEARCH部门的所有信息。
DELETE
FROM EMP
WHERE DEPTNO=20;
3.带子查询的删除语句
(1)语法格式
DELETE
FROM <表名>
WHERE (子查询);
(2)举例讲解
例子1:不知道部门编号的情况下解散部门
公司裁员,解散ACCOUNTING部门(假设不知道部门编号),删除ACCOUNTING部门的所有信息。
DELETE
FROM EMP
WHERE(
SELECT DEPTNO
FROM EMP
WHERE DNAME='ACCOUNTING';
)
4.删除的易错点
(1)违反完整性约束条件
(2)DELETE不支持CASCADE
总结
文章的不妥之处请各位读者包涵指正。
了解SQL语言的基础知识可以参考:
SQL语言概述与SQL语言的数据定义SQL语言—数据的查询