Previous PageTable Of ContentsNext Page

3.1 SQLの構文

本章ではSQLの一般的な構文について説明します。本章の内容は、データの定義や変更のためにSQLコマンドを適用する方法について詳しく説明する以後の章を理解する上での基礎となります。

3.1.1 語彙の構成

SQLの入力は、ひと続きのコマンドからなります。コマンドはトークンが繋がったもので構成され、最後はセミコロン(";")で終わります。入力ストリームの終了もやはりコマンドを終わらせます。どのトークンが有効かは特定のコマンドの構文によります。

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

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

例えば、以下のものは(構文的に)正しいSQLの入力です。

    SELECT * FROM MY_TABLE;  
    UPDATE MY_TABLE SET A = 5;  
    INSERT INTO MY_TABLE VALUES (3, 'hi there');

この例は1行に1つのコマンドを記述した、3つのコマンドが連続しています(必ずしも1つのコマンドを1行で書く必要はありません。 1行に複数のコマンドを入力することも可能ですし、1つのコマンドを複数行に分けて記述することも可能です)。

SQL構文は、どのトークンがコマンドを識別し、どれがオペランドでどれがパラメータかに関してはさほど首尾一貫していません。最初のいくつかのトークンは一般にコマンド名です。 したがって、上記の例において"SELECT"、"UPDATE"、"INSERT"コマンドについて通常説明することになります。しかし、例えばUPDATEコマンドでは、SETトークンが特定の位置に常に記述されなければなりませんし、この例で使われているINSERTコマンドを完結するためにはVALUESトークンが必要です。それぞれのコマンドの正確な構文規則は第3.3章で説明されています。

3.1.2 識別子とキーワード

上記の例に出てくるSELECTUPDATE、もしくはVALUESのようなトークンは、キーワードの一例です。キーワードとは、SQL言語で決まった意味を持っている単語です。 MY_TABLEトークンやAトークンは識別子の一例です。これらは、使われるコマンドによって、テーブル、列、他のデータベースオブジェクトの名前を識別します。したがって、単に"名前"と呼ばれることもあります。キーワードと識別子は同じ語彙の構造を持つため、言語を知らなくてはトークンが識別子なのかキーワードなのかわからないということになります。

SQL識別子とキーワードは、文字(a-zもしくはA-Z)で始まらなければいけません。識別子またはキーワードの中で続く文字は、文字、アンダースコア、数字(0-9)、ドル記号($)、シャープ記号(#)を使用することができます。

    識別子とキーワード名は大文字と小文字を区別しません。したがって、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;

引用符付き識別子は、文字コード0以外であればどのような文字でも使えます(二重引用符を含めたい場合は、二重引用符を2つ入力します)。この決まりがあることによって、普段使えない空白やアンパサンド(&)を含むテーブル名や列名を作ることが可能です。この場合においても長さの制限は適用されます。

引用符が付かない名前は常に小文字に解釈されますが、識別子を引用符で囲むことによって大文字と小文字が区別されるようになります。例えば、識別子FOOfoo"foo"はPostgres Plusでは同じものとして解釈されますが、"Foo""FOO"は、これら3つとも、またお互いに違ったものとして解釈されます(Postgres Plusが引用符の付かない名前を小文字として解釈することはOracle互換ではありません。Oracleでは引用符の付かない名前は大文字に解釈されます。したがってOracleでは、foo"FOO"と同じで、"foo"とは異なります。もし移植可能なアプリケーションを書きたいならば、特定の名前は常に引用符で囲むか、あるいはまったく囲まないかのいずれかに統一することをお勧めします)。

3.1.3 定数

Postgres Plusには、2つの暗黙に型付けされる定数があります。文字列と数字です。定数は明示的な型で指定することもでき、その場合はシステムによる、より正確な表現と効率の良い操作が可能になります。こうした他の方法については後ほど説明します。

3.1.3.1 文字列定数

SQLにおける文字列定数は、単一引用符(')で括られた任意の文字の並びです。例えば、'This is a string'です。文字列定数内の単一引用符の記述方法は、2つ続けて単一引用符を記述することです。例えば、'Dianne''s horse'です。二重引用符(")とは同一ではない点に注意してください。

3.1.3.2 数値定数

数値定数は下記の一般的な形で受け付けられます。

    digits  
    digits.[digits][e[+-]digits]  
    [digits].digits[e[+-]digits]  
    digitse[+-]digits

ここでdigitsは1つ以上の10進数字(0~9)です。小数点を使用する場合は、少なくとも1つの数字が小数点の前か後になくてはなりません。指数記号eの付く形式を使う場合にはeの後に少なくとも1つの数字がなければいけません。 空白や他の文字は、定数の中に埋め込むことはできません。プラスまたはマイナスの符号を先頭につけても、定数の一部とはみなされないことに注意してください。これらの符号は定数に適用される演算子とみなされます。

下記は有効な数値定数のいくつかの例です。

    42
    3.5
    4.
    .001
    5e2
    1.925e-3

小数点も指数も含まない数値定数の場合、まずその値がINTEGER型(32ビット)に適合すればINTEGER型であるとみなされます。そうでない場合、BIGINT型(64ビット)で適合すればBIGINT型とみなされます。どちらでもない場合は、NUMBER型とみなされます。定数が小数点または指数あるいはその両方を含む場合は、常に最初にNUMBER型であるとみなされます。

数値定数に最初に割り振られるデータ型は、型解決アルゴリズムの開始点に過ぎません。ほとんどの場合、定数には文脈に基づいて自動的に正しい型が割り振られます。必要であれば、特定のデータ型を次の章で説明するようにキャストして、数値がそのデータ型として解釈されるように強制することができます。

3.1.3.3 他の型の定数

任意の型の定数は下記の表記を使って入力することができます。

    CAST('string' AS type)

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

CASTは任意の式の実行時の型変換を指定するために使うこともできます。

3.1.4 コメント

コメントは二重ハイフンで始まる任意の文字の並びで、行の終わりまで続きます。例えば以下のようになります。

    -- This is a standard SQL comment

他にも、C言語様式のブロックコメントも使用できます。

    /* multiline comment  
     * block  
     */

コメントは/*で始まり、対応する*/で終わります。

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

Previous PageTable Of ContentsNext Page