PostgreSQL11 | 插入、更新与删除数据

2023-05-16

上一篇总结了原著的第六章有关pgsql的函数的用法,本篇将总结pgsql的增删改功能以及相关的sql语句。

插入、更新与删除数据

存储在系统中的数据是数据库管理系统的核心。数据库被设计用来管理数据的存储、访问,维护数据的完整性。PostgreSql中提供了功能丰富的数据库管理语句,包括有效地向数据库中插入数据的INSERT语句、更新数据的UPDATE语句以及当数据不再使用时删除数据的DELETE语句。

目录

插入、更新与删除数据

插入数据

1.为表的所有字段插入数据

2.为表的指定字段插入数据

3.同时插入多条记录

4.将查询结果插入列表中

更新数据

删除数据

综合案例——记录的插入,更新和删除


插入数据

在使用数据库之前,数据库中必须要有数据。在PostgreSql中,使用INSERT语句向数据库中插入新的数据记录,可以插入的方式有插入完整的记录、插入记录的一部分、插入多条记录以及插入另一个查询的结果。

1.为表的所有字段插入数据

使用基本的INSERT语句插入数据要求指定表名名称和插入到新记录中的值,基本语法格式为:

insert into table_name(column_list)values(value_list);
 插入   进     表名     (那些列)    值(对应前面列所插入的值)

table_name指定要插入的是哪一个表,column_list指定你要插入的列,value_list指定每个列所对应插入的数据。注意,使用该语句时字段列和数据值的数量必须相同。

本章会使用以下创建的表(person)来演示本章的sql示例

create table person
(
	id int not null,
	name char(40) not null default '',
	age int not null default 0,
	info char(50) null,
	primary key(id)
);

向表中所有字段插入值的方法有两种:一种是指定所有字段名,另一种是完全不指定字段名。

例1:在person表中,插入一条新记录,id值为1,name值为Green,age值为21,info值为lawyer。

执行插入语句之前,使用SELECT语句查看表中数据;

SELECT * FROM person;

也可以选中person表,点击小图标快速查看表中的所有数据(往后的表中全部数据查询都将使用该功能快速展示,查表全部数据的sql语句不再提供)

当前显示结果为空,没有数据,下面将插入第一条数据

insert into person(id,name,age,info)values(1,'Green',21,'Lawyer');

查询结果

可以看到插入记录成功。在插入数据时,指定了person表的所有字段,因此将为每一个字段插入新的值。

INSERT语句后面的列名称顺序可以不是person表定义时的顺序,即插入数据时不需要按照表定义的顺序插入,只需要保证值的顺序与列字段的顺序相同就可以,如下面的例子所示。

例2.在person表中,插入一条新记录,id的值为2,name值为Suse,age值为22,info值为dancer,sql语句如下。

insert into person(age,name,id,info)values(22,'Suse',2,'Dancer');

使用INSERT插入数据时,允许列名称列表column_list为空。此时,值列表中需要为表的每一个字段指定值,并且值的顺序必须和数据表中字段定义时的顺序相同。

例3.在person表中,插入一条新记录,sql语句如下:

insert into person values(3,'Mary',24,'Student');

虽然可以使用INSERT插入数据时忽略插入数据的列名称,但是如果不包括列名称,那么VALUES关键字后面的值不但要求必须完整而且顺序必须和表定义时列的顺序相同。如果表的结构被修改,对列进行增加、删除或者位置改变操作,将使得用这种方式插入数据时的顺序也必须同时改变。如果指定列名称,则不会受到表结构改变的影响。

2.为表的指定字段插入数据

为表的指定字段插入数据,就是在INSERT语句中只向部分字段中插入值,而其他字段的值为表定义时的默认值。

例:在person表中,插入一条新记录,id值为4,name值为Laura,age值为25,sql语句如下:

insert into person(id,name,age)values(4,'Laura',25);

3.同时插入多条记录

INSERT语句可以同时向数据表中插入多条记录。插入时指定多个值列表,每个值列表之间用逗号隔开,基本语法格式如下:

insert into 表名(属性列表) values(取值列表1),(取值列表2),...,(取值列表n);

其中,“表名”为需要插入数据的表的名称;“属性列表”为可选参数,指定向哪些字段插入数据,如果没有指定字段,那么默认向所有字段插入数据;“取值列表n”参数表示要插入的记录,各个记录之间用逗号隔开。

例:在person表中,在id、name、age和info字段指定插入值,同时插入3条新记录,sql语句如下:

insert into person(id,name,age,info)values(5,'Evans',27,'Secretary'),(6,'Dale',22,'Cook'),(7,'Eison',28,'Singer');

使用INSERT同时插入多条记录时,pgsql会返回一些在执行单行插入时没有的额外信息,这些包含数值的字符串的意思分别是:

(1)Records 表明插入的记录条数

(2)Duplicates 表明插入时被忽略的记录,原因可能是这些记录包含了重复的主键值

(3)Warnings 表明有问题的数据值,例如发生数据类型转换

例:在person表中,不指定插入列表,同时插入2条新记录,sql语句如下:

insert into person values(8,'Harry',21,'magician'),(9,'Harriet',19,'pianist');

 

4.将查询结果插入列表中

 INSERT语句用来给数据表插入记录时指定插入记录的列值,INSERT还可以将SELECT语句查询的结果插入到表中,如果想要从另一个表中合并个人信息到person表,不需要把每一条记录的值一个一个输入,只需要使用一条INSERT语句和一条SELECT语句组成的组合语句即可快速的从一个或多个表向一个表中插入多行。基本语法如下:

insert into 表名1(列名) select(列名) from 表名2 where(条件);

例:从person_old的表中查询所有的记录,并将其插入到person表中

创建一个名为person_old的数据表,其表结构与person表结构相同,SQL语句如下

create table person_old
(
	id int not null,
	name char(40) not null default'',
	age int not null default 0,
	info char(50) null,
	primary key(id)
);

 向person_old的表中添加两条记录

insert into person_old values(10,'harry',20,'student'),(11,'Beckham',31,'police');

可以看到,插入记录成功,person_old表中现在有两条记录,接下来将person_old的表中所有的记录插入person表中,SQL语句如下:

insert into person(id,name,age,info) select id,name,age,info from person_old;

由结果可以看到,INSERT语句执行后,person表中多了两条记录这两条记录和person_old的表中的记录完全相同,数据转移成功,这里的id字段为主键,在插入的时候要保证该字段值的唯一性

更新数据

表中有数据之后,接下来可以对数据进行更新操作,在pgsql中,使用UPDATE语句更新表中的记录,可以更新特定的行或者同时更新所有的行,基本语法结构如下:

update table_name set column_name1 = value1,column_name2 = value2,...,column_namen = valuen where(condition);

column_name1,column_name2,...,column_namen为指定更新的字段的名称;value1,value2,...,valuen为相对应的指定字段的更新值,condition指定更新的记录需要满足的条件。更新多个列时,每个“列-值”对之间用逗号隔开,最后一列之后不需要逗号。

例1:在person表中,更新id值为10的记录,将age字段值改为15,将name字段值改成LiMing。

更新操作执行前可以使用SELECT语句查看当前的数据

select * from person where id=10;

由结果可以看到,更新之前id=10的记录的name的字段值为Harry,age字段值为20。下面使用UPDATE语句更新数据,语句执行结果如下:

update person set age=15,name='LiMing' where id=10;

 

 可以看到id=10的数据已经修改,如果希望看到结果按id顺序排列可以在末尾加排序语句

select * from person order by id;

例2:在person表中更新age值为19~22的记录,将Info字段值都改为student

更新操作执行前可以使用SELECT语句查看当前的数据:

select * from person where age between 19 and 22;

可以看到这些age值字段值在19~22之间的记录info字段值各不相同,下面使用UPDATE的语句更新数据,语句执行结果如下:

update person set info='student' where age between 19 and 22;

查看结果

select * from person where age between 19 and 22;

 由结果可以看到,UPDATE执行后,成功将表中符合条件的记录的Info字段值都改为了student。

删除数据

从数据表中删除数据使用DELETE语句。DELETE语句允许WHERE子句指定删除条件。DELETE语句的基本语法格式如下:

delete from table_name[where<condition>];

table_name指定要执行删除操作的表。[where<condition>]为可选参数,指定删除条件,如果没有WHERE子句,DELETE语句将删除表中的所有记录。

例1:在person表中删除ID=10的记录

执行删除操作前,使用SELECT语句查看当前id=10的记录。

select * from person where id=10;

 可以看到,现在表中有id=10的记录,下面使用delete语句删除记录。

delete from person where id=10;

语句执行完毕后,查看执行结果。

select * from person where id=10;

 查询结果为空,说明删除操作成功。

例2:在person表中使用DELETE语句同时删除多条记录,在前面UPDATE语句中将age字段值在19~22之间的记录info字段值修改为student,在这里删除这些记录。

执行删除操作前,使用select的语句查看当前的数据。

select * from person where age between 19 and 22;

可以看到这些age字段值在19~22之间的记录存在表中。下面使用DELETE删除这些记录。 

delete from person where age between 19 and 22;

语句执行完毕,查看执行结果。

select * from person where age between 19 and 22;

查询结果为空,删除多条记录成功。

例3:删除person表中的所有记录。

执行删除操作前,使用SELECT的语句查看当前的数据。

select * from person;

结果显示person表中还有五条记录,执行DELETE语句,删除这五条记录。

delete from person;

语句执行完毕后,查看执行结果。

select * from person;

 查询结果为空,删除表中所有记录成功,现在person表中已经没有任何数据记录。

如果想删除表中的所有记录,还可以使用TRUNCATE TABLE。TRUNCATE将直接删除原来的表并重新创建一个表。其语法结构为TRUNCATE TABLE 表名。直接删除表,而不是删除记录,因此执行速度比DELETE快。

综合案例——记录的插入,更新和删除

有关综合案例——记录的插入,更新和删除的相关内容请通过原教材《postgresql11从入门到精通》(清华大学出版社)第152页开始了解,常见问题及解答在原书158页,经典习题在原书159页,该部分作为自由了解范围请购买原著自行学习,感谢理解。

作者的话(Alvin):

本文根据原书《PostgreSql11 从入门到精通》(清华大学出版社)第7章总结整理,为提问与解答可以帮助更多人,本博客模拟GitHub的issue方案,所以私信已关,有问题请在评论区直接指正与提问,允许转发、复制或引用本文章,必须遵守开源法则注释来源与作者,感谢您的阅读。

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

PostgreSQL11 | 插入、更新与删除数据 的相关文章

  • 【汇编】正确使用IDIV指令

    汇编 正确使用IDIV指令 div为无符号除法 xff0c idiv为有符号除法 idiv进行的是128 64位除法 xff0c 即被除数为128位 除数为64位 64位操作系统中寄存器大小当然只有64位 xff0c 因此 xff0c id
  • 【acwj】04,An Actual Compiler 一个真正的编译器

    搬运自https github com DoctorWkt acwj xff0c 一个介绍如何使用C语言编写一个可自举的类C语言编译器的说明 进行了粗略的翻译 acwj 04 xff0c An Actual Compiler 一个真正的编译
  • 设计模式详解:工厂方法模式

    今天我们来看一下使用频率非常高的工厂方法模式 xff0c 看完原理分别给出 NET和JAVA两种语言的实现源码 定义 xff1a 工厂方法模式 xff1a 定义一个用于创建对象的接口 xff0c 但是 让子类决定将哪一个类实例化 工厂方法模
  • 【acwj】05,Statements 实现“Statements”

    搬运自https github com DoctorWkt acwj xff0c 一个介绍如何使用C语言编写一个可自举的类C语言编译器的说明 进行了粗略的翻译 acwj 05 xff0c Statements 实现 Statements I
  • diff命令实现

    diff命令实现 diff是类UNIX系统下的一个重要的系统工具 xff0c 用于比较两个文本文件的差异 它有三种输出格式 先给大家看看两个用于比对的文件原文 file1 a e b a g h b g g file2 b c d g e
  • verilog 常见位宽问题集合

    verilog 常见的位宽问题集合 1 位宽不等 wire b 31 0 assign b 61 5 39 b0 这种错误常见于赋值操作中 2 保留最低位 wire b assign b 61 32 39 h5 此时因为b缺省定义为1位长度

随机推荐

  • glibc源码阅读

    FBI warning 本文仅仅是试图以二进制选手的方式来理解mallo c中所使用的堆机制 xff0c 不会对具体操作以及堆块结构作过多叙述 xff0c 敬请谅解 水平欠佳 xff0c 有问题也欢迎留言指出 先解释一些常用的宏与常量 变量
  • github copilot插件安装

    首先是github copilot的官网地址 xff1a https copilot github com 现在要使用copilot首先要先通过申请才可以使用 xff0c 点击 Sign up 登录 xff0c 这里最好已经有github的
  • 操作系统第一章知识点小结

    第一章 操作系统概述 1 1操作系统的概念 xff0c 功能和目标 资源管理者 xff08 接下来的4给章节就是对这四个功能的详细学习 xff09 处理机处理 xff1a 处理机管理因为是为进程分配处理机资源 xff0c 也称为进程管理 存
  • SerDes基础知识

    SerDes是什么 SerDes是Serializer Deserializer 的缩写 xff0c 即串行器和解串器 xff0c 顾名思义是一种将并行数据转换成串行数据发送 xff0c 将接收的串行数据转换成并行数据的 器件 对于FPGA
  • 安装Pycharm

    文章目录 Ubuntu使用pycharm解压安装使用pycharmwindows 使用Pycharmpip install cryptography 报错 Ubuntu使用pycharm 官网地址 这里以Ubuntu1604 LTS 下载p
  • 找完数(用数组实现)

    找完数 所谓完数就是该数恰好等于除自身外的因子之和 例如 xff1a 6 61 1 43 2 43 3 xff0c 其中1 2 3为6的因子 本题要求编写程序 xff0c 找出任意两正整数m和n之间的所有完数 输入格式 xff1a 输入在一
  • Ubuntu系统使用图形化界面来创建一个用户

  • 设计模式详解:抽象工厂模式

    今天我们来看一下另一个使用频率非常高的抽象工厂模式 xff0c 看完原理分别给出 NET和JAVA两种语言的实现源码 定义 xff1a 抽象工厂模式 xff1a 提供一个 创建一系列相关或相互依赖对象的接口 xff0c 而无须指定它们具体的
  • Vmmem进程(WSL)内存资源过高

    本文章向大家介绍Docker Vmmem内存占用过高的解决方案 Windows的linux子系统最大占用可到本机器的80 xff0c 所以必须限制一下它的性能来达到优化目的 解决方案 win 43 R 输入cmd打开控制台 输入wsl sh
  • git使用教程8-pycharm 使用 Reset 回滚到某次 commit 提交

    前言 当我们用 pycharm 提交代码的时候 xff0c 每天都要 commit 提交的内容 xff0c 有时候发现后面写的代码还不如前两天的稳定 这时候想把代码回退到某次 commit 提交 xff0c 可以使用git的 reset 功
  • IP地址中的网络地址和主机地址分别是什么意思?怎么计算的呢?

    什么意思呢 xff1f 先理解下这个 xff1a 01087654321 这是一个电话号码 xff0c 它是一坨数字但我们很清楚它分为两部分 xff0c 其中010是表示北京的区号 xff0c 后面87654321是北京范围内的一台座机号
  • Windows安装 hadoop 环境

    1 需要安装 Java 环境 2 下载 hadoop https archive apache org dist hadoop common 3 解压 hadoop 压缩包 xff08 如 xff1a 将下载好的压缩包放在 E config
  • C语言基础-猜拳问题

    题目描述 石头剪刀布是常见的猜拳游戏 石头胜剪刀 xff0c 剪刀胜布 xff0c 布胜石头 如果两个人出拳一样 xff0c 则不分胜负 一天 xff0c 小A和小B正好在玩石头剪刀布 已知他们的出拳都是有周期性规律的 xff0c 比如 石
  • 运算符左移与右移(点进来看看很有用,不只是说一下左移和右移,还有他们的有趣的应用)

    1 左移和右移 左移和右移这一对运算符 不知道有多少人可以很清楚它们 xff0c 并且可以很好的应用 xff0c 反正我是不可以 xff0c 于是就打算总结一下 左移 xff1a 左移就是把一个数的所有位都向左移动若干位 符号表示 xff1
  • Python中的if语句

    Python中的if语句 1 条件测试 每个if语句的核心都是一个值为True或False的表达式 xff0c 这种表达式被称为条件测试 当条件测试的结果为True时 xff0c if语句会执行后面的代码 xff1b 如果为False则不会
  • Ubuntu系统下的gcc升降版本 保姆级教程

    安装cuda出错Failed to verify gcc version See log at var log cuda installer log for details 在安装cuda xff0c 使用如下命令 xff1a sudo s
  • ubuntu16.04 --- ROS智能车定位导航仿真

    ubuntu16 04 ROS智能车定位导航 一 准备阶段1 下载智能车源码包2 安装相应插件3 编译 二 仿真1 运行小车模型2 运行赛道3 自主定位导航4 搭建自己的地图5 导航 一 准备阶段 1 下载智能车源码包 进入ROS工作区 c
  • cloudreve-自建云盘

    目前已经实现的特性 xff1a 1 快速对接多家云存储 xff0c 支持七牛 又拍云 阿里云OSS AWS S3 Onedrive 自建远程服务器 xff0c 当然 xff0c 还有本地存储 2 可限制单文件最大大小 MIMEType 文件
  • intel cpu core/“酷睿”系列发展史,供组装机的朋友们参考

    一 intel cpu系列分类 酷睿 xff08 Core xff09 系列 xff0c 主要应用于管理 3D 高级视频和照片编辑 xff0c 玩复杂游戏 xff0c 享受高分辨率 4K 显示 奔腾 xff08 PenTIum xff09
  • PostgreSQL11 | 插入、更新与删除数据

    上一篇总结了原著的第六章有关pgsql的函数的用法 xff0c 本篇将总结pgsql的增删改功能以及相关的sql语句 插入 更新与删除数据 存储在系统中的数据是数据库管理系统的核心 数据库被设计用来管理数据的存储 访问 xff0c 维护数据