数据操纵语言,SQL中处理数据等操作统称为数据操纵语言,包括INSERT,UPDATE,DELETE等等。
规则
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 table_name SET [ ( column [, ... ] ) ] [ WHERE condition ]
描述
更新表中指定字段数据。使用WHERE
语句时进行条件更新,否则进行全表更新。
例子
更新表customer
中customer_id
为2的customer_name
为peter。
update customer
set
customer_name = 'peter'
where
customer_id = 2
目前只有事务表支持
UPDATE
语法。
规则
DELETE FROM table_name [ WHERE condition ]
描述
删除表中数据。使用WHERE
时会根据条件匹配进行删除,不使用WHERE
条件时会删除表中所有数据。
例子
删除lineitem
表中shipmode
等于AIR
的数据。
DELETE FROM lineitem WHERE shipmode = 'AIR';
两表关联删除
DELETE FROM lineitem
WHERE
orderkey IN (
SELECT
orderkey
FROM
orders
WHERE
priority = 'LOW'
);
删除表中所有数据
DELETE FROM lineitem
目前只有事务表才支持
DELETE
语法。
对于更新和删除尽量使用条件进行,否则可能占用集群资源,并且效率不高。
规则
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