Kingbase-数据操纵

本文详细介绍了在数据库中使用SQL进行数据操作,包括插入新行、更新现有数据、删除行以及利用RETURNING子句获取修改后的数据,强调了主键在指定行的重要性,并提到了INSERTALL和INSERTFIRST的区别以及COPY命令的效率提升。
摘要由CSDN通过智能技术生成
1 插入数据
一个表被创建后,表中并不包含原始数据。因此用户在创建数据库后第一件事可能为向表中插入数据。在概念上,数据是以每次一行的方式被插入表中的。当然也可以每次插入多行,但却没有办法一次插入少于一行的数据。即使只知道几个列的值,也必须创建一个完整的行。
创建一个新行,使用 INSERT ALL|FIRST 命令。该命令要求提供表的名字和其中列的值。例如,使用 数据定义 中的产品表:
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');
第二种形式是 KingbaseES 的一个扩展。它从使用给出的值从左开始填充列,有多少个给出的列值就填充多
少个列,其他列的将使用缺省值。
为了保持清晰,你也可以显式地要求缺省值,用于单个的列或者用于整个行:
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);
也可以插入查询的结果(可能没有行、一行或多行):
INSERT INTO products (product_no, name, price)
SELECT product_no, name, price FROM new_products
WHERE release_date = 'today';
这提供了用于计算要插入的行的 SQL 查询机制( 查询 )的全部功能。
为兼容 oracle 特性,提供了一种同时插入多个表的功能, insert all insert first
insert all 对于每行待插入的数据,可以同时插入到多个目标表。
INSERT ALL INTO products (product_no, name, price) INTO products1 (product_no, name,
, price)
SELECT product_no, name, price FROM new_products
WHERE release_date = 'today';
insert first 同样可以同时插入多个表,但是相对 insert all 每行数据只能插入第一个满足条件的目标表。
INSERT FIRST WHEN price<10 THEN INTO products (product_no, name, price) WHEN price>
, 100 THEN INTO products1 (product_no, name, price)
SELECT product_no, name, price FROM new_products
WHERE release_date = 'today';
Tip: 在一次性插入大量数据时,考虑使用 COPY 命令。它不如 INSERT ALL|FIRST 命令那么灵活,但是更高效。
2 更新数据
修改已经存储在数据库中的数据的行为叫做更新。你可以更新单个行,也可以更新表中所有的行,还可以更
新其中的一部分行。我们可以独立地更新每个列,而其他的列则不受影响。
要更新现有的行,使用 UPDATE 命令。这需要提供三部分信息:
1. 表的名字和要更新的列名
2. 列的新值
3. 要更新的是哪(些)行
我们在 数据定义 里说过, 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;
那么表中所有行都会被删除!程序员一定要注意。
4 从修改的行中返回数据
有时在修改行的操作过程中获取数据很有用。 INSERT UPDATE DELETE 命令都有一个支持这个的可选
RETURNING RETURN 子句。使用 RETURNING RETURN 可以避免执行额外的数据库查询来收集
数据,并且在否则难以可靠地识别修改的行时尤其有用。
所允许的 RETURNING RETURN 子句的内容与 SELECT 命令的输出列表相同。它可以包含命令的目标
表的列名,或者包含使用这些列的值表达式。一个常见的简写是 RETURNING RETURN * ,它按顺序选
择目标表的所有列。
INSERT 中,可用于 RETURNING RETURN 的数据是插入的行。这在琐碎的插入中并不是很有用,因
为它只会重复客户端提供的数据。但依赖于计算出的默认值时可以非常方便。例如,当使用 serial 列来提供
唯一标识符时, RETURNING RETURN 可以返回分配给新行的 ID
CREATE TABLE users (firstname text, lastname text, id serial primary key);
INSERT INTO users (firstname, lastname) VALUES ('Joe', 'Cool') RETURNING/RETURN id;
RETURNING RETURN 子句对于 INSERT ... SELECT 也非常有用。
UPDATE 中,可用于 RETURNING RETURN 的数据是被修改行的新内容。例如:
UPDATE products SET price = price * 1.10
WHERE price <= 99.99
RETURNING/RETURN name, price AS new_price;
DELETE 中,可用于 RETURNING RETURN 的数据是删除行的内容。例如:
DELETE FROM products
WHERE obsoletion_date = 'today'
RETURNING/RETURN *;
如果目标表上有触发器 ( 触发器 ) ,可用于 RETURNING RETURN 的数据是被触发器修改的行。因此,检查由触发器计算的列是 RETURNING RETURN 的另一个常见用例。
  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值