PostgreSQL SQL 语言:数据操纵

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 前面的章节讨论了如何创建表和其他结构来保存你的数据。现在是时候给表填充数据了。本章涉及如何插入、更新和删除表数据。

本文档为PostgreSQL 9.6.0文档,本转载已得到原译者彭煜玮授权。

1. 插入数据

当一个表被创建后,它不包含数据。在数据库可以有点用之前要做的第一件事就是向里面插入数据。数据在概念上是以每次一行地方式被插入的。你当然可以每次插入多行,但是却没有办法一次插入少于一行的数据。即使你只知道几个列的值,那么你也必须创建一个完整的行。

要创建一个新行,使用INSERT命令。这条命令要求提供表的名字和其中列的值。例如,考虑Chapter 5中的产品表:


CREATE TABLE products (
    product_no integer,
    name text,
    price numeric
);

一个插入一行的命令将是:


INSERT INTO products VALUES (1, 'Cheese', 9.99);

数据的值是按照这些列在表中出现的顺序列出的,并且用逗号分隔。通常,数据的值是文字(常量),但也允许使用标量表达式。

上面的语法的缺点是你必须知道表中列的顺序。要避免这个问题,你也可以显式地列出列。例如,下面的两条命令都有和上文那条 命令一样的效果:


INSERT INTO products (product_no, name, price) VALUES (1, 'Cheese', 9.99);
INSERT INTO products (name, price, product_no) VALUES ('Cheese', 9.99, 1);

许多用户认为明确列出列的名字是个好习惯。

如果你没有获得所有列的值,那么你可以省略其中的一些。在这种情况下,这些列将被填充为它们的缺省值。例如:


INSERT INTO products (product_no, name) VALUES (1, 'Cheese');
INSERT INTO products VALUES (1, 'Cheese');

第二种形式是PostgreSQL的一个扩展。它从使用给出的值从左开始填充列,有多少个给出的列值就填充多少个列,其他列的将使用缺省值。

为了保持清晰,你也可以显式地要求缺省值,用于单个的列或者用于整个行:


INSERT INTO products (product_no, name, price) VALUES (1, 'Cheese', DEFAULT);
INSERT INTO products DEFAULT VALUES;

你可以在一个命令中插入多行:


INSERT INTO products (product_no, name, price) VALUES
    (1, 'Cheese', 9.99),
    (2, 'Bread', 1.99),
    (3, 'Milk', 2.99);

Tip: 在一次性插入大量数据时,考虑使用COPY命令。它不如INSERT命令那么灵活,但是更高效。

2. 更新数据

修改已经存储在数据库中的数据的行为叫做更新。你可以更新单个行,也可以更新表中所有的行,还可以更新其中的一部分行。 我们可以独立地更新每个列,而其他的列则不受影响。

要更新现有的行,使用UPDATE命令。这需要提供三部分信息:

  • 表的名字和要更新的列名
  • 列的新值
  • 要更新的是哪(些)行

我们在前面的文章里说过,SQL 通常并不为行提供唯一标识符。因此我们无法总是直接指定需要更新哪一行。但是,我们可以通过指定一个被更新的行必须满足的条件。只有在表里面存在主键的时候(不管你声明它还是不声明它),我们才能可靠地通过选择一个匹配主键的条件来指定一个独立的行。图形化的数据库访问工具就靠这允许我们独立地更新某些行。

例如,这条命令把所有价格为5的产品的价格更新为10:


UPDATE products SET price = 10 WHERE price = 5;

这样做可能导致零行、一行或者更多行被更新。如果我们试图做一个不匹配任何行的更新,那也不算错误。

让我们仔细看看这个命令。首先是关键字UPDATE, 然后跟着表名字。和平常一样,表名字也可以是用模式限定的, 否则会从路径中查找它。然后是关键字SET, 后面跟着列名、一个等号以及新的列值。新的列值可以是任意标量表达式, 而不仅仅是常量。例如,如果你想把所有产品的价格提高 10%,你可以用:


UPDATE products SET price = price * 1.10;

如你所见,用于新值的表达式也可以引用行中现有的值。我们还忽略了WHERE子句。如果我们忽略了这个子句, 那么就意味着表中的所有行都要被更新。如果出现了WHERE子句, 那么只有匹配它后面的条件的行被更新。请注意在SET子句中的等号是一个赋值, 而在WHERE子句中的等号是比较,不过这样并不会导致任何歧义。当然WHERE条件不一定非得是等值测试。许多其他操作符也都可以使用。但是表达式必须得出一个布尔结果。

你还可以在一个UPDATE命令中更新更多的列, 方法是在SET子句中列出更多赋值。例如:


UPDATE mytable SET a = 5, b = 3, c = 1 WHERE a > 0;

3. 删除数据

到目前为止我们已经解释了如何向表中增加数据以及如何改变数据。剩下的是讨论如何删除不再需要的数据。和前面增加数据一样,你也只能从表中整行整行地删除数据。在前面的一节里我们解释了 SQL 不提供直接访问单个行的方法。因此,删除行只能是通过指定被删除行必须匹配的条件进行。如果你在表上有一个主键,那么你可以指定准确的行。但是你也可以删除匹配条件的一组行,或者你可以一次从表中删除所有的行。

可以使用DELETE命令删除行,它的语法和UPDATE命令非常类似。例如,要从产品表中删除所有价格为 10 的产品,使用:


DELETE FROM products WHERE price = 10;

如果你只是写:


DELETE FROM products;

那么表中所有行都会被删除!程序员一定要注意。

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
21天前
|
SQL 存储 缓存
SQL Server 数据太多如何优化
11种优化方案供你参考,优化 SQL Server 数据库性能得从多个方面着手,包括硬件配置、数据库结构、查询优化、索引管理、分区分表、并行处理等。通过合理的索引、查询优化、数据分区等技术,可以在数据量增大时保持较好的性能。同时,定期进行数据库维护和清理,保证数据库高效运行。
|
1月前
|
SQL 移动开发 Oracle
SQL语句实现查询连续六天数据的方法与技巧
在数据库查询中,有时需要筛选出符合特定时间连续性条件的数据记录
|
1月前
|
SQL 存储 关系型数据库
添加数据到数据库的SQL语句详解与实践技巧
在数据库管理中,添加数据是一个基本操作,它涉及到向表中插入新的记录
|
1月前
|
SQL 数据挖掘 数据库
SQL查询每秒的数据:技巧、方法与性能优化
id="">SQL查询功能详解 SQL(Structured Query Language,结构化查询语言)是一种专门用于与数据库进行沟通和操作的语言
|
2月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
4月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
115 13
|
4月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
|
4月前
|
SQL 存储 网络安全
关系数据库SQLserver 安装 SQL Server
【7月更文挑战第26天】
62 6
|
4月前
|
存储 SQL C++
对比 SQL Server中的VARCHAR(max) 与VARCHAR(n) 数据类型
【7月更文挑战7天】SQL Server 中的 VARCHAR(max) vs VARCHAR(n): - VARCHAR(n) 存储最多 n 个字符(1-8000),适合短文本。 - VARCHAR(max) 可存储约 21 亿个字符,适合大量文本。 - VARCHAR(n) 在处理小数据时性能更好,空间固定。 - VARCHAR(max) 对于大文本更合适,但可能影响性能。 - 选择取决于数据长度预期和业务需求。
390 1
|
3月前
|
SQL 安全 Java
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
501 0
下一篇
无影云桌面