SQL语言---数据更新

2023-10-30

文章目录


前言

本文主要讲解了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语言—数据的查询

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL语言---数据更新 的相关文章

  • date_sub 对于 mysql 可以,对于 postgresql 可以

    此查询适用于 mySQL 不适用于 Postgresql select from where id and h gt date sub now INTERVAL 30 MINUTE 错误是 Query failed ERREUR erreu
  • 在单个 select 语句中多次有条件地求和同一列?

    我有一个表 显示每个月在给定位置的各种类型的部署的员工部署情况 ID Location ID Date NumEmployees DeploymentType ID 例如 一些记录可能是 1 L1 12 2010 7 1 Permanent
  • MySql 5.7 ORDER BY 子句不在 GROUP BY 子句中并且包含非聚合列

    我试图在不禁用 my ini 中的 only full group by 的情况下弄清楚 这是我的查询 SELECT p title COUNT t qty AS total FROM payments t LEFT JOIN produc
  • PL/pgSQL SELECT 到数组中

    这是我的函数声明和主体的一部分 CREATE OR REPLACE FUNCTION access update RETURNS void AS DECLARE team ids bigint BEGIN SELECT INTO team
  • 有没有办法阻止 SQL Express 2008 空闲?

    我使用 SQL Express 2008 作为 Web 应用程序的后端 问题是 Web 应用程序是在工作时间使用的 因此有时在午餐或休息时间 如果 20 分钟内没有用户登录 SQL Express 将进入空闲状态模式并释放其缓存 我知道这一
  • 不带 GROUP BY 的聚合查询

    这个查询似乎在我的旧机器上完美运行 但是 在我的 MySQL 5 7 14 和 PHP 5 6 25 的新机器上 它会抛出错误 致命错误 未捕获异常 PDOException 并带有消息 SQLSTATE 42000 语法错误或访问冲突 1
  • SQL 中基于下一条记录和上一条记录的复杂排序

    这是一个后续问题根据 SQL 中的下一条记录和上一条记录进行排序 https stackoverflow com questions 30477803 sorting based on next and previous records i
  • SQL Join 列上类似于另一列[重复]

    这个问题在这里已经有答案了 可能的重复 mysql连接查询使用like https stackoverflow com questions 1930809 mysql join query using like 我想要进行连接 其中一列包含
  • SQL Server 2008R2 和创建 XML 文档

    论坛上的第一篇文章 因为我真的被这个问题困住了 以下查询正确地将有效的 XML 文档分配给 xTempXML 变量 类型为 xml 注 文档的长度 转换为varchar max 711 select xTempXML select Pres
  • 实现软删除的最佳方法是什么?

    目前在做一个项目 我们要对大部分用户 用户角色 实现软删除 我们决定添加一个is deleted 0 数据库中每个表的字段并将其设置为 1 如果特定用户角色点击特定记录上的删除按钮 现在为了将来的维护 每个SELECT查询需要确保它们不包含
  • 在存储过程中验证用户的最简单方法?

    我需要一个存储过程 可以通过发送以下内容来检查登录尝试时他们是否是有效用户login and password查看它们在数据库中是否匹配 有没有一种简单的方法可以做到这一点 如果没有更多信息 我目前能提供的最好信息是 CREATE STOR
  • 使用子查询 select 创建新表

    我试图从子查询选择创建一个新表 但出现以下错误 附近的语法不正确 SELECT INTO foo FROM SELECT DATEPART MONTH a InvoiceDate as CalMonth DATEPART YEAR a In
  • 如何从 SQL Server 2008 查询结果中删除“NULL”

    我有一个包含 59 列和超过 17K 行的表 很多行都有NULL在某些列中 我想删除NULL以便查询返回空白 而不是NULL 我可以运行一些更新功能来替换所有NULL with 使用 SQL Server 2008R2 Management
  • SQL 连接两个没有关系的表

    我有具有相同结构的不同表 我想通过其中一列将它们连接起来 问题是他们不共享该专栏中的信息 Table 1 Type A Name Value Table 2 Type B Name Value 结果表 在单列中 nameFromA name
  • SQL查询查找表的主键?

    我怎样才能找到哪一列首要的关键使用查询来创建表 这是重复的question https stackoverflow com questions 893874 mysql determine tables primary key dynami
  • 我不断收到错误“关系 [TABLE] 不存在”

    我一直在尝试查询数据库中的两个表 在服务器资源管理器中 我可以看到两个表 甚至可以看到其中的列 我们将它们称为 Schema table1 和 Schema table2 其中 Schema 的第一个字母大写 我尝试运行以下查询 selec
  • mysql自动存储记录创建时间戳

    mysql 有什么方法可以在创建记录时自动将时间戳存储在记录行中 我试图使用时间戳 数据类型 和 current timestamp 作为默认值 但后来意识到每次更新记录时都会更新 我只需要一些可以存储创建时间戳的东西 Thanks Set
  • SQL 约束以防止根据列的先前值更新列

    是否可以使用检查约束 或其他一些技术 来防止在更新记录时设置与其先前值相矛盾的值 一个例子是 NULL 时间戳 表明发生了某些事情 例如 file exported 一旦文件被导出并且具有非 NULL 值 就不应再将其设置为 NULL 另一
  • 如何通过SQL查询检查是否有JSON函数?

    有SQL 2016 中的 JSON 函数 https learn microsoft com en us sql t sql functions json functions transact sql例如 JSON VALUE JSON Q
  • 是否可以引用同一个表中的不同列?

    如果博客有一个 类别 表 如下所示 CREATE TABLE categories id INTEGER PRIMARY KEY AUTO INCREMENT parent id INTEGER NOT NULL name VARCHAR

随机推荐

  • 如何利用今日头条极速版挣点小钱

    红包 1元现金速撸 红包 下载 今日头条极速版 进入 任务 填邀请码 1386552161 即可立即提现1元到支付宝 每天阅读 睡觉 签到 走路都有钱领
  • C++类和对象——(对象的赋值拷贝构造函数)

    目录 对象的赋值 目录 对象的赋值 1 提出问题 2 解决办法 拷贝构造函数 1 拷贝构造函数的原型 2 调用机制 3 使用例程代码 总代码工程 对象的赋值 1 提出问题 能否使用一个已经构造好的对象去初始化另一个对象 C 编译器又是如何处
  • 明日方舟服务器不稳定,《明日方舟》服务器恢复正常 补偿玩家400玉+40理智

    原标题 明日方舟 服务器恢复正常 补偿玩家400玉 40理智 此前我们曾报道 明日方舟 进不去 登微博热搜 官方表示正在紧急修复 现在 明日方舟 官方表示之前出现的问题已于18 00完成相关修复并已逐步恢复正常 将为受波及的玩家发放400合
  • Java 创建文件,文件夹不存在时,如何创建

    创建文件 String url C Users yz Desktop test new File String format s s s url test txt createNewFile 如果文件夹路径不存在则会报如下错误 正确代码 S
  • C++学习(四八三)无法从“std::pair<const _Kty,_Ty>”转换为“_Objty”

    使用vs2017编译osgEarth2 9的FeatureSourceIndexNode cpp遇到的 使用VS2017编译osgEarth2 7过程中遇到问题总结 justslowdown going的博客 CSDN博客 gt gt xm
  • 去除快捷方式箭头_桌面快捷方式小箭头去除与恢复方法

    电脑桌面的快捷方式图标默认都带有小箭头 不知道是不是自己心情不好 总之越看越不爽 今天我将出一期教程专门对付这个小箭头 去除或者保留 由我做主 去除小箭头方法 方法一 1 在键盘上按 win R 输入 regedit 点击 确定 2 鼠标右
  • WPF 样式 Style 封装

    从上面截图可以看出有三个圆形的 Button 他们的大小和鼠标悬停的效果一样 只是颜色各有不同 所以在实际的开发过程中最好是能够将样式模板封装起来 这样做减少了代码冗余 在开发过程中 如有相同的按钮样式实现直接应用就可以了 后期也利于阅读和
  • samba3.0 详细配置实例

    现在做了部分改动 并添加了mysql虚拟用户 还有补充了samba中批量增加用户的脚本 Samba3 0服务器实战调试 Centos5预装的samba已经是Samba版本3 0 23c 功能已经非常强大了 今天我们调试的重点不是samba3
  • Messari:21年第二季度Web3及NFT报告

    注 原文来自Messari 以下为全文编译 如果今年年初 有人走到我面前说 NFT的销售额将轻松超过10亿美元 GaryVee将推出NFT项目 Axie Infinity将成为五大NFT市场之一 我会回答 我会相信其中之一 但是 过去的一个
  • golang web开发获取get、post、cookie参数

    golang web开发获取get post cookie参数 在成熟的语言java python php要获取这些参数应该来讲都非常简单 过较新的语言golang用获取这些个参数还是费了不少劲 特此记录一下 golang版本 1 3 1
  • chrome浏览器开发者工具network屏蔽网络请求的方法

    在使用开发者工具调试的时候 有的网页有一堆轮询的无关紧要的请求 密密麻麻的影响我们调试 所以我们可以在network面板把他们都屏蔽掉 屏蔽之后 这个请求就不会被发出了 注意 如果这个请求含有重要功能 那么就不建议屏蔽了 要不网页会崩溃 1
  • 远程桌面访问软件:TeamViewer

    TeamViewer介绍 提起远程软件 很多朋友第一个想到的肯定是QQ远程 但是肯定也有朋友会发现 QQ远程用起来并不是那么流畅 今天向大家推荐一款简单 易用 无比流畅的远程软件 TeamViewer 这是一款全球著名的远程软件 很多大公司
  • Keil 逻辑分析 Logic Analyzer 窗口 realview mdk 逻辑分析 窗口 监视 IO 引脚状态

    Keil 逻辑分析 Logic Analyzer 窗口 realview mdk 逻辑分析 窗口 监视 IO 引脚状态 找了好久没找到怎么查看IO引脚的逻辑时序图 帮助里也没有介绍 最后还是让我找到了 哈哈 点菜单 VIEW gt symb
  • Selenium元素定位方法

    前提 必须定位到唯一元素 1 id定位 driver find element by id kw send keys 日历 2 name定位 driver find element by name wd send keys 杰森 3 cla
  • mysql判断日期写法

    mysql判断时间是否是当天 昨天 今天 select count 1 from sign detail where date format create time Y m d date format now Y m d and membe
  • 如何分辨NMOS和PMOS的电路符号

    这个是N沟道增强型MOS管的电路符号 这个是P沟道增强型MOS管的电路符号 有时我们很容易把这两个符号弄混 首先对于单个MOS管而言内部衬底和源极是接在一起的 所以我们看到的MOS管电路符号 源极和衬底是接在一起的 并且这个箭头处的电极为衬
  • 通过RS485进行modbus通讯协议

    一 协议介绍 普通串口挂载485芯片 使用modbus协议来传递信息 modbus 也有ASCII和 RTU之分 这是他们之间的区别 协议 开始标记 结束标记 校验 传输效率 程序处理 ASCII 冒号 CR LF LRC 低 直观 简单
  • 动态贝叶斯网络DBN

    贝叶斯网络 贝叶斯网络 Bayesian Networks 也被称为信念网络 Belif Networks 或者因果网络 Causal Networks 是描述数据变量之间依赖关系的一种图形模式 是一种用来进行推理的模型 贝叶斯网络为人们提
  • 【Android】RxJava+Retrofit+OKHttp3实现数据上传

    依赖引入 Gson implementation com squareup retrofit2 converter gson 2 1 0 OkHttp3 implementation com squareup okhttp3 okhttp
  • SQL语言---数据更新

    文章目录 前言 一 数据更新之插入数据 1 插入单个元组 1 语句格式 2 语法说明 INTO子句 VALUES子句 插入规则 3 举例讲解 例子1 例子2 易犯错误 2 插入子查询结果 1 语句格式 2 语法说明 INTO子句 与插入单条