すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:VALUES

最終更新日:Aug 22, 2026

テーブルに少量のデータを挿入するには、INSERT … VALUES 文または VALUES TABLE 句を使用します。

INSERT INTO ステートメントを実行するには、宛先テーブルに対する ALTER 権限とソーステーブルに対する DESCRIBE 権限が必要です。権限の付与方法については、MaxCompute の権限をご参照ください。

機能

MaxCompute では、INSERT … VALUES または VALUES TABLE を使用して、テーブルに少量のデータを挿入できます。

操作

説明

INSERT … VALUES

テストでは、 INSERT … VALUES を使用してテーブルにテストデータをすばやく追加できます。

  • 少量のデータを挿入するには、INSERT … VALUES ステートメントを使用します。

  • より多くの行を挿入する場合は、Tunnel を使用して TXT または CSV ファイルをアップロードします。詳細については、「データのインポート」をご参照ください。

VALUES TABLE

挿入されたデータで単純な計算を行うには、VALUES TABLE 句を使用します。VALUES TABLE 句は INSERT 文および任意の DML 文で使用できます。以下の機能を提供します。

  • 物理テーブルを使用せずに任意のデータで複数行のテーブルをシミュレートし、その場で計算を実行できます。

  • SELECT * FROMUNION ALL を組み合わせるよりも効率的に、定数テーブルを構築します。

  • VALUES TABLE の特殊な形式を使用すると、FROM 句なしで SELECT 文を実行できます。SELECT リスト内の式は、他のテーブルのデータを参照できません。この機能は、匿名の 1 行 0 列の VALUES テーブルから選択することで実装されます。この方法は、DUAL テーブルを作成せずにユーザー定義関数 (UDF) やその他の関数をテストする場合に役立ちます。

制限事項

INSERT … VALUES または VALUES TABLE を使用してテーブルにデータを挿入する場合、INSERT OVERWRITE を使用して挿入先の列を指定することはできません。INSERT INTO を使用する必要があります。

構文

--INSERT … VALUES
INSERT INTO TABLE <table_name>
[PARTITION (<pt_spec>)][(<col1_name> ,<col2_name>,...)] 
VALUES (<col1_value>,<col2_value>,...),(<col1_value>,<col2_value>,...),...

--VALUES table
VALUES (<col1_value>,<col2_value>,...), (<col1_value>,<col2_value>,...) t(<col1_name>, <col2_name>, ...)

パラメーター

必須

説明

table_name

はい

データを挿入するテーブルの名前。テーブルはあらかじめ存在している必要があります。

pt_spec

いいえ

宛先パーティション。 形式は(partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...)です。 パーティションテーブルにデータを挿入する場合、このパラメーターが必須です。

col_name

いいえ

宛先列の名前。

col_value

いいえ

対応する列の値。複数の値はカンマ (,) で区切ります。定数または非定数式 (ユーザー定義関数や組み込み関数など) を指定できます。列に値が指定されていない場合、列のデフォルト値は NULL になります。

説明
  • VALUES 句は、ARRAY のような複雑なデータ型のリテラルをサポートしていません。ARRAY データを挿入するには、異なる構文が必要です。詳細については、「例 3」をご参照ください。

  • VALUES を使用して DATETIME または TIMESTAMP データを書き込む場合、VALUES で型名を指定する必要があります。例 4 をご参照ください。

  • 例 1: INSERT … VALUES を使用して、特定のパーティションにデータを挿入します。

    -- srcp という名前のパーティションテーブルを作成します。
    CREATE TABLE IF NOT EXISTS srcp (key STRING,value BIGINT) PARTITIONED BY (p STRING);
    
    -- srcp テーブルにパーティションを追加します。
    ALTER TABLE srcp ADD IF NOT EXISTS PARTITION (p='abc');
    
    -- srcp テーブルの 'abc' パーティションにデータを挿入します。
    INSERT INTO TABLE srcp PARTITION (p='abc') VALUES ('a',1),('b',2),('c',3);
    
    -- srcp テーブルをクエリします。
    SELECT * FROM srcp WHERE p='abc';
    
    -- 次の結果が返されます。
    +------------+------------+------------+
    | key        | value      | p          |
    +------------+------------+------------+
    | a          | 1          | abc        |
    | b          | 2          | abc        |
    | c          | 3          | abc        |
    +------------+------------+------------+
  • 例 2: INSERT … VALUES を使用して、パーティション値を指定せずにデータを挿入します。

    -- srcp という名前のパーティションテーブルを作成します。
    CREATE TABLE IF NOT EXISTS srcp (key STRING,value BIGINT) PARTITIONED BY (p STRING);
    
    -- パーティション値を指定せずに srcp テーブルにデータを挿入します。パーティション列は列リストに含まれます。
    INSERT INTO TABLE srcp PARTITION (p)(key,p) VALUES ('d','20170101'),('e','20170101'),('f','20170101');
    
    -- srcp テーブルをクエリします。
    SELECT * FROM srcp WHERE p='20170101';
    
    -- 次の結果が返されます。
    +------------+------------+------------+
    | key        | value      | p          |
    +------------+------------+------------+
    | d          | NULL       | 20170101   |
    | e          | NULL       | 20170101   |
    | f          | NULL       | 20170101   |
    +------------+------------+------------+
  • 例 3: SELECT 句を含む INSERT 文を使用して、複雑なデータ型のデータを挿入する。

    -- 複合データ型を持つ srcp という名前のパーティションテーブルを作成します。
    CREATE TABLE IF NOT EXISTS srcp (key STRING,value ARRAY<INT>) PARTITIONED BY (p STRING);
    
    -- srcp テーブルにパーティションを追加します。
    ALTER TABLE srcp ADD IF NOT EXISTS PARTITION (p='abc');
    
    -- srcp テーブルの 'abc' パーティションにデータを挿入します。
    INSERT INTO TABLE srcp PARTITION (p='abc') SELECT 'a', ARRAY(1, 2, 3);
    
    -- srcp テーブルをクエリします。
    SELECT * FROM srcp WHERE p='abc';
    
    -- 次の結果が返されます。
    +------------+------------+------------+
    | key        | value      | p          |
    +------------+------------+------------+
    | a          | [1,2,3]    | abc        |
    +------------+------------+------------+
  • 例 4: INSERT … VALUES を使用して DATETIME または TIMESTAMP データを書き込むには、VALUES 句で型名を前に付けてリテラルを明示的にキャストする必要があります。

    -- srcp という名前のパーティションテーブルを作成します。
    CREATE TABLE IF NOT EXISTS srcp (key DATETIME, value TIMESTAMP) PARTITIONED BY (p STRING);
    
    -- srcp テーブルにパーティションを追加します。
    ALTER TABLE srcp ADD IF NOT EXISTS PARTITION (p='abc');
    
    -- srcp テーブルの 'abc' パーティションにデータを挿入します。
    INSERT INTO TABLE srcp PARTITION (p='abc') VALUES (datetime'2017-11-11 00:00:00', TIMESTAMP'2017-11-11 00:00:00.123456789');
    
    -- srcp テーブルをクエリします。
    SELECT * FROM srcp WHERE p='abc';
    
    -- 次の結果が返されます。
    +---------------------+-------------------------+-----+
    | key                 | value                   | p   |
    +---------------------+-------------------------+-----+
    | 2017-11-11 00:00:00 | 2017-11-11 00:00:00.123 | abc |
    +---------------------+-------------------------+-----+
  • 例 5: VALUES table を使用してデータを挿入する。

    -- srcp という名前のパーティションテーブルを作成します。
    CREATE TABLE IF NOT EXISTS srcp (key STRING,value BIGINT) PARTITIONED BY (p STRING);
    
    -- srcp テーブルにデータを挿入します。
    INSERT INTO TABLE srcp PARTITION (p) SELECT concat(a,b), length(a)+length(b),'20170102' FROM VALUES ('d',4),('e',5),('f',6) t(a,b);
    
    -- srcp テーブルをクエリします。
    SELECT * FROM srcp WHERE p='20170102';
    
    -- 次の結果が返されます。
    +------------+------------+------------+
    | key        | value      | p          |
    +------------+------------+------------+
    | d4         | 2          | 20170102   |
    | e5         | 2          | 20170102   |
    | f6         | 2          | 20170102   |
    +------------+------------+------------+

    データベースは、VALUES リストの値から列のデータ型 (この場合は STRING と BIGINT) を推測します。 VALUES (…), (…) t(a, b) は、t という名前で列 ab を持つ一時テーブルを定義します。

  • 例 6: SELECT * FROMUNION ALL を使用する代わりに、VALUES テーブルを使用して定数テーブルを構築します。

    SELECT 1 c UNION ALL SELECT 2 c;
    -- 上記のステートメントは次のステートメントと同等です。
    SELECT * FROM VALUES (1), (2) t(c);
    
    -- 次の結果が返されます。
    +------------+
    | c          |
    +------------+
    | 1          |
    | 2          |
    +------------+
  • 例 7: VALUES テーブルの特殊な形式を使用して、FROM 句を使用せずにデータを挿入します。

    -- srcp という名前のパーティションテーブルを作成します。
    CREATE TABLE IF NOT EXISTS srcp (key STRING,value BIGINT) PARTITIONED BY (p STRING);
    
    -- srcp テーブルにデータを挿入します。
    INSERT INTO TABLE srcp PARTITION (p) SELECT ABS(-1), LENGTH('abc'), GETDATE();
    
    -- srcp テーブルをクエリします。
    SET odps.sql.allow.fullscan=true;
    SELECT * FROM srcp;
    
    -- 結果の例:
    +------------+------------+---------------------+
    | key        | value      | p                   |
    +------------+------------+---------------------+
    | 1          | 3          | 2024-12-10 16:58:56 |
    +------------+------------+---------------------+
  • 例 8:非定数式の使用

    SELECT * FROM VALUES (GETDATE()),(TO_DATE('20190101', 'yyyyMMdd')),(LASTDAY(DATETIME '2019-01-01 01:10:00')) t(d);

    次の結果が返されます。

    +---------------------+
    | d                   |
    +---------------------+
    | 2024-12-10 16:52:36 |
    | 2019-01-01 00:00:00 |
    | 2019-01-31 00:00:00 |
    +---------------------+