PostgreSQL SQL 语言:数据操纵

本文档为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;

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

时间: 2024-10-29 12:36:30

PostgreSQL SQL 语言:数据操纵的相关文章

PostgreSQL SQL 语言:类型转换

本文档为PostgreSQL 9.6.0文档,本转载已得到原译者彭煜玮授权. 1. 概述 SQL是一种强类型语言.也就是说,每个数据项都有一个相关的数据类型,数据类型决定其行为和允许的用法. PostgreSQL有一个可扩展的类型系统,该系统比其它SQL实现更具通用和灵活.因而,PostgreSQL中大多数类型转换行为是由通用规则来管理的,而不是ad hoc启发式规则.这种做法允许使用混合类型表达式,即便是其中包含用户定义的类型. PostgreSQL扫描器/解析器只将词法元素分解成五个基本种类

PostgreSQL SQL 语言:全文搜索

本文档为PostgreSQL 9.6.0文档,本转载已得到原译者彭煜玮授权.1. 介绍 全文搜索(或者文本搜索)提供了确定满足一个查询的自然语言文档的能力,并可以选择将它们按照与查询的相关度排序.最常用的搜索类型是找到所有包含给定查询词的文档并按照它们与查询的相似性顺序返回它们.查询和相似性的概念非常灵活并且依赖于特定的应用.最简单的搜索认为查询是一组词而相似性是查询词在文档中的频度. 文本搜索操作符已经在数据库中存在很多年了.PostgreSQL对文本数据类型提供了~.~*.LIKE和ILIK

PostgreSQL SQL 语言:数据定义

本文档为PostgreSQL 9.6.0文档,本转载已得到原译者彭煜玮授权. 1.表基础 关系型数据库中的一个表非常像纸上的一张表:它由行和列组成.列的数量和顺序是固定的,并且每一列拥有一个名字.行的数目是变化的,它反映了在一个给定时刻表中存储的数据量.SQL并不保证表中行的顺序.当一个表被读取时,表中的行将以非特定顺序出现,除非明确地指定需要排序.这些将在Chapter 7介绍.此外,SQL不会为行分配唯一的标识符,因此在一个表中可能会存在一些完全相同的行.这是SQL之下的数学模型导致的结果,

PostgreSQL SQL 语言:并行查询

本文档为PostgreSQL 9.6.0文档,本转载已得到原译者彭煜玮授权. 1. 并行查询如何工作 当优化器判断对于某一个特定的查询,并行查询是最快的执行策略时,优化器将创建一个查询计划.该计划包括一个 Gather 节点.下面是一个简单的例子: EXPLAIN SELECT * FROM pgbench_accounts WHERE filler LIKE '%x%'; QUERY PLAN --------------------------------------------------

PostgreSQL SQL 语言:查询

本文档为PostgreSQL 9.6.0文档,本转载已得到原译者彭煜玮授权. 1. 概述 从数据库中检索数据的过程或命令叫做查询.在 SQL 里SELECT命令用于指定查询. SELECT命令的一般语法是 [WITH with_queries] SELECT select_list FROM table_expression [sort_specification] 下面几个小节描述选择列表.表表达式和排序声明的细节.WITH查询等高级特性将在最后讨论. 一个简单类型的查询的形式: SELECT

PostgreSQL SQL 语言:性能提示

本文档为PostgreSQL 9.6.0文档,本转载已得到原译者彭煜玮授权. 1. 使用EXPLAIN PostgreSQL为每个收到查询产生一个查询计划. 选择正确的计划来匹配查询结构和数据的属性对于好的性能来说绝对是最关键的,因此系统包含了一个复杂的规划器来尝试选择好的计划. 你可以使用EXPLAIN命令察看规划器为任何查询生成的查询计划. 阅读查询计划是一门艺术,它要求一些经验来掌握,但是本节只试图覆盖一些基础. 本节中的例子都是从 9.3 开发源代码的回归测试数据库中抽取出来的,并且在此

PostgreSQL SQL 语言:并发控制

本文档为PostgreSQL 9.6.0文档,本转载已得到原译者彭煜玮授权. 1. 介绍 PostgreSQL为开发者提供了一组丰富的工具来管理对数据的并发访问.在内部,数据一致性通过使用一种多版本模型(多版本并发控制,MVCC)来维护.这就意味着每个 SQL 语句看到的都只是一小段时间之前的数据快照(一个数据库版本),而不管底层数据的当前状态.这样可以保护语句不会看到可能由其他在相同数据行上执行更新的并发事务造成的不一致数据,为每一个数据库会话提供事务隔离.MVCC避免了传统的数据库系统的锁定

PostgreSQL SQL 语言:索引

本文档为PostgreSQL 9.6.0文档,本转载已得到原译者彭煜玮授权. 1. 简介 假设我们有一个如下的表: CREATE TABLE test1 ( id integer, content varchar ); 而应用发出很多以下形式的查询: SELECT content FROM test1 WHERE id = constant; 在没有事前准备的情况下,系统不得不扫描整个test1表,一行一行地去找到所有匹配的项.如果test1中有很多行但是只有一小部分行(可能是0或者1)需要被该

SQL 语言

    SQL 语言是一种介于关系代数与关系演算之间的语言,其功能包括查询.操纵.定义和控制4 个方面,是一个通用的.功能极强的关系数据库语言. 4.1.1 SQL 概述    SQL 语言是1974 年由Boyce 和Chamberlin 提出的.1975 年至1979 年,IBM 公司San Jose Research Laboratory 研制的关系数据库管理系统原形系统System R 实现了这种语言.由于它功能丰富,语言简洁,使用方法灵活,倍受用户和计算机业界的青睐,被众多的计算机公司