.\\" auto-generated by docbook2man-spec $Revision: 1.2 $
.TH "VALUES" "" "2007-05-04" "SQL 言語" "SQLコマンド"
.SH NAME
VALUES \- 行セットを計算します

.SH SYNOPSIS
.sp
.nf
VALUES ( \fIexpression\fR [, ...] ) [, ...]
    [ ORDER BY \fIsort_expression\fR [ ASC | DESC | USING \fIoperator\fR ] [, ...] ]
    [ LIMIT { \fIcount\fR | ALL } ]
    [ OFFSET \fIstart\fR ]
.sp
.fi
.SH "説明"
.PP
\fBVALUES\fR は、値の式で指定された行あるいは行の集合を計算します。
大きなコマンドの中で``定数テーブル''を作成するために使用することが多いですが、
それ単独で使用することも可能です。
.PP
複数行を指定した場合は、すべての行の要素数が同じでなければなりません。
できあがるテーブルのカラムのデータ型を決定するには、
明示的に指定されている型やそのカラムに登場する式から推測できる型を組み合わせて使用します。
これは UNION と同じ方式です
(in the documentation を参照ください)。
.PP
大きなコマンドの中において、
\fBSELECT\fR が文法上使える場所ならどこでも \fBVALUES\fR を使用することができます。
なぜなら、これは文法上は \fBSELECT\fR と同じ扱いだからです。
ORDER BY、LIMIT そして OFFSET 句で \fBVALUES\fR コマンドを使用することができます。
.SH "パラメータ"
.TP
\fB\fIexpression\fB\fR
定数あるいは式です。これを計算した結果が、
表 (行セット) の中の指定した場所に挿入されます。
\fBVALUES\fR リストを \fBINSERT\fR の最上位レベルで使用する場合は、
\fIexpression\fR を DEFAULT
で置き換えることができます。これは、そのカラムのデフォルト値を挿入することを表します。
他の場所で \fBVALUES\fR を使用する場合には、
DEFAULT は使用できません。
.TP
\fB\fIsort_expression\fB\fR
式あるいは整数の定数で、結果の行をソートする方法を表します。
この式は、\fBVALUES\fR の結果のカラムを column1、column2
などのように表します。詳細は ORDER BY句 [\fBselect\fR(l)] を参照ください。
.TP
\fB\fIoperator\fB\fR
ソート用の演算子です。詳細は
ORDER BY句 [\fBselect\fR(l)] を参照ください。
.TP
\fB\fIcount\fB\fR
返す行の最大数です。詳細は
LIMIT句 [\fBselect\fR(l)] を参照ください。
.TP
\fB\fIstart\fB\fR
結果を返す際に読み飛ばす行数です。詳細は
LIMIT句 [\fBselect\fR(l)] を参照ください。
.SH "注釈"
.PP
\fBVALUES\fR で大量の行を扱うことは避けるべきです。
メモリ不足や性能の劣化を生じさせることになってしまいます。
\fBVALUES\fR を \fBINSERT\fR の中で使用する場合は特別です。
(カラムの型は \fBINSERT\fR 先のテーブルからわかるので、
\fBVALUES\fR のリストを調べて型を推測する必要がないからです)
そのため、他の場面に比べて大きなリストを扱っても実用に耐えます。
.SH "例"
.PP
必要最小限の \fBVALUES\fR コマンドはこのようになります。
.sp
.nf
VALUES (1, 'one'), (2, 'two'), (3, 'three');
.sp
.fi
これは、カラムが二つで行が三つの表を返します。事実上、これは次と同じことです。
.sp
.nf
SELECT 1 AS column1, 'one' AS column2
UNION ALL
SELECT 2, 'two'
UNION ALL
SELECT 3, 'three';
.sp
.fi
.PP
通常は、\fBVALUES\fR は大きな SQL コマンドの内部で使用します。
最もよくあるのは、\fBINSERT\fR での使用です。
.sp
.nf
INSERT INTO films (code, title, did, date_prod, kind)
    VALUES ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');
.sp
.fi
.PP
\fBINSERT\fR 内で使用する場合には、\fBVALUES\fR
のリストに DEFAULT を指定することができます。
これは、値を具体的に指定するのではなくそのカラムのデフォルトを使用することを表します。
.sp
.nf
INSERT INTO films VALUES
    ('UA502', 'Bananas', 105, DEFAULT, 'Comedy', '82 minutes'),
    ('T_601', 'Yojimbo', 106, DEFAULT, 'Drama', DEFAULT);
.sp
.fi
.PP
\fBVALUES\fR は、副\fBSELECT\fR が書ける場所ならどこでも使用することができます。
例えば FROM 句の中などでも使えます。
.sp
.nf
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;
.sp
.fi
\fBVALUES\fR を FROM 句の中で使用する場合には、
AS 句が必須となることに注意しましょう。これは \fBSELECT\fR の場合と同様です。
AS 句ですべてのカラムの名前を指定する必要はありませんが、指定しておくことをお勧めします
(\fBVALUES\fR のデフォルトのカラム名は、PostgreSQL
においては column1、column2 のようになります。
しかし、他のデータベースシステムでは異なるかもしれません)。
.PP
\fBVALUES\fR を \fBINSERT\fR の中で使用する場合は、
値の型が挿入先カラムのデータ型に自動変換されます。
それ以外の場面で使用する際には、正しいデータ型を指定する必要があるでしょう。
値がすべてクォートされたリテラル定数である場合は、最初の値にだけ型を指定しておけば十分です。
.sp
.nf
SELECT * FROM machines
WHERE ip_address IN (VALUES('192.168.0.1'::inet), ('192.168.0.10'), ('192.168.1.43'));
.sp
.fi
.sp
.RS
.B "Tip:"
単に IN を試したいのなら、上のような \fBVALUES\fR クエリを使用するよりも
IN のスカラリスト形式を使用するほうがよいでしょう。
スカラメソッドのリストのほうが記述量が減りますし、たいていはより効率的になります。
.RE
.sp
.SH "互換性"
.PP
\fBVALUES\fR は SQL 標準に従います。ただし、
LIMIT および OFFSET
は PostgreSQL の拡張です。
.SH "関連項目"
INSERT [\fBinsert\fR(l)], SELECT [\fBselect\fR(l)]
