GBase 8s SQL基础语法—数据操纵语言DML

GBase 8s SQL基础语法—DML

数据操纵语言语句

  • INSERT
  • UPDATE
  • DELETE
  • MERGE

注: MERGE 可模拟 INSERT 和 DELETE 或 UPDATE。

INSERT 语句

使用 INSERT 语句来向表或视图内插入一个或多个新行,或向 SQL 或 GBase 8s ESQL/C 集合变量内插入一个或多个元素。

语法格式

INSERT INTO <TABLE|VIEW|SYNONYM> [(COLUMN{[,COLUMN]})] <INSERT_ACTION>;
<INSERT_ACTION>::= VALUES(<值表达式>)
                |<子查询表达式>
                |EXECUTE <ROUTINE>
INSERT [ALL|FIRST] WHEN <BOOL_EXP> THEN <INSERT_INTO_LIST> {[WHEN <BOOL_EXP> THEN <INSERT_INTO_LIST>]} [ELSE <INSERT_INTO_LIST>] <INSERT_ACTION>;
<INSERT_INTO_LIST>::= INTO <TABLE|VIEW|SYNONYM> [(COLUMN{,COLUMN})]

要将数据插入到表内,您必须或拥有该表或有对该表的 Insert 权限(请参阅 GRANT 语句)。要将数据插入视图内,您必须有所需要的 Insert 权限,且该视图必须满足在通过视图插入行中说明的要求。

如果该表或视图有数据完整性约束,则被插入的行必须满足该约束条件。如果不满足,则数据库服务器返回错误。如果将检查模式设置为 IMMEDIATE,则在每一 INSERT 语句的末尾检查所有指定的约束。如果将检查模式设置为 DEFERRED,则不检查所有指定的约束,直到该事务提交为止。

举例说明

例1 在 t_user1 表中插入一条用户信息: f_userid 为1, f_username 为gbasedbt。

insert into t_user1 values(1, 'gbasedbt');

例2 将子查询语句的结果集插入 t_user1 表中,从而达到数据翻倍。

insert into t_user1 select * from t_user1;

例3 通过执行例程子句完成数据插入 t_user1 表中。

create function fn_user_add(user_num int)
returning int as userid, varchar(20) as username
define i int;
define userid int;
define username varchar(20);
for i = 1 to user_num
    let userid = i;
    let username = concat('user_', to_char(i));  
    return userid, username with resume;
end for;   
end function;
insert into t_user1 execute function fn_user_add(10);

例4 将子查询的结果集有条件的插入到符合条件的表中。f_userid 小于10的记录插入 t_user2 表中,其余的记录插入 t_user3 表中。

insert all 
when f_userid <10 then into t_user2 
else into t_user3 
select f_userid, f_username from t_user1;

UPDATE 语句

使用 UPDATE 语句来更改表或视图中一个或多个现有的行的一个或多个列中的值。

UPDATE <TABLE|VIEW|SYNONYM> [AS alias] 
SET COLUMN = <值表达式> {[,COLUMN = <值表达式>]} [WHERE <CONDITION>];
UPDATE <TABLE|VIEW|SYNONYM> [AS alias] 
SET (COL,..,COL) = (<子查询表达式>,..,<子查询表达式>) [WHERE <CONDITION>];

使用 UPDATE 语句来更新任何下列类型的数据库对象或程序对象:

  • 表中的一行:单个行、行的组或表中的所有行
  • 集合数据类型的列中的元素
  • 在命名的或未命名的 ROW 数据类型的列中,一个字段或所有字段。

随同 GBase 8s ,您还可使用此语句来更改在 GBase 8s ESQL/C 或 SPL 集合变量或 ROW 变量中一个或多个元素的值。

您必须或拥有该表,或对该表有 Update 权限。请参阅 GRANT 语句。要更新视图中的数据,您必须有 Update 权限,且该视图必须满足通过视图更新行中说明的要求。

UPDATE 语句的目标不可为 CREATE EXTERNAL TABLE 语句定义了的表对象。

使用 SET 子句来标识要更新的列并将值指定给每一列。
SET 子句支持下列语法格式:

  • 单列格式,它将每一列与单个表达式配对
  • 多列格式,它将多列的列表与通过一个或多个表达式返回的值相关联

举例说明

例1 将 t_user 表中 f_userid 为 1 的记录更新 f_age 为 20 。

update t_user set f_age = 20 where f_userid = 1;

例2 通过子查询结果与直接赋值多列更新 t_user 表的记录。 t_user 表中 f_userid 为 1 的记录修改为 f_userid 为 1 , f_username 与 f_userage 为子查询语句在 info 表中的结果集。

update t_user 
set (f_userid,f_username,f_userage)=(1,(select i_username,i_userage from info where i_uid = 1))
where f_userid = 1;

DELETE 语句

使用 DELETE 语句从表中删除一行或多行,或者在 SPL 或 GBase 8s ESQL/C 的集合变量中删除一个或多个元素。

DELETE FROM <TABLE|VIEW|SYNONYM> [AS alias] [WHERE <CONDITION>];

使用 DELETE 语句移除以下任意类型的数据库对象或程序对象:

  • 表中或视图中的行:一行,一组行或所有的行
  • 集合数据类型的列中的元素
  • 已命名或未命名 ROW 数据类型的列、一个字段或所有字段。

您还可以使用此语句移除 GBase 8s ESQL/C 或 SPL 集合变量或 ROW 变量中的一个或多个元素的值。

举例说明

例1 删除 t_user1 表中 f_userid 为 1 的记录。

delete from t_user where f_userid = 1;

MERGE 语句

使用 MERGE 语句,通过在单个 SQL 语句内综合 UPDATE 或 DELETE 操作与 INSERT 操作,来将数据从源表转移到目标表内。您还可使用此语句来将源表与目标表合并,然后对目标表仅执行 UPDATE 操作,仅执行 DELETE 操作,或仅执行 INSERT 操作。

MERGE 语句以 GBase 8s 扩展支持 SQL 的 ANSI/ISO 标准。

MERGE INTO <TARGET_TABLE|TARGET_VIEW|TARGET_SYNONYM> [AS alias] 
USING <SOURCE_TABLE|SOURCE_VIEW|<子查询表达式>> [AS alias] ON <CONDITION>
WHEN MATCHED THEN <UPDATE|DELETE> <SET_CLAUSE>
WHEN NOT MATCHED THEN INSERT [(COLUMN{[,COLUMN]})] VALUES(<值表达式>);

GBase 8s 的 MERGE 语句是数据操纵语言(DML)语句,将源表对象与目标表或视图结合。您在 ON 关键字之后指定的 condition 决定在目标上的 UPDATE 或 DELETE 操作中使用源对象的哪一行,以及在目标上的 INSERT 操作中使用哪一行。MERGE 语句不更改源对象。

  • 如果您指定 Update 和 Insert 两个子句,则 MERGE 语句可在目标对象上执行 INSERT 和 UPDATE 两个操作。
  • 如果您指定 Delete 和 Insert 两个子句,则 MERGE 语句可在目标对象上执行 INSERT 和 DELETE 两个操作。
  • 如果您未指定 Insert 子句,则不执行 INSERT 操作,但 Update 子句必须在满足该条件的源行的目标对象上指定 UPDATE 操作(抑或 Delete 子句必须指定 DELETE 操作)。
  • 如果您未指定 Update 子句且未指定 Delete 子句,则不执行 UPDATE 或 DELETE 操作,但 Insert 子句必须为不匹配该对象的源行指定目标对象上的 INSERT 操作。
  • 如果未指定 Delete 子句,未指定 Update 子句,且未指定 Insert 子句,则 MERGE 语句失败并提示错误。

MERGE 语句可对目标对象产生下列影响:

  • 如果包括 Update 子句,则 MERGE 语句根据 SET 子句的规范,以源表中该条件取值为真的行的数据更新目标表或视图中的行。
  • 如果包括 Delete 子句,则 MERGE 语句从目标表或视图删除该条件取值为真的行。
  • 如果包括 Insert 子句,则 MERGE 语句根据 VALUES 子句的规范,以源表中该条件取值为假的行数据,向目标表或视图内插入新行。

然而,单个 MERGE 语句仅可有这三个影响中的两个,因为 Delete 子句与 Update 子句是互斥的。

对于大型表上的操作,请确保在您的系统上可获得这些资源:

  • 足够数量的锁
  • 用于中间的结合结果的足够的临时 dbspace 存储
  • 用于 MERGE 语句的结果的充足的 dbspace 存储。

在高可用性集群配置中,您可从主服务器或从可更新的辅助服务器发出 MERGE 语句。

举例说明

例1 已有用户表 t_user1 和用户表 t_user2。将 t_user1 表作为目标表,将 t_user2 表作为源表,连接条件为 t_user1 表的 f_userid 与 t_user2 表的 f_userid 相等。当记录匹配连接条件时,将 t_user2 表的 f_age 更新到 t_user1 表的 f_age; 当记录不匹配连接条件时,将 t_user2 表的 f_userid、f_username、f_age 插入一条新记录到 t_user1 表。

merge into t_user1 a
using t_user2 b
on a.f_userid = b.f_userid
when matched then update set a.f_age = b.f_age
when not matched then insert (a.f_userid, a.f_username, a.f_age) values(b.f_userid, b.f_username, b.f_age);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值