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_1
、column_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
で値を提供する代わりに、ソーステーブルとしてテーブル ステートメント。