SQLのvaluesについてまとめています。
SQLのvaluesは、insert文で挿入する値を指定する
例えば、以下のSQLは、employees(社員テーブル)に、新しくデータを一行挿入するSQLです。
mysql> insert into employees (emp_no, birth_date, first_name, last_name, gender, hire_date) values (999999,'2000-01-01', 'Tarou', 'Yamada', 'M','2015-04-01'); Query OK, 1 row affected (0.06 sec) mysql> select * from employees where emp_no=999999; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 999999 | 2000-01-01 | Tarou | Yamada | M | 2015-04-01 | +--------+------------+------------+-----------+--------+------------+ 1 row in set (0.00 sec)
この記述法は、カラムの並びをそのまま記述できるため、以下の様なCSVファイルをSQLに加工してデータベースにinsertする場合に便利です。
10001,1953-09-02,Georgi,Facello,M,1986-06-26 10002,1964-06-02,Bezalel,Simmel,F,1985-11-21 10003,1959-12-03,Parto,Bamford,M,1986-08-28 10004,1954-05-01,Chirstian,Koblick,M,1986-12-01 10005,1955-01-21,Kyoichi,Maliniak,M,1989-09-12 10006,1953-04-20,Anneke,Preusig,F,1989-06-02 10007,1957-05-23,Tzvetan,Zielinski,F,1989-02-10 10008,1958-02-19,Saniya,Kalloufi,M,1994-09-15 10009,1952-04-19,Sumant,Peac,F,1985-02-18 10010,1963-06-01,Duangkaew,Piveteau,F,1989-08-24
上記のCSVファイルをemployeesテーブルへのinsert文に加工するとこうなります。
insert into employees (emp_no, birth_date, first_name, last_name, gender, hire_date) values (10001,1953-09-02,Georgi,Facello,M,1986-06-26), (10002,1964-06-02,Bezalel,Simmel,F,1985-11-21), (10003,1959-12-03,Parto,Bamford,M,1986-08-28), (10004,1954-05-01,Chirstian,Koblick,M,1986-12-01), (10005,1955-01-21,Kyoichi,Maliniak,M,1989-09-12), (10006,1953-04-20,Anneke,Preusig,F,1989-06-02), (10007,1957-05-23,Tzvetan,Zielinski,F,1989-02-10), (10008,1958-02-19,Saniya,Kalloufi,M,1994-09-15), (10009,1952-04-19,Sumant,Peac,F,1985-02-18), (10010,1963-06-01,Duangkaew,Piveteau,F,1989-08-24)
【関連記事】
▶MySQL Insert サンプルコード集 一文で一括挿入する方法とは?
PostgreSQLでは、valuesを単体のSQLとして使える
PostgreSQLでは、valuesをselect文のように使用することができます。
postgres=# values (1,2,3); column1 | column2 | column3 ---------+---------+--------- 1 | 2 | 3 (1 row)
列名は自動的に、column1, column2, column3…となります。なお、複数行、複数列を指定することも可能です。下記の例では、列が2つ、行が3つの表を返します。小さな表をSQL内で一時的に生成する場合に便利ですね。
postgres=# VALUES (1, 'one'), (2, 'two'), (3, 'three'); column1 | column2 ---------+--------- 1 | one 2 | two 3 | three (3 rows)
上記のSQLは、UNIONを使って記述すると、以下のようになります。
postgres=# VALUES (1, 'one'), (2, 'two'), (3, 'three'); column1 | column2 ---------+--------- 1 | one 2 | two 3 | three (3 rows)
なお、MySQLではvaluesを単体で使おうとするとSyntax Errorとなります。
mysql> values (1,2,3); ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(1,2,3)' at line 1
PostgreSQLの公式ドキュメントによると、valuesはSQL標準に従うとありますが、valuesの単体使用についてはデータベース管理ソフト毎に扱いが異なるようです。
【関連記事】
▶SQLとはどういうもの? 独自拡張と標準SQLの大きな違いって、何?
PostgreSQLでは、valuesをサブクエリのように使ってSQLを記述することも可能です。
SELECT f.* FROM films f, (VALUES('MGM', 'Horror'), ('UA', 'Sci-Fi')) AS t (studio, kind) WHERE f.studio = t.studio AND f.kind = t.kind; UPDATE employees SET salary = salary * v.increase FROM (VALUES(1, 200000, 1.2), (2, 400000, 1.4)) AS v (depno, target, increase) WHERE employees.depno = v.depno AND employees.sales >= v.target;
ただし、FROM内で使用する場合は、as句を使って別名をつけることが必須になります。
まとめ
- valuesは、insert文で挿入する値を記述するために使う
- PostgreSQLでは、valuesを単体でselect文のように使うことが可能
- values自体は標準SQLだが、単体使用できるかどうかはデータベース管理ソフトごとに異なる