MySQLはバージョン8.
VALUESステートメント
冒頭でも紹介しましたように、VALUESステートメントは1つ以上の行のセットをテーブルとして返すステートメントです。VALUESステートメントは、VALUESのあとにROW()で指定された1つ以上の行コンストラクタのリストで構成されます。早速実際に利用してみましょう、
mysql> VALUES ROW(1,2); +----------+----------+ | column_0 | column_1 | +----------+----------+ | 1 | 2 | +----------+----------+ 1 row in set (0.00 sec)
(column_
に対して(1 ,2)
が返されました。
複数行を返す場合は、ROW(),ROW()…
というように、行コンストラクタをカンマ区切りで指定することで表現することができます。また、列名はcolumn_
のように、常に0から始まるcolumn_
mysql> VALUES ROW(1,2),ROW(3,4); +----------+----------+ | column_0 | column_1 | +----------+----------+ | 1 | 2 | | 3 | 4 | +----------+----------+ 2 rows in set (0.01 sec)
この行コンストラクタには同じカラム内で型を混在することが可能で、関数も利用することができます。実際に型の違う組み合わせやNULL値、NOW()関数を利用して出力してみましょう。
mysql> VALUES ROW(1,2),ROW('abc', 0.345),ROW(NULL,NULL),ROW(current_user(),now()); +----------------+---------------------+ | column_0 | column_1 | +----------------+---------------------+ | 1 | 2 | | abc | 0.345 | | NULL | NULL | | root@localhost | 2023-03-22 06:26:23 | +----------------+---------------------+ 4 rows in set (0.00 sec)
また、LIMIT句を使ってVALUESステートメントで出力する行数の制限をすることも可能です。
mysql> VALUES ROW(1,2),ROW('abc', 0.345),ROW(NULL,NULL),ROW(current_user(),now()) LIMIT 1; +----------+----------+ | column_0 | column_1 | +----------+----------+ | 1 | 2 | +----------+----------+ 1 row in set (0.00 sec)
利用する際にROW()の中身のが空であったり、他の行コンストラクタと数が合わない場合は、エラーとなり利用できません。
mysql> 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. mysql> VALUES ROW(1,2),ROW(3); ERROR 1136 (21S01): Column count doesn't match value count at row 2
他のステートメントと組み合わせて利用してみる
VALUESステートメントはUNIONやJOINと組み合わせて利用することが可能です。これを利用することで、足りない行を補ったり、コードで管理しているマッピングデータをVALUESで表現してデータを参照するといったことが可能になります。
その他
VALUESステートメントのドキュメントにはORDER BY句の利用についてもかかれていますが、バージョン8.
TABLE ステートメント
TABLEステートメントはTABLE <table_
とすることで指定されたテーブルの行とカラムを返します。また、TABLEステートメントはORDER BY、LIMIT、OFFSETがサポートされており、行の並び替えや出力する行数の制限をすることができます。
mysql> TABLE t1; +------+ | flag | +------+ | 1 | | 0 | | 1 | | 1 | | 0 | +------+ 5 rows in set (0.00 sec)
SELECTステートメントと似た動作ですが、以下の点で違いがあります。
- SELECTステートメントはカラム名を指定することで表示するカラムを制限することができるが、TABLEステートメントは、常にテーブルのすべてのカラムが表示される
- SELECTステートメントはWHERE句を使って条件を指定することができるが、TABLE ステートメントはWHERE 句を利用して行を制限することができない
上記のような違いはありますが、UNIONやサブクエリとして利用することは可能です。
まとめ
今回は簡単ではありますが、VALUESステートメントとTABLEステートメントについて紹介しました。サクッと行の中身を見たい場合や行を補いたい場合に便利なので、もし利用できるタイミングがあれば利用してみてください。
VALUESステートメント、TABLEステートメントについての公式ドキュメントも準備されているので、こちらもぜひご一読ください。