はじめに
SQLを業務で使用し始めて数か月。。
日々の開発の中で SELECT や INSERT を使う機会は増えてきましたが、
その中でふと「VALUESってちゃんと理解できているのか?」と疑問に思いました。
これまで VALUES は
「INSERTするときに書くもの」くらいの認識で使っていましたが、
調べてみると 単なる値の指定ではなく、“行(データ)を作る役割”がある ことが分かりました。
「なんとなく使っているけど、ちゃんと理解したい」という方の参考になれば嬉しいです。
VALUESとは何か
SQLの INSERT 文は、テーブルに 新しいレコード(行) を追加するときに使用され、フィールドに挿入するデータ値を指定するものです。
構文
INSERT INTO テーブル名 (カラム1, カラム2, ..., カラムN)
VALUES (値1, 値2, ..., 値N);
-
カラム1, カラム2 ...… 追加する 列の名前 -
値1, 値2 ...… その列に追加する 値 -
VALUESは 「これから追加する値のリストです」という意味です
実例
1.シンプル
-
usersテーブルに「Taro / 20」という1行のデータを追加
INSERT INTO users (name, age)
VALUES ('Taro', 20);
- カンマで区切ることで、複数行を一度に追加
INSERT INTO users (name, age)
VALUES ('Taro', 20),('Hanako', 25),('Jiro', 30);
2.カラムを省略するパターン
-- 省略ver
INSERT INTO users
VALUES ('Taro', 20);
-- 省略前ver
INSERT INTO users (name, age)
VALUES ('Taro', 20);
⚠️注意
- テーブルのカラム順と完全一致が必要になる
3. NULLと空文字の違い
- NULL:値が存在しない
INSERT INTO users (name, address)
VALUES ('Taro', NULL);
- 空文字=値はある
INSERT INTO users (name, address)
VALUES ('Taro', '');
VALUESにもう少し踏み込んでみる
初めの頃は単純に
VALUES = 値を入れるもの
だけで理解していましたが、本質的には
「行(レコード)を作る構文」
どういうことかというと
VALUES (1, 'A'), (2, 'B');
これは 「2行のテーブル」 を作っています
疑問:MYsqlとPostgreSQLで動作が違うのか?
「VALUES SQL」で検索するとMySQLとPostgreSQLで異なっている、というような検索結果を目にしました
内容をよくよく見て、理解できた部分をまとめます
1.共通点
どちらも以下は同じように扱うことができます
INSERT INTO users (name, age)
VALUES ('Taro', 20);
- VALUES = 挿入する値
- カラム順に対応
2.PostgreSQLの特徴
PostgreSQLでは VALUES を単体で使えます
VALUES (1, 'A'), (2, 'B');
-- 結果
column1 | column2
--------+--------
1 | A
2 | B
さらに次のような形で扱うことも可能
SELECT *
FROM (VALUES (1, 'A'), (2, 'B')) AS t(id, name);
-- 結果
id | name
----+------
1 | A
2 | B
🌱MySQLで同じ結果を得たい時はSELECT ... UNIONを使うことになります
SELECT 1 AS id, 'A' AS name
UNION ALL
SELECT 2, 'B';
3.MySQLの特徴(8.0以降)
VALUES ROW(1, 'A'), ROW(2, 'B');
-- 結果
column1 | column2
--------+--------
1 | A
2 | B
- ROW() が必要
- PostgreSQLほど柔軟ではない
終わりに
今回は、SQLの VALUES について整理してみました。
これまで何気なく使っていた VALUES ですが、単なる「値の指定」ではなく、行(レコード)を作る役割を持つ構文であることが分かりました。
また、MySQLとPostgreSQLで使い方に違いはあるものの、基本となる考え方は共通しています。
まずは「1行のデータを作る」という本質を押さえておくことが大切だと感じました。
今後は、単に書けるだけでなく、「なぜこう書くのか」を意識しながらSQLを使っていきたいと思います。
参考
