DML

数据操作语言,SQL中处理数据等操作统称为数据操纵语言,包括INSERT,UPDATE,DELETE等等。

INSERT

规则

INSERT INTO table_name [ ( column [, ... ] ) ] query

描述

在table中插入新行。

如果指定了列名列表,则它们必须与查询生成的列完全匹配。表中不在列列表中的每一列都将填充一个空值。否则,如果未指定列名,则查询生成的列必须与要插入的表中的列完全匹配。

例子

从已有表new_customer加载数据到customer

INSERT INTO customer
SELECT * FROM new_customer

插入单行到表customer

INSERT INTO customer VALUES(1,'joe')

向表customer中插入多行

INSERT INTO customer VALUES(2,'bob'),(3,'john')

通过指定列插入表

INSERT INTO nation (nationkey, name, regionkey, comment)
VALUES (1, 'CHINA', 1, 'no comment');

插入不包含列名的值,将对列comment补充NULL

INSERT INTO nation (nationkey, name, regionkey)
VALUES (1, 'CHINA', 1);

UPDATE

规则

UPDATE table_name SET [ ( column [, ... ] ) ] [ WHERE condition ]

描述

更新表中指定字段数据,有WHERE更新指定的,否则全表更新。

例子

更新表customercustomer_id为2的customer_name为peter。

update customer set customer_name='peter' where customer_id=2

目前只有事务表才支持UPDATE语法。

DELETE

规则

DELETE FROM table_name [ WHERE condition ]

描述

删除表中数据,有WHERE删除匹配条件的,否则删除所有数据。

例子

删除lineitem表中shipmodeAIR的数据。

DELETE FROM lineitem WHERE shipmode = 'AIR';

两表关联删除

DELETE FROM lineitem
WHERE orderkey IN (SELECT orderkey FROM orders WHERE priority = 'LOW');

删除所有

DELETE FROM lineitem

目前只有事务表才支持DELETE语法。

对于更新和删除尽量使用条件进行,否则可能占用集群资源,并且效率不高。

MERGE

规则

MERGE INTO target_table [ [ AS ]  target_alias ]
USING { source_table | query } [ [ AS ] source_alias ]
ON search_condition
when_clause [...]
where when_clause is one of

WHEN MATCHED [ AND condition ]
    THEN DELETE
WHEN MATCHED [ AND condition ]
    THEN UPDATE SET ( column = expression [, ...] )
WHEN NOT MATCHED [ AND condition ]
    THEN INSERT [ column_list ] VALUES (expression, ...)

描述

有条件地更新和/或删除表中的行和/或在表中插入新行。

MERGE支持任意数量的具有不同 MATCH条件的WHEN子句,在由 MATCHED 状态和匹配条件选择的第一个 WHEN子句中执行 DELETE、UPDATE 或 INSERT操作。

对于每个源行,将按顺序处理 WHEN子句。仅执行第一个匹配的WHEN子句,并忽略后续子句。当单个目标表行与多个源行匹配时,将引发MERGE_TARGET_ROW_MULTIPLE_MATCHES异常。

如果源行与任何 WHEN 子句不匹配,并且没有“不匹配时”子句,则忽略源行。

在具有 UPDATE操作 WHEN子句中,列值表达式可以依赖于目标或源的任何字段。在不匹配的情况下,插入表达式可以依赖于源的任何字段。

例子

注意:合并更新的表 必须是事务表 和主键约束的

MERGE INTO t_p2_t1 t USING tmp_01 s ON (t.account = s.account and  t.date_p=s.date_p) WHEN MATCHED THEN UPDATE SET date_time = s.date_time;
MERGE INTO t_p2_t1 t USING (select * from tmp_01 tt ) s ON (t.account = s.account and  t.date_p=s.date_p) WHEN MATCHED THEN UPDATE SET date_time = s.date_time