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时会根据条件匹配进行删除,不使用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

规则

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