SQL 语句继续学习之记录三

一,数据的插入(insert 语句的使用方法)

使用insert语句可以向表中插入数据(行)。原则上,insert语句每次执行一行数据的插入。

列名和值用逗号隔开,分别扩在()内,这种形式称为清单。

对表中所有列进行insert 操作时可以省略表名后的列清单。

插入null时需要在values子句的值清单中写入null。

可以为表中的列设定默认值(初始值)。默认值可以通过在create table语句中,为列设置default约束来设定。

插入默认值可以通过两种方式实现。即在insert语句的values子句中指定default关键字(显示方法),或省略列清单(隐式方法)。

使用 insert ...select 可以从其他表中复制数据。

1,什么是insert

通过create table 语句创建出来的表,可以将其比作一个空空如也的箱子,只有把数据装入到箱子中,它才能被称为数据库。

为了学习insert语句,我们创建一张新表,除了为hanbai_tanka 列(销售单价)设置了Default ) 的约束外,其他与之前的完全相同。

如上,仅仅创建了一张空表,还没有插入数据

2,insert 语句的基本语法

INSERT into <表名> (列1,列2,列3,...) values (值1,值2,值3,...);

 由于shohin_id, shohin_mei,shohin_bunrui 列是字符型,所以插入的数据需要加单引号,torokubi是日期类型,也需要加单引号。

列清单—— (shohin_id,shohin_mei,shohin_bunrui,hanbai_tanka,shiire_tanka,torokubi)

值清单——('0001','T恤衫','衣服',1000,500,'2009-09-20')

注意,值清单中列的个数需和列清单中列的数量一致,否则语句错误。

并且,原则上,执行一次insert语句会插入一行数据。因此,插入多行时,通常需要循环执行所需次数的insert语句。但是关于多行insert,在部份DBMS中,支持如下多行insert 语句

insert into shoinIns values 
('0002','打孔器','办公用品',500,320,'2009-09-11'),
('0003','运动T恤','衣服',4000,2800,null),
('0004','菜刀','厨房用具',3000,2800,'2009-09-20');

如上,对表进行全列insert时,可以省略表名后的列清单。这时values子句的值会默认按照从左到右的顺序赋给每一列。

3,插入null

insert into shoinIns values 
('0003','运动T恤','衣服',4000,2800,null),

如上介绍中,insert语句中想要给某一列赋予null值时,可以直接在values子句的值清单中写入null,但是想要插入null的列一定不能设置not null 约束。

4,插入默认值

可以向表中插入默认值(初始值)。默认值的设定,可以通过在创建表的create table语句中设置default约束来实现。本次创建表语句时,

create table shoinIns
(shohin_id CHAR(4) not null,
shohin_mei VARCHAR(100) not null,
shohin_bunrui VARCHAR(32) not null,
hanbai_tanka INTEGER DEFAULT 0,
shiire_tanka INTEGER ,
torokubi DATE ,
primary key (shohin_id));

其中hanbai_tanka integer Default 0, 意思就是为hanbai_tanka 列设置了0 这样的默认值,如果插入一行数据,在不提供值或者提供default值时,该值即为 0 。

有2中方式插入默认值,称为显示插入默认值或者隐式插入默认值。

1)显示插入默认值示例如下

Insert into shoinIns (shohin_id,shohin_mei,shohin_bunrui,hanbai_tanka,shiire_tanka,torokubi)
values ('0007','切菜板','厨房用具',DEFAULT,790,'2009-04-28');

上述Default 即为创建表时设置的 0,

2) 通过隐式方法插入默认值

插入默认值时可以不使用default关键字,只要在列清单和values 中省略设定了默认值的列即可

Insert into shoinIns (shohin_id,shohin_mei,shohin_bunrui,shiire_tanka,torokubi)
values ('0007','切菜板','厨房用具',790,'2009-04-28');

 但是注意,如果省略了没有设定默认值的列的话,该列的值就会被设定为null。如果省略的是设置了not null 约束列的话,insert语句就会出错。

如果设定默认值的列名被省略,就会自动设定为该列的默认值

如果没有设置默认值的列名被省略,就会自动设定为null

3) 从其他表中复制数据

除了使用values 子句指定具体的数据插入数据外,还可以从其他表中复制数据。如下示例

先创建一张表ShohinCopy表,表结构和shohin表完全一样

create table ShohinCopy
(shohin_id CHAR(4) not null,
shohin_mei VARCHAR(100) not null,
shohin_bunrui VARCHAR(32) not null,
hanbai_tanka INTEGER ,
shiire_tanka INTEGER ,
torokubi DATE ,
primary key (shohin_id));
INSERT INTO ShohinCopy (shohin_id,shohin_mei,shohin_bunrui,hanbai_tanka,shiire_tanka,torokubi)
select shohin_id,shohin_mei,shohin_bunrui,hanbai_tanka,shiire_tanka,torokubi from shohin;SELECT * from ShohinCopy;

insert ...select 常用于数据备份

b insert 中多种多样的select

执行insert... select 时,select语句除了select... from ..外,还可以带其他的where, group by 等子句,之前学些到的select语句都可以使用。例如下面我们尝试将含有group by 的select 语句进行insert

创建ShohinBunrui 表的create table 语句

-- 创建ShohinBunrui 表的create table 语句
-- 用来汇总商品种类的表
create table ShohinBunrui
(shohin_bunrui varchar(32) not null,
sum_hanbai_tanka integer,
sum_shiire_tanka integer,
primary key (shohin_bunrui));

该表是用来存储根据商品种类(shohin_bunrui) 计算出销售单价合计值以及进货单价合计值的表。我们从shohin表中取出数据放入该表中

INSERT into ShohinBunrui (shohin_bunrui,sum_hanbai_tanka,sum_shiire_tanka)
select shohin_bunrui,SUM(hanbai_tanka),SUM(shiire_tanka)
from shohin
group by shohin_bunrui;

二、数据的删除(delete 语句的使用方法)

如果想将整个表全部删除,可以使用drop table 语句;

如果只想删除表中全部数据,需使用delete 语句

如果想删除部份数据行,只需在where子句中书写对象数据的条件即可。

通过where子句指定删除对象的delete语句称为搜索型delete语句。

1,drop table 语句和delete语句

1)drop table 语句可以将表完全删除;

2)delete table 语句会留下表(容器),而删除表中的全部数据;

语法

1)drop table <表名>;

2)delete from <表名>;

2, 指定删除对象的delete 语句(搜索型delete)

想要删除表中部份数据行时,可以像使用where子句指定删除条件。指定了删除条件的delete语句称为搜索型delete。

删除部份数据行的搜索型delete语句语法

delete from <表名>
where <条件>;

示例:假设我们要删除商品复制表中销售单价(hanbai_tanka) 大于等于4000的记录,即删除如下标记记录

delete from ShohinCopy
where hanbai_tanka >= 4000;

再次查询数据,结果即

千万需要注意的是,删除表中数据时(delete 语句),只能使用where 子句,不能使用其他的例如group by, having, order by 等子句,由于delete是对表中原始数据进行处理,group by,having是用来抽取数据时进行展示限定,order by 也是对从表中抽取数据后进行处理,所以这些句子都不能参与到delete 语句中

三,数据的更新(update 语句的使用方法)

使用update语句可以更新表中的数据

更新部份数据行时可以使用where来指定更新对象的条件。通过where子句指定更新对象的update语句称为搜索型update语句

update 语句可以将列的值更新为null

同时更新多列时,可以在update语句的set子句中,使用逗号分隔更新对象的多个列

1,update 语句的基本语法

update <表名>
set <列名> = <表达式>;

示例,我们把商品(shohin )表中torokubi列(登记日期)的所有数据统一更新为“2009-10-10”

update shohin
set torokubi = '2009-10-10';

2, 通常情况,很少会直接将某列全部行数据更新为某个特定值,更多的是找到某一行或者某几行数据进行更新,此时就需要用到where 语句,类似delete语句中使用where指定条件一样。

示例,我们将商品表中厨房用具的销售单价更新为原来的10 倍,参考如下代码

update shohin 
set hanbai_tanka = hanbai_tanka * 10
where shohin_bunrui = '厨房用具';

3, 使用null进行更新

使用update 也可以将列更新为null(改更新俗称为null清空),此时只需要将赋值表达式右边的值直接写为null即可

示例:我们将商品编号(shohin_id) 为0008 的数据(圆珠笔)的登记日期(torokubi) 更新为null,

update shohin 
set torokubi = NULL 
where shohin_id = '0008';

注意:使用update 语句可以将值清空为null(但只限于未设置not null 约束的列)

4,多列更新

update 语句的set 语句支持同时将多个列作为更新对象。例如,我们刚将销售单价更新为原来的10 倍,如果我们希望同时将进货单价更新为原来的一半,可以考虑如下方案,

方案一, 将两个要求分两次完成,第一次只修改销售单价,第二次只修改进货单价;

方案二, 通过一个update 语句,将两个需求同时完成,此处有2种写法,但是由于一种方法并非所有DBMS支持,我们仅介绍一种所有DBMS都支持的方案实现,示例如下

UPDATE shohin 
set hanbai_tanka = hanbai_tanka * 10,shiire_tanka = shiire_tanka / 2
where shohin_bunrui = '厨房用具';

四,事务

1,什么是事务

在RDBMS中,事务代表了对表中数据进行更新的单位。简单来说,事务就是需要在同一个处理单元中执行的一系列更新处理的集合。

对表进行更新需要使用insert,update, delete 三种语句。但通常情况下,更新处理并不是执行一次就结束了,而是需要执行一系列连续的操作。这时,事务的价值就要体现了。

最常见的示例就是,转账操作,转账操作意味着要两个操作,一个账户减少金额,另一个增加金额,这两个操作要全部完成,才意味着转账成功。转账就可以作为一个事务来看待。

2,创建事务

如果想在DBMS中创建事务,可以按照如下语法结构编写sql语句

事务开始语句,

DML 语句;

DML语句;

DML语句;

事务结束语句(commit 或者rollback);

使用事务开始语句和事务结束语句,将一系列DML语句(insert/update/delete语句)括起来,就实现了一个事务处理。

注意:在标准sql中并没有定义事务的开始语句,而是由各个DBMS自己来定义的。

mysql 的事务开始语句是start transaction

sql server 和postgreSQL 的开始语句是begin transaction

oracle 和DB2 没有开始语句

示例,假如我们将运动T恤的销售单价降低1000元,将T恤的销售单价上调1000 元,

将上述操作放在一个事务中处理,以mysql示例是

start transaction;-- 将运动T恤的销售单价降低1000
update shohin 
set hanbai_tanka = hanbai_tanka - 1000
where shohin_mei = '运动T恤';-- 将T恤的销售单价上浮1000
update shohin 
set hanbai_tanka = hanbai_tanka + 1000
where shohin_mei = 'T恤衫';commit;

在postgreSql 和sql Server 中,示例如下

Begin transaction;-- 将运动T恤的销售单价降低1000
update shohin 
set hanbai_tanka = hanbai_tanka - 1000
where shohin_mei = '运动T恤';-- 将T恤的销售单价上浮1000
update shohin 
set hanbai_tanka = hanbai_tanka + 1000
where shohin_mei = 'T恤衫';commit;

3,commit 提交处理

commit 是提交事务包含的全部更新处理的结束指令。相当于文件处理中的覆盖保存。一旦提交,就无法恢复到事务开始前的状态了。因此,在提交之前一定要确认是否真的需要进行这些更新。

万一由于误操作提交了包含错误更新的事务,就只能重新回到重新建表、重新插入数据这样繁琐的老路上了。由于可能会造成数据无法恢复的后果,请大家一定要注意。

4,rollback——取消处理

rollback 是取消事务包含的全部更新处理的结束指令。想当于文件处理中的放弃保存。一旦回滚,数据库就会恢复到事务开始之前的状态。通常回滚并不会像提交那样造成打鬼吗的数据损失。

如下, 表中的数据不会发生任何更新,因为事务未被提交,直接被回滚了

start transaction;-- 将运动T恤的销售单价降低1000
update shohin 
set hanbai_tanka = hanbai_tanka - 1000
where shohin_mei = '运动T恤';-- 将T恤的销售单价上浮1000
update shohin 
set hanbai_tanka = hanbai_tanka + 1000
where shohin_mei = 'T恤衫';rollback;

5,事务处理何时开始

几乎所有的数据库产品的事务都无需开始指令。这是因为大部分情况下,事务在数据库连接建立时就已经悄悄开始了,并不需要用户再明确发出开始指令。例如,oracle 数据库连接建立之后,第一条sql 语句执行的同时,事务就已经开始了。像这样不使用指令而悄悄开始事务的情况下,应该如何区分各个事务呢?通常会有如下两种情况。

A:每条sql语句就是一个事务(自动提交模式);

B: 直到用户执行commit或者rollback为止算做一个事务。

在默认使用B模式的oracle中,事务都是直到用户自己执行提交或者回滚指令才会结束。

自动提交的情况需要特别注意的是delete语句。如果不是自动提交,即使使用delete语句删除了数据表,也可以通过rollback命令取消该事务的处理,恢复表中的数据。但这仅限于明示开始事务,或者关闭自动提交的情况,如果不小心在自动模式下执行了delete操作,即使再回滚也无济于事了。

6, ACID 特性

DBMS的事务都遵循四种标准规格的约定。将这四种特性的首字母结合起来统称为ACID特性。这些约定是所有DBMS都必须遵守的规则。这些约定是所有DBMS都必须遵守的规则。

1)原子性(Atomicity)

原子性是指在事务结束时,其中所包含的更新处理要么全部执行,要么完全不执行的特性。例如前面示例中,运动T恤价格降低,T恤价格价格上涨,如果放在一个事务中处理,必须遵守运动T恤价格降低,T恤价格上涨这两个事情全部完成,或者这两个商品价格都不变。不可能出现运动T恤价格改变(commit),但是T恤价格没有变动(rollback)的情况。

2)一致性(Consistency)

一致性指的是事务中包含的处理,要满足数据库提前设置的约束,如主键约束或者not null 约束等。例如,设置了not null 约束的列是不能更新为null的,试图插入违反主键约束的记录就会出错,无法执行,对事务来说,这些不合法的sql会被回滚。也就是说这些sql处理会被取消,不会执行。

一致性也称为完整性。

3) 隔离性(Isolation)

隔离性指的是保证不同事务之间互不干扰的特性。该特性保证了事务之间不会互相嵌套。此外,在某个事务中进行的更改,在该事务结束之前,对其他事务而言是不可见的。因此,即使某个事务向表中添加了记录,在没有提交之前,其他事务是看不到新添加的记录的。

4)持久性(Durability)

持久性也可以称为耐久性,指的是事务(不论是提交还是会滚)一旦结束,DBMS会保证该时点的数据状态得以保存的稳定性。即使由于系统故障导致数据丢失,数据库也一定能通过某种手段进行恢复。

如果不能保证持久性,即使是正常提交结束的事务,一旦发生了系统故障,就会导致数据丢失,一切都需要从头再来的后果。

保证持久性的方法根据实现的不同而不同,其中最常见的就是将事务的执行记录保存到硬盘等存储介质中(该执行记录称为日志)。当发生故障时,可以通过日志恢复到故障发生前的状态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/67998.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用Python和正则表达式处理XML表单数据

在日常的Web开发中&#xff0c;处理表单数据是一个常见的任务。而XML是一种常用的数据格式&#xff0c;用于在不同的系统之间传递和存储数据。本文通过阐述一个技术问题并给出解答的方式&#xff0c;介绍如何使用Python和正则表达式处理XML表单数据。我们将探讨整体设计、编写思…

VB6.0 设置窗体的默认焦点位置在 TextBox 中

文章目录 VB6.0 窗体的加载过程确定指针的焦点位置添加代码效果如下未设置指定焦点已设置焦点 VB6.0 窗体的加载过程 在VB6.0中&#xff0c;窗体&#xff08;Form&#xff09;加载时会触发多个事件&#xff0c;这些事件按照特定的顺序执行。下面是窗体加载过程中常见事件的执行…

基于ETLCloud的自定义规则调用第三方jar包实现繁体中文转为简体中文

背景 前面曾体验过通过零代码、可视化、拖拉拽的方式快速完成了从 MySQL 到 ClickHouse 的数据迁移&#xff0c;但是在实际生产环境&#xff0c;我们在迁移到目标库之前还需要做一些过滤和转换工作&#xff1b;比如&#xff0c;在诗词数据迁移后&#xff0c;发现原来 MySQL 中…

常见路由跳转的几种方式

常见的路由跳转有以下四种&#xff1a; 1. <router-link to"跳转路径"> /* 不带参数 */ <router-link :to"{name:home}"> <router-link :to"{path:/home}"> // 更建议用name // router-link链接中&#xff0c;带/ 表示从根…

elementUI可拖拉宽度抽屉

1&#xff0c;需求&#xff1a; 在elementUI的抽屉基础上&#xff0c;添加可拖动侧边栏宽度的功能&#xff0c;实现效果如下&#xff1a; 2&#xff0c;在原组件上添加自定义命令 <el-drawer v-drawerDrag"left" :visible.sync"drawerVisible" direc…

Unity 顶点vertices,uv,与图片贴图,与mesh

mesh就是组成3d物体的三角形们。 mesh由顶点组成的三角形组成&#xff0c;三角形的大小 并不 需要一样&#xff0c;由顶点之间的位置决定。 mesh可以是一个或者多个面。 贴图的原点在左下角&#xff0c;uv是贴图的坐标&#xff0c;数量和顶点数一样&#xff08;不是100%确定…

Vue3 el-tooltip 根据内容控制宽度大小换行和并且内容太短不显示

el-tooltip 根据长度自适应换行以及显隐 环境 vue: "3.2.37" element-ui: "2.1.8"要求 tooltip 根据内容自动换行如果内容超出显示省略号显示&#xff0c;不超出不显示 tooltip 代码 组件 // ContentTip 组件 <template><el-tooltipv-bind&qu…

【数学建模竞赛】超详细Matlab二维三维图形绘制

二维图像绘制 绘制曲线图 g 是表示绿色 b--o是表示蓝色/虚线/o标记 c*是表示蓝绿色(cyan)/*标记 ‘MakerIndices,1:5:length(y) 每五个点取点&#xff08;设置标记密度&#xff09; 特殊符号的输入 序号 需求 函数字符结构 示例 1 上角标 ^{ } title( $ a…

初识c++

文章目录 前言一、C命名空间1、命名空间2、命名空间定义 二、第一个c程序1、c的hello world2、std命名空间的使用惯例 三、C输入&输出1、c输入&输出 四、c中缺省参数1、缺省参数概念2、缺省参数分类3、缺省参数应用 五、c中函数重载1、函数重载概念2、函数重载应用 六、…

【⑰MySQL】 变量 | 循环 | 游标 | 处理程序

前言 ✨欢迎来到小K的MySQL专栏&#xff0c;本节将为大家带来MySQL变量 | 循环 | 游标 | 处理程序的分享✨ 目录 前言1. 变量1.1系统变量1.2 用户变量 2. 定义条件与处理程序2.1 案例分析2.2 定义条件2.3 定义处理程序2.4 案例解决 3. 流程控制3.1 分支结构3.2 循环结构3.3 跳转…

设计模式-9--迭代器模式(Iterator Pattern)

一、什么是迭代器模式 迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为型设计模式&#xff0c;用于提供一种统一的方式来访问一个聚合对象中的各个元素&#xff0c;而不需要暴露该聚合对象的内部结构。迭代器模式将遍历集合的责任从集合对象中分离出来&#xf…

【深入解析spring cloud gateway】07 自定义异常返回报文

Servlet的HttpResponse对象&#xff0c;返回响应报文&#xff0c;一般是这么写的&#xff0c;通过输出流直接就可以将返回报文输出。 OutputStream out response.getOutputStream(); out.write("输出的内容"); out.flush();在filter中如果发生异常&#xff08;例如…

Java中的网络编程------基于Socket的TCP编程和基于UDP的网络编程,netstat指令

Socket 在Java中&#xff0c;Socket是一种用于网络通信的编程接口&#xff0c;它允许不同计算机之间的程序进行数据交换和通信。Socket使得网络应用程序能够通过TCP或UDP协议在不同主机之间建立连接、发送数据和接收数据。以下是Socket的基本介绍&#xff1a; Socket类型&…

1775_树莓派3B键盘映射错误解决

全部学习汇总&#xff1a; GitHub - GreyZhang/little_bits_of_raspberry_pi: my hacking trip about raspberry pi. 入手树莓派3B之后用了没有多长时间&#xff0c;最初的这段时间感觉想让它代替我的PC机是不肯能的。性能先不说&#xff0c;我完全没有找到当初在我的笔记本上使…

css网格布局

css网格布局 常用属性 display: grid; //开启网格grid-template-columns: 2fr 1fr 1fr 1fr 1fr; //设置多少列每列宽度grid-gap: 10px; // 设置表格之间间距grid-template-rows: 50px 50px 50px 50px; // 设置多少行 每行的高度grid-column : 1 //占据位置 占据1格grid-colu…

机器人中的数值优化(九)——拟牛顿方法(下)、BB方法

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考&#xff0c;主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等&#xff0c;本系列文章篇数较多&#xff0c;不定期更新&#xff0c;上半部分介绍无约束优化&#xff0c;…

某物联网数智化园区行业基于 KubeSphere 的云原生实践

公司简介 作为物联网 数智化园区一体化解决方案提供商&#xff0c;我们致力于为大中型园区、停车场提供软硬件平台&#xff0c;帮助园区运营者实现数字化、智能化运营。 在使用 K8s 之前我们使用传统的方式部署上线&#xff0c;使用 spug&#xff08;一款轻量级无 Agent 的自…

网络版五子棋C++实现

目录 1.项目介绍 2.开发环境 3.核心技术 4.环境搭建 5.WebSocketpp介绍 5.1WebSocketpp是什么 5.2为什么使用WebSocketpp 5.3原理解析&#xff1a; 5.4WebSocketpp主要特性 6.WebSocketpp使用 7.JsonCpp使用 8.MySQL API 9.项目模块设计以及流程图 10.封装日志宏…

NewStarCTF 2022 web方向题解 wp

----------WEEK1---------- BUU NewStarCTF 公开赛赛道 WEEK1 [NotPHP] 先看题目&#xff0c;要传参加绕过。 分析一下代码&#xff1a;首先get一个datadata://test/plain,Wel…。然后key1和2用数组可以绕过。num2077a可以绕过弱类型。eval()中的php语句被#注释了&#xff0c…

并发编程的故事——JUC

JUC 文章目录 JUC一、Semaphore二、CountDownLatch三、线程安全类 一、Semaphore 为什么需要用到Semaphore? 限流 Semaphore的场景&#xff1f; 秒杀商品的时候&#xff0c;不能够让那些没有秒杀成功的线程进入&#xff0c;只有占了坑位的才可以使用&#xff0c;这里可以用re…