sql >> データベース >  >> RDS >> Mysql

MySQLのVALUESステートメント

    MySQLでは、VALUES ステートメントは、1つ以上の行のセットをテーブルとして返します。基本的に、これはSQL標準に準拠したテーブル値コンストラクターであり、スタンドアロンのSQLステートメントとしても機能します。

    VALUES ステートメントはMySQL8.0.19で導入されました。

    構文

    公式の構文は次のようになります:

    VALUES row_constructor_list [ORDER BY column_designator] [LIMIT number]
    
    row_constructor_list:
        ROW(value_list)[, ROW(value_list)][, ...]
    
    value_list:
        value[, value][, ...]
    
    column_designator:
        column_index

    これがどのように機能するかを示す簡単な例です:

    VALUES ROW(1, 2, 3), ROW(4, 5, 6);

    結果:

    +----------+----------+----------+
    | column_0 | column_1 | column_2 |
    +----------+----------+----------+
    |        1 |        2 |        3 |
    |        4 |        5 |        6 |
    +----------+----------+----------+

    結果の列には、暗黙的にcolumn_0という名前が付けられます。 、column_1column_2 、など、常に0で始まります 。

    ROW() 行コンストラクター句により、結果のテーブルに新しい行が作成されます。

    ROW() 括弧で囲まれた1つ以上のスカラー値の値リストが含まれます。値は、任意のMySQLデータ型のリテラル、またはスカラー値に解決される式にすることができます。

    したがって、次のこともできます。

    VALUES ROW("Black", "Cat"), ROW("Yellow", "Dog");

    結果:

    +----------+----------+
    | column_0 | column_1 |
    +----------+----------+
    | Black    | Cat      |
    | Yellow   | Dog      |
    +----------+----------+

    または次のようなもの:

    VALUES 
       ROW(CURDATE(), DATE_ADD(CURDATE(), INTERVAL 10 YEAR)),
       ROW(CURTIME(), DATE_ADD(CURTIME(), INTERVAL 2 HOUR));

    結果:

    +---------------------+---------------------+
    | column_0            | column_1            |
    +---------------------+---------------------+
    | 2022-02-17 00:00:00 | 2032-02-17 00:00:00 |
    | 2022-02-17 09:30:46 | 2022-02-17 11:30:46 |
    +---------------------+---------------------+

    ORDER BY 条項

    この構文では、ORDER BYを使用できます。 結果を並べ替えるための句。ただし、ORDER BY 句は、実行しようとしたシステムでは期待どおりに機能しません。

    すべきことは次のとおりです。 作業(MySQLドキュメントによる):

    VALUES ROW(1,-2,3), ROW(5,7,9), ROW(4,6,8) ORDER BY column_1;

    結果:

    +----------+----------+----------+
    | column_0 | column_1 | column_2 |
    +----------+----------+----------+
    |        1 |       -2 |        3 |
    |        4 |        6 |        8 |
    |        5 |        7 |        9 |
    +----------+----------+----------+

    しかし、私がそのステートメントを実行した2つのシステム(Ubuntu20.04.3のMySQL8.0.26とMacOSMontereryのMySQL8.0.27 Homebrew)では、ORDER BY 句はまったく機能しません。おそらくこれはバグです。

    LIMIT 条項

    LIMITを使用できます 出力される行数を制限する句:

    VALUES 
       ROW('Black', 'Cat'), 
       ROW('Yellow', 'Dog'), 
       ROW('Aqua', 'Fish')
    LIMIT 2;

    結果:

    +----------+----------+
    | column_0 | column_1 |
    +----------+----------+
    | Black    | Cat      |
    | Yellow   | Dog      |
    +----------+----------+

    SELECTを使用 ステートメント

    VALUESを使用することもできます SELECT内のステートメント VALUESのようにステートメント テーブルコンストラクタは実際のテーブルでした:

    SELECT
       PetName,
       PetType
    FROM
       (VALUES 
          ROW(1, "Fluffy", "Cat"),
          ROW(2, "Bark", "Dog"),
          ROW(3, "Gallop", "Horse")
       ) AS Pets(PetId, PetName, PetType)
    WHERE PetId = 2;

    結果:

    +---------+---------+
    | PetName | PetType |
    +---------+---------+
    | Bark    | Dog     |
    +---------+---------+

    ROW() 空にすることはできません

    INSERTでソースとして使用されていない限り、行コンストラクターを空にすることはできません。 声明。

    空の行コンストラクターを使用しようとすると、次のようになります。

    VALUES ROW();

    結果:

    ERROR 3942 (HY000): Each row of a VALUES clause must have at least one column, unless when used as source in an INSERT statement.

    ROW() ヌル値を含めることができます

    行コンストラクターを空にすることはできませんが、Null値を含めることができます:

    VALUES ROW(null, null);

    結果:

    +----------+----------+
    | column_0 | column_1 |
    +----------+----------+
    |     NULL |     NULL |
    +----------+----------+
    ROW() 同じ数の値が含まれている必要があります

    ROW() 同じVALUES ステートメントの値リストには、同じ数の値が含まれている必要があります。

    したがって、これを行うことはできません:

    VALUES ROW(1, 2), ROW(3);

    結果:

    ERROR 1136 (21S01): Column count doesn't match value count at row 2

    VALUESの使用 データを挿入するには

    VALUESを使用できます INSERTと組み合わせたステートメント およびREPLACE テーブルにデータを挿入するステートメント。

    例:

    INSERT INTO Pets VALUES 
       ROW(9, 3, 1, 'Woof', '2020-10-03'), 
       ROW(10, 4, 5, 'Ears', '2022-01-11');

    これにより、Petsというテーブルに2つの行が挿入されました。 。これは、テーブルがすでに存在していることを前提としています。

    これで、SELECTを使用できます テーブルの新しい値を確認するステートメント:

    SELECT * FROM Pets
    WHERE PetId IN (9, 10);

    結果:

    +-------+-----------+---------+---------+------------+
    | PetId | PetTypeId | OwnerId | PetName | DOB        |
    +-------+-----------+---------+---------+------------+
    |     9 |         3 |       1 | Woof    | 2020-10-03 |
    |    10 |         4 |       5 | Ears    | 2022-01-11 |
    +-------+-----------+---------+---------+------------+

    上記のINSERT ステートメントは、次のことを行うのと同じです。

    INSERT INTO Pets VALUES 
       (9, 3, 1, 'Woof', '2020-10-03'), 
       (10, 4, 5, 'Ears', '2022-01-11');
    テーブルを作成するとき

    VALUES CREATE TABLE … SELECTのソーステーブルの代わりにステートメントを使用することもできます およびCREATE VIEW … SELECT ステートメント。

    次に例を示します:

    CREATE TABLE t1 VALUES ROW(1,2,3), ROW(4,5,6);
    SELECT * FROM t1;

    結果:

    +----------+----------+----------+
    | column_0 | column_1 | column_2 |
    +----------+----------+----------+
    |        1 |        2 |        3 |
    |        4 |        5 |        6 |
    +----------+----------+----------+

    これも可能です:

    CREATE TABLE t2 SELECT * FROM (VALUES ROW(1,2,3), ROW(4,5,6)) AS v;
    SELECT * FROM t2;

    結果:

    +----------+----------+----------+
    | column_0 | column_1 | column_2 |
    +----------+----------+----------+
    |        1 |        2 |        3 |
    |        4 |        5 |        6 |
    +----------+----------+----------+

    これら2つのCREATE TABLE ステートメントは次のようなものです:

    CREATE TABLE t3 SELECT * FROM t2;
    SELECT * FROM t3;

    結果:

    +----------+----------+----------+
    | column_0 | column_1 | column_2 |
    +----------+----------+----------+
    |        1 |        2 |        3 |
    |        4 |        5 |        6 |
    +----------+----------+----------+

    この場合、私はt2を使用しました VALUESで値を提供する代わりに、ソーステーブルとしてテーブル ステートメント。


    1. SQL Serverのデータベースですべてのチェックキーと外部キーの制約を有効にする方法(T-SQLの例)

    2. GroovySQLOracle配列関数/プロシージャアウトパラメータの登録

    3. CXPACKET待機の詳細:歪んだ並列処理

    4. スーパーユーザーの役割がないと拡張機能を作成できません