数据操作语言,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
删除匹配条件的,否则删除所有数据。
例子
删除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