Chapter 1. SQL の構文

Table of Contents
1.1. 語彙の構造
1.2. カラム
1.3. 値式
1.4. 語彙の優先順位

一般的な SQL の構文についての説明。

1.1. 語彙の構造

SQL 入力はコマンドのシーケンスによって 成っています。コマンドはトークンのシーケンス によって成っており、セミコロン (";")で終ります。 入力ストリームの終もやはりコマンドを終らせます。どのトークンが有効 かは特定のコマンドの構文によります。

トークンはキーワード識別子引用符で囲まれた識別子リテラル(もしくは定数)、または特別な 文字シンボルであることが可能です。トークンは通常空白(スペース、 タブ、改行)で区切られますが、あいまいさがなければ(一般的には 特別な文字が他のトークン型と隣接している場合のみです)必要ありません。

更に、コメントが入力された SQL にあっても 構いません。それらはトークンではありませんが、効果は空白と同じです。

例えば、下記は(構文的に)有効な SQL 入力です。

SELECT * FROM MY_TABLE;
UPDATE MY_TABLE SET A = 5;
INSERT INTO MY_TABLE VALUES (3, 'hi there');
これは 3 つのコマンドのシーケンスで、一行につき一つです(しかしそれが 要求されているわけではありません。一行に複数のコマンドを入力 することは可能で、その場合コマンドは実行できるように複数行に 分割されます。

SQL 構文は、どのトークンがコマンドを識別し、どれがオペランドや パラメータか、という意味ではあまり一貫していません。最初の いくつかのトークンは一般的にはコマンド名なので、上記の例では "SELECT", "UPDATE", そして "INSERT"コマンド について話しています。しかし例えばUPDATEコマンド はいつもSETトークンが特定の位置に現われることを 要求しますが、この特定のINSERTのバリエーション も、完結するためにはVALUESトークンを要求します。 それぞれのコマンドの正確な構文のルールは リファレンスマニュアルで説明されています。

1.1.1. 識別子とキーワード

上記の例に出てくる SELECT, UPDATE, もしくはVALUESのようなトークンは キーワードの一例で、キーワードとは SQL 言語のなかで固定された意味を持つ単語です。トークン MY_TABLEA識別子の一例です。これらは、使われる コマンドによって、テーブル、 カラム、または他のデータベースオブジェクトの名前を識別します。 したがって、これらは時にただ"名前"と呼ばれます。 キーワードと識別子は同じ語彙の構造を持つため、言語をしらなくては トークンが識別子なのかキーワードなのかわからないということに なります。キーワードの完全なリストはAppendix Bで見ることができます。

SQL 識別子とキーワードは アルファベット(a-z) かアンダースコア(_)で始まらなければいけません。 識別子またはキーワードの中で続く文字は、アルファベット、数字 (0-9)もしくはアンダースコア が使えますが、SQL 標準では数字を持つ、あるいはアンダースコアで 始まるか終るキーワードは定義されません。

システムはNAMEDATALEN-1 以上の識別子の文字は 使いません。さらに長い名前はコマンドでは書くことができますが、 短く切られてしまいます。デフォルトではNAMEDATALEN は 32 なので、識別子の最長は 31 です(しかしシステムが構築される 時にNAMEDATALENという名前は src/include/postgres_ext.hで変えることが できます。

識別子とキーワード名は大文字と小文字が関係ありません。したがって、

UPDATE MY_TABLE SET A = 5;
は下記と同じように書くことができます。
uPDaTE my_TabLE SeT a = 5;
慣例ではしばしばキーワードを大文字で、名前を小文字で書きます。 例えば下記のようになります。
UPDATE my_table SET a = 5;

二種類目の識別子もあります。区切り識別子 あるいは引用符付き識別子です。これは 文字の恣意のシーケンスを二重引用符(") で囲むことによって作られます。区切り識別子は常に識別子であり、 キーワードではありえません。ですから"select""select"という名前のカラムあるいはテーブルを問い合わせる ために使えますが、引用符のつかないselectは キーワードとして理解され、したがってテーブルもしくはカラム名が 期待される部分ではパースエラーを起こします。引用符付き識別子は 下記の例のように書くことができます。

UPDATE "my_table" SET "a" = 5;

引用符付き識別子は二重引用符以外ならどのような文字も含むことが できます。これは、そうでなければ不可能な、スペースやアンパサンド を含むようなテーブルもしくはカラム名を作ることが可能になります。 長さの制限はこれにもあてはまります。

引用符がつかない名前は常に 小文字に解釈されますが、識別子を引用符で囲むことによって 大文字小文字が区別されるようになります。例えば、識別子 FOO, foo そして "foo"Postgres には同じものとして解釈されますが、"Foo""FOO"は上記の三つともお互いとも 違ったものとして解釈されます。 [1]

1.1.2. 定数

Postgresには 4 つの 暗黙に型付けされる定数があります。 それらは、文字列、ビット文字列、整数、そして浮動小数点です。 定数は明示的な型で指定されることもでき、その場合システムによる より正確な表現と効率の良い操作が可能になります。暗黙の定数は 下記で説明されます。明示的な定数はのちほど出てきます。

1.1.2.1. 文字列定数

SQL の文字列定数は任意の文字のシーケンスを単一引用符で囲ったもので 'This is a string'のようになります。 SQL では二つ連続した単一引用符を入力することにより、単一引用符 を文字列の中に埋め込むことができます。 (例: 'Dianne''s horse'。) Postgresでは単一引用符は代わりに バックスラッシュ("\")で回避することもできます。 (例:'Dianne\'s horse')

C のスタイルのバックスラッシュコマンドも有効です。\b はバックスペース、\fは改頁、\n は新しい行、\rはキャリッジリターン、 \tはタブ、そしてxxx が八進数である場合、\xxx はそれに対応する ASCII コードを意味します。その他のバックスラッシュ に続く文字は遂字的に解釈されます。したがって、文字列定数に バックスラッシュを含む場合は、バックスラッシュを二つ入力 して下さい。

コードゼロを持つ文字は文字列定数の中には入れません。

少なくとも一つの改行を含む空白で 区切られた二つの文字列定数は連結され、文字列が一つの定数 で書かれているかのように効果的に扱われます。例えば、

SELECT 'foo'
'bar';
は下記と等しいですが、
SELECT 'foobar';
SELECT 'foo'      'bar';
は有効な構文ではありません。

1.1.2.2. ビット文字列定数

ビット文字列定数はB(大文字もしくは小文字) が引用符の始まりの前についている(間に空白はありません) 文字列定数のように見えます。例えばB'1001' のようになります。ビット文字列定数の中で許可される 文字は01のみです。 ビット文字列定数は、標準の文字列定数と同じように行を越えて 続けることが可能です。

1.1.2.3. 整数定数

SQL の整数定数は、小数点が付かない十進数(0 though 9)のシーケンス です。正当な値の範囲はどの整数データ型が使われているかに よりますが、普通の整数型は-2147483648 から +2147483647 までの範囲を受けつけます。(オプションの プラスもしくはマイナス記号は実際は別の単項演算子で、整数 定数の一部ではありません。)

1.1.2.4. 浮動小数点定数

浮動小数点定数は下記の一般的な形で認められます。

 
digits.[digits][e[+-]digits]
[digits].
digits[e[+-]
digits]
digitse[+-]
digits
digitsとあるのは一つ以上の十進数字です。 少なくとも一つの数字が小数点の前か後になくてはならず、 そのオプションを使うならeの後でなければ なりません。したがって、浮動小数点定数は、小数点もしくは 指数句(もしくは両方)の存在により整数定数から区別されます。 スペースや他の文字は定数の中に埋めこむことはできません。

下記は有効な浮動小数点定数のいくつかの例です。

3.5
4.
.001
5e2
1.925e-3

浮動小数点定数はDOUBLE PRECISION型です。 REALSQL文字列表記か Postgres型表記を使って 明示的に指定できます。

REAL '1.23'  -- string style
'1.23'::REAL -- Postgres (historical) style
     

1.1.2.5. 他の型の定数

任意の型の定数は下記の表記のいずれか を使って入力することが可能です。

 type 'string'
'string'::type
CAST ( 'string' AS type )
文字列の中の値はtypeと 呼ばれる型の入力変換ルーチンへと渡されます。結果は指示された型の 定数です。明示的な型キャストは、もし定数がどの型でなければ ならないかについて曖昧な点がなければ(例えば引数が オーバーロードされていない関数に渡される場合) 省略されても構いません。その場合自動的に型強制されます。

関数のような構文を使って型強制を指定することも可能です。

 typename ( value )
しかしこれは、名前が関数名としても有効な型にのみ使うことが できます。(例えば、double precisionは このように使うことができません。しかし同じ意味の float8はできます。)

::, CAST(), そして 関数呼び出し構文もやはり任意の式の型を指定するために使うことが できますが、type 'string'という形式はリテラル定数 を指定する場合にのみ使うことができます。

1.1.2.6. 配列定数

一般的な配列定数のフォーマットは下記のとおりです。

'{ val1 delim val2 delim ... }'
delimは型の区切り文字で pg_typeの項目に書かれているものです。 (全ての組み込み型にとって、これはコンマ "," です。) それぞれのvalは配列要素の型の定数 か部分配列です。配列定数の例は下記のようになります。
'{{1,2,3},{4,5,6},{7,8,9}}'
この定数は二次元で、整数の三つの部分配列によって成り立つ 3 * 3 の 配列です。

個々の配列要素は、空白の曖昧さの問題を回避するため、 二重引用符(") の間に置かれる事が出来ます。 引用符なしでは、配列値のパーサは最初の空白をとばしてしまいます。

(配列定数は実際は、前節で説明された一般的な型の定数の特別な事例 でしかありません。配列定数は始めは文字列として扱われ、配列 入力変換ルーチンに渡されます。明示的な型の指定が必要な場合が あるかもしれません。)

1.1.3. 演算子

演算子はNAMEDATALEN-1 までの(デフォルトは31です) 下記のリストからの文字のシーケンスです。

+ - * / < > = ~ ! @ # % ^ & | ` ? $

しかし、演算子の名前にはいくつかの制約があります。

  • "$" (ドル)は、複数文字の演算子名になることはできますが、 単一文字の演算子にはなることができません。

  • --/*は演算子名の 中に使うことができません。なぜならこれらはコメントの始まり と解釈されるからです。

  • 複数文字の演算子名は、その名前が少なくとも下記の文字の一つ以上を 含まない限り、 "+" もしくは "-" で終ることができません。

    ~ ! @ # % ^ & | ` ? $

    例えば、@-は演算子名として認められていますが、 *-は認められていません。この制限は Postgresが SQL に準拠する 問い合わせを、トークン同志の間に空白を要求すること無しに 解析することを許可します。

非 SQL 標準の演算子名を使う場合、通常は曖昧さを回避するため 隣り合った演算子を空白で区切る必要があります。例えば、もし "@" という 左単項演算子を定義したとするとX*@Yとは書けません。 Postgresが一つではなく二つの演算子名 として解釈することを確実にするためにはX* @Y と書かなくてはいけません。

1.1.4. 特殊文字

英数字ではないいくつかの文字は、演算子であることとは異なる 特殊な意味を持っています。使用法の詳細はそれぞれの構文要素が説明 されている場所で見つけることができます。この節の目的は単に存在 をアドバイスし、これらの文字の目的をまとめることにとどめます。

  • あとに数字が続くドルマーク($)は、関数定義 の本体中の位置パラメータを表すために使われます。他の文脈では ドルマークは演算子名の一部であるかもしれません。

  • 括弧(())は通常どおり式をまとめ優先するという 意味を持ちます。場合によっては括弧は、特定の SQL コマンド の固定構文の一部として要求されることがあります。

  • 大括弧([])は配列要素を選択するために 使われます。配列に関する詳しい情報はChapter 6 を見て下さい。

  • コンマ(,)は、リストの要素を区切るために 構文的構造体で使われることがあります。

  • セミコロン(;)は SQL コマンドの終りを意味します。 文字列定数または引用符付き識別子以外では、 コマンドの途中では使うことができません。

  • コロン(:)は配列から"スライス" を取りだすために使われます。(Chapter 6を見て下さい。) いくつかの SQL 通用語では(埋め込み SQL のような)、コロンは 変数名の接頭辞として使われます。

  • アスタリスク(*)はSELECT コマンドの中、あるいはCOUNT集計関数 と一緒に使われる場合、特殊な意味を持ちます。

  • ピリオド(.)は浮動小数点定数の中で使われ、 テーブルとカラム名を区切るために使われます。

1.1.5. コメント

コメントは二重ダッシュで始まる恣意の文字シーケンスで、行の終りまで 続きます。例えば下記のようになります。

    --これは標準 SQL92 のコメントです

代わりに、C 方式のブロックコメントも使えます。


/* ネスト付き
 * 複数行コメント /* ネストされたブロックコメント */
 */
 
その場合コメントは/*で始まり、マッチする */で終ります。これらのブロックコメントは、 SQL99 で指定されていますが C とは違い、ネストできるので、 既存のブロックコメントを含む可能性のある大きなコードのブロック をコメントアウトすることができます。

コメントは、更に構文解析が行われる前に入力ストリームから取り去られ、 空白によって効果的に置き換えられます。

Notes

[1]

Postgresが引用符のつかない名前を 小文字として解釈することは SQL 標準とは相容れないもので、 SQL 標準では引用符の付かない名前は大文字に解釈されるべきだと されています。したがって SQL 標準によれば、foo"FOO" と同じであるべきで、"foo" ではないはずなのです。もし移植可能なアプリケーションを書きたい ならば特定の名前は常に引用符で囲う、あるいは常に囲わない、 ということをお勧めします。