]ここでfrom_itemは以下のいずれかです。]またwith_queryは以下の通りです。]説明SELECTは0個以上のテーブルから行を返します。SELECTの一般的な処理は以下の通りです。WITHリスト内のすべての問い合わせが計算されます。これらは実質、FROMリスト内から参照可能な一時テーブルとして提供されます。FROM内で2回以上参照されるWITH問い合わせは一度のみ計算されます。(後述のWITH句を参照してください。(FROMリストの要素は実テーブルか仮想テーブルのいずれかです)。(後述のFROM句を参照してください)。(後述のWHERE句を参照してください)。BY句が指定された場合、1つまたは複数の値が条件に合う行ごとにグループに組み合わせて出力されます。BY句とHAVING句を参照してください)。(後述のSELECTリストを参照してください)。DISTINCTは結果から重複行を取り除きます。ONは指定した全ての式に一致する行を取り除きます。ALLでは、重複行も含め、全ての候補行を返します(これがデフォルトです。詳しくは、後述のDISTINCT句を参照してください)。UNION、INTERSECT、EXCEPT演算子を使用すると、複数のSELECT文の出力を1つの結果集合にまとめることができます。UNION演算子は、両方の結果集合に存在する行と、片方の結果集合に存在する行を全て返します。INTERSECT演算子は、両方の結果集合に存在する行を返します。EXCEPT演算子は、最初の結果集合にあり、2番目の結果集合にない行を返します。ALLが指定されない限り、いずれの場合も、重複する行は取り除かれます。無意味なDISTINCTという単語を付けて、明示的に重複行を除去することを指定することができます。SELECT自体はALLがデフォルトですが、この場合はDISTINCTがデフォルトの動作であることに注意してください。(後述のUNION句、INTERSECT句、EXCEPT句を参照してください。BY句が指定された場合、返される行は指定した順番でソートされます。BY句を参照してください)。(詳しくは、後述のLIMIT句を参照してください)。SHARE句を参照してください)。SELECTコマンド内で使われる列それぞれに対するSELECT権限が必要です。SHAREを使用するには、さらに、(選択できるように各テーブルで少なくとも1列に対する)UPDATE権限が必要です。パラメータWITH句WITH句により主問い合わせ内で名前により参照可能な、1つ以上の副問い合わせを指定することができます。副問い合わせは実質的に主問い合わせの間の一時的なテーブルかビューのように動作します。各副問い合わせはSELECT、INSERT、UPDATE、DELETEにすることができます。WITH内でデータ変更文(INSERT、UPDATE、DELETE)を記述する場合は、RETURNING句を含めることが有用です。主問い合わせで読み取られる一時テーブルを形成するのは、RETURNINGの出力であり、文が変更する背後のテーブルではありません。RETURNINGを省くと、文は同様に実行されますが、出力を生成しませんので、主問い合わせでテーブルとして参照することができません。(スキーマ修飾がない)名前を各WITH問い合わせで指定しなければなりません。省略可能ですが、列名のリストを指定することもできます。これを省略すると、列名は副問い合わせから推定されます。RECURSIVEが指定されると、SELECT副問い合わせは自身で名前により参照することができます。した副問い合わせは以下のような形式でなければなりません。recursive_termここで再帰的な自己参照はUNIONの右辺に現れなければなりません。問い合わせ当たり1つの再帰的な自己参照のみが許されます。再帰的なデータ変更文はサポートされていませんが、データ変更文で再帰的なSELECTの結果を使用することができます。例は項7.8を参照してください。RECURSIVEには他にも、WITH問い合わせが順序通りでなくても構わないという効果があります。問い合わせはリストの後にある別のものを参照することができます。(しかし巡回する参照や相互的な参照は実装されていません。RECURSIVEがないと、WITH問い合わせは主問い合わせが共通するWITH問い合わせのうち、WITHリストの前方にあるもののみを参照することができます。WITH問い合わせの鍵となる特性は、これらを主問い合わせが複数回参照していたとしても、主問い合わせの実行当たり一度のみ評価される点です。データ変更文は、主問い合わせがその出力のすべてまたは一部を読み取るかに関係なく、本当に一度のみ実行されることが保証されています。主問い合わせとWITH問い合わせは(理論上)同時にすべて実行されます。WITH内のデータ変更文によりなされた影響は、RETURNING出力を読み取る以外、問い合わせの他の部分では参照できないことを意味します。したデータ変更文が2つあり、同じ行を変更しようとした場合、その結果は明確ではありません。追加情報については項7.8を参照してください。FROM句FROM句にはSELECTの対象となるソーステーブルを1つ以上指定します。複数のソースが指定された場合、結果は全てのソースの直積(クロス結合)となります。通常は制約条件を付けて、直積のごく一部を返すように結果行を限定します。FROM句には以下の要素を指定できます。table_name既存のテーブルもしくはビューの名前です(スキーマ修飾名も可)。ONLYが指定された場合、そのテーブルのみがスキャンされます。ONLYが指定されない場合、テーブルとそれを継承する全てのテーブルがスキャンされます。alias別名を含むFROMアイテムの代替名です。別名は、指定を簡潔にするため、もしくは、自己結合(同じテーブルを複数回スキャンする結合)の曖昧さをなくすために使われます。別名が指定されている場合は、その別名によって実際のテーブル名または関数名が完全に隠されます。fと指定されている場合、以降のSELECT文ではこのFROMアイテムをfooではなくfとして参照する必要があります。テーブルの別名があれば、そのテーブルの複数の列の名前を置き換える列の別名リストを記述することができます。selectFROM句では、副SELECTを使うことができます。SELECTコマンドの実行中、副SELECTの出力は一時テーブルであるかのように動作します。副SELECTは括弧で囲まれなければなりません。別名を与えておかなければなりません。VALUESコマンドをここで使用することもできます。with_query_nameWITH問い合わせは、問い合わせの名前があたかもテーブル名であるかのように、名前を記述することで参照されます。(実際にはWITH問い合わせは主問い合わせの対象とするテーブルと同じ名前の実テーブルを隠蔽します。必要ならばテーブル名をスキーマ修飾することで同じ名前の実テーブルを参照することができます。テーブルと同様の方法で別名を提供することができます。(これは特に関数が結果セットを返す場合に有用ですが、任意の関数を使用することもできます)。SELECTコマンドの実行中は、この関数の結果は一時テーブルであるかのように動作します。別名を使用することもできます。別名が指定されていれば、さらに列の別名リストを指定して、関数の複合型の戻り値の属性に対する代替名を提供することもできます。])という形式の列定義リストが必要です。列定義リストは、関数によって返される実際の列の数およびデータ型に一致していなければなりません。join_type以下のいずれかです。...])のいずれか1つのみを指定する必要があります。それぞれの意味は後述します。JOINでは、これらの句を記述しなくても構いません。JOIN句は、2つのFROMアイテムを結び付けます。入れ子の順番を決めるために、必要ならば括弧を使用してください。括弧がないと、JOINは左から右へ入れ子にします。どのような場合でもJOINは、カンマで分けられたFROM項目よりも強い結び付きを持ちます。JOINは直積を1つ生成します。これは、FROMの最上位で2つの項目を結合した結果と同一です。(指定すれば)結合条件によって制限をかけることができます。(true)と等価であり、条件によって削除される行はありません。これらの結合型は記述上の便宜のためだけに用意されています。したがって、通常のFROMとWHEREを実行しなければ何も行いません。JOINは、条件に合う直積の全ての行(つまり、その結合条件を満たす全ての組み合わせ)に加え、左側テーブルの中で、右側テーブルには結合条件を満たす行が存在しなかった行のコピーも返します。この左側テーブルの行を結合結果のテーブルの幅に拡張するために、右側テーブルが入る列にはNULL値が挿入されます。マッチする行を決める時は、JOIN句自身の条件のみが考慮されることに注意してください。他の外部結合条件は後で適用されます。JOINは、全ての結合行と、左側テーブルに当てはまるものがなかった右側の行(左側はNULLで拡張されています)の1行ずつを返します。JOINは記述上の便宜を図るため用意されているに過ぎません。JOINは、全ての結合行に加え、一致しなかった左側の行(右側はNULLで拡張)、一致しなかった右側の行(左側はNULLで拡張)を全て返します。join_conditionjoin_conditionは、結合においてどの行が一致するかを指定する、boolean型の値を返す式です(WHERE句に類似しています)。USINGは等価な列の両方ではなく片方のみが結合の出力に含まれることを意味します。NATURALNATURALは、2つのテーブル内の同じ名前を持つ行を全て指定したUSINGリストの省略形です。WHERE句WHERE句は通常以下の形式となります(この句は省略可能です)。conditionconditionは、評価の結果としてboolean型を返す任意の式です。この条件を満たさない行は全て出力から取り除かれます。全ての変数に実際の行の値を代入して、式が真を返す場合、その行は条件を満たすとみなされます。BY句は通常以下の形式となります(この句は省略可能です)。BYは、グループ化のために与えられた式を評価し、結果が同じ値になった行を1つの行にまとめる機能を持ちます。expressionには、入力列の名前、出力列(SELECTリスト項目)の名前/序数、あるいは入力列の値を計算する任意の式を取ることができます。BYの名前は出力列名ではなく入力列名として解釈されます。BYがなければ、集約関数は選択された全ての行を対象に計算を行い、1つの値を生成します)。グループ化されていない列を参照する場合やグループ化されていない列がグループ化された列に関数依存する場合、SELECTリストは無効になります。しないとグループ化されていない列について返される値は複数の値になってしまう可能性があるからです。グループ化された列(またはその部分集合)がグループ化されていない列を含むテーブルのプライマリキーである場合、関数依存が存在します。HAVING句HAVINGは通常以下の形になります(この句は省略可能です)。conditionconditionはWHERE句で指定するものと同じです。HAVINGは、グループ化された行の中で、条件を満たさない行を取り除く機能を持ちます。HAVINGとWHEREは次の点が異なります。BYの適用後に生成されたグループ化された行に対してフィルタをかけます。condition内で使用する列は、集約関数内で使用されたものを除き、グループ化された列を一意に参照するものでなければなりません。BY句がなかったとしても問い合わせはグループ化された問い合わせになります。BY句を持たない問い合わせが集約関数を含む場合も同様です。選択された行はすべて、1つのグループを形成するものとみなされます。SELECTリストとHAVING句では、集約関数が出力するテーブル列しか参照することができません。した問い合わせでは、HAVINGが真の場合には単一の行を、真以外の場合は0行を出力します。省略可能なWINDOW句の一般的な構文は以下の通りです。...]ここでwindow_nameは、こののちのウィンドウ定義やOVER句で参照することができる名前です。window_definitionは以下の通りです。]existing_window_nameが指定された場合、それはWINDOWリストの前にある項目を参照しなければなりません。新しいウィンドウはその範囲指定句をその項目からコピーします。順序指定句があった場合も同様です。BY句を指定することはできません。BYを指定することができます。新しいウィンドウは常に独自のフレーム句を使用します。コピーされたウィンドウはフレーム句を指定してはなりません。BY句の要素とほとんど同じように解釈されます。こちらは常に単純な式であり、出力列の名前や番号ではないことが異なります。BY句では許されない、集約関数を含めることができるという点です。グループ化および集約処理の後にウィンドウ処理が動作するため、これらでは許されています。BY句の要素とほとんど同じように解釈されます。この式は常に単純な式であり、出力列の名前や番号ではないことが異なります。省略可能なframe_clauseは、(すべてではありませんが)フレームに依存するウィンドウ関数用のウィンドウフレームを定義します。ウィンドウフレームは、問い合わせの各行(現在の行と呼ばれます)に関連する行の集合です。frame_clauseは以下のいずれかを取ることができます。frame_endここでframe_startとframe_endは以下のいずれかを取ることができます。PRECEDINGとすることができない、および、上のリストでframe_endの選択をframe_startの選択より先に行うことができないという制限があります。PRECEDINGは許されません。PRECEDINGです。BYがなければすべての行を意味します)。FOLLOWINGはフレームがパーティションの最終行で終わることを意味します(RANGEモードかROWSかは関係ありません)。BY順序における最初のピアまたは最後のピアで始まる、または終わることを意味します。FOLLOWINGという場合わけはROWSモードだけで許されます。これらは、現在の行の何行前または何行後にフレームが始まるまたは終わることを示します。ウィンドウ関数を含めることはできません。この値はNULLまたは負を取ることはできません。現在の行自身を選択するゼロを取ることができます。BY順序によりその行を一意に順序付けできない場合、ROWSが予期できない結果をもたらす可能性があることに注意して下さい。BY順序におけるピアとなる行が同等に扱われる、つまり任意の2つのピアはフレーム内に両方とも存在するか、存在しないかのいずれかとなることが確実になるように設計されています。BY句に記載されるウィンドウ関数の動作を規定することです。これらの関数はそのOVER句において名前でWINDOW句の項目を参照することができます。WINDOW句の項目は他で参照されてはなりません。問い合わせ内で使用されなかったものは、単に無視されます。ウィンドウ関数呼び出しはOVER句でウィンドウ定義を直接規定することができますので、WINDOW句を全く使わずにウィンドウ関数を使用することができます。WINDOW句は、同じウィンドウ定義が複数のウィンドウ関数で必要とされる場合に入力量を省くことができます。ウィンドウ関数に関する詳細については項3.5、項4.2.8、項7.2.4を参照してください。SELECTリストSELECTリスト(SELECTとFROMの間にあるキーワード)は、SELECT文の出力行を形成する式を指定するものです。この式では、FROM句で処理後の列を参照することができます(通常は実際に参照します)。output_nameを使用すると、出力列に元の名前とは別の名前を付けることができます。テーブルの場合と同様に、SELECTの出力列はすべて名前を持ちます。簡単なSELECTでは、この名前は列に表示用のラベルを付けるために使用されるだけです。SELECTが大規模な問い合わせの副問い合わせである場合、大規模な問い合わせ側で副問い合わせで生成された仮想のテーブルの列名としてこの名前が参照されます。output_nameと記述してください。(希望する列名がPostgreSQLのキーワード(付録Cを参照)に一致しない場合にのみASを省略することができます。将来あり得るキーワードの追加に備えるために、常にASを記述する、あるいは、出力名を二重引用符で括ることを推奨します。列名を指定しない場合、名前はPostgreSQLにより自動的に付けられます。列式が単純な列参照であれば、つけられる名前はその列の名前と同じものです。複雑な場合では、通常?columnN?のように生成される名前が付けられます。BY句内で列の値を参照する時も、出力列名を使用できます。WHEREやHAVING句では使用できません。これらでは式を書かなければなりません。リストには、選択された行の全ての列を表す省略形として、式ではなく*と書くことができます。そのテーブルに由来する列のみを表す省略形として、table_name.*と書くこともできます。このような場合、ASにより新しい名前を指定することはできません。出力列名はテーブルの列名と同一になります。(重複するグループの中で1行が保持されます)。ALLはこの反対で、全ての行が保持されます。デフォルトはこちらです。)は各行集合の中で、指定した式が等しいと評価した最初の行のみを保持します。BY(上述)と同じ規則で扱われます。BYを使用して目的の行が確実に最初に現れるようにしない限り予測することはできないことに注意してください。次の例は各地点の最新の気象情報を取り出します。BYを使用して各地点を時間によって降順にソートしなければ、各地点について得られる情報がいつのものかはわかりません。BYの最も左側の式と一致しなければなりません。ONグループの中での行の優先順位を決定する追加的な式を含みます。UNION句UNIONは通常以下の形式となります。BYとLIMITは、括弧で囲めば複式として付与することができます。括弧がない場合、これらの句は右側に置かれた入力式ではなく、UNIONの結果に対して適用されてしまいます)。UNION演算子は、2つのSELECT文が返す行の和集合を作成します。この和集合には、2つのSELECT文の結果集合のいずれか(または両方)に存在する行が全て含まれています。UNIONの直接のオペランドとなるSELECT文同士が返す列数は、同じでなければなりません。対応する列のデータ型には互換性が存在する必要があります。ALLオプションが指定されていない限り、UNIONの結果には重複行は含まれません。ALLはUNIONよりかなり高速です。できるだけALLを使用してください)。重複行を除去するデフォルトの動作を明示的に指定するためにDISTINCTを記述することができます。1つのSELECT文に複数のUNION演算子がある場合、括弧がない限り、それらは左から右に評価されます。SHAREを指定することはできません。INTERSECT句INTERSECTは通常以下の形式となります。SHARE句を持たない、任意のSELECT文が入ります。INTERSECTは、2つのSELECT文が返す行の積集合を計算します。この積集合に含まれるのは、2つのSELECT文の結果集合の両方に存在する行です。ALLオプションを指定しない限り、INTERSECTの結果に重複行は含まれません。ALLが指定された場合、左側テーブルにm個、右側テーブルにn個の重複がある行は、結果集合ではmin(m,n)個出現します。重複行を除去するデフォルトの動作を明示的に指定するためにDISTINCTを記述することができます。1つのSELECT文に複数のINTERSECT演算子がある場合、括弧がない限り、それらは左から右に評価されます。INTERSECTはUNIONよりも強い結び付きを持ちます。SHAREを指定することはできません。EXCEPT句EXCEPTは通常以下の形式となります。SHARE句を持たない、任意のSELECT文が入ります。EXCEPTは、左側のSELECT文の結果には存在し、右側のSELECT文の結果には存在しない行の集合を生成します。ALLオプションが指定されていない限り、EXCEPTの結果には重複行は含まれません。ALLがある場合、左側テーブルにm個、右側テーブルにn個の重複がある行は、結果集合ではmax(m-n,0)個出現します。重複行を除去するデフォルトの動作を明示的に指定するためにDISTINCTを記述することができます。1つのSELECT文に複数のEXCEPT演算子がある場合、括弧がない限り、それらは左から右に評価されます。EXCEPTの結び付きの強さはUNIONと同じです。SHAREを指定することはできません。BY句は通常以下の形式となります(この句は省略可能です)。BY句を使うと、結果行を指定した式(複数可)に従ってソートすることができます。左側の式を使って比較した結果、2つの行が等しいと判断された場合は、1つ右側の式を使って比較します。その結果も等しければ、さらに次の式に進みます。指定した全ての式で等しいと判断された場合は、実装に依存した順番で返されます。expressionには、出力列(SELECTリスト項目)の名前または序数、あるいは入力列値から形成される任意の式を取ることができます。序数は、出力列の位置(左から右に割り当てられます)を示します。これを使うと、一意な名前を持たない列の順序を定義することができます。AS句を使用すれば出力列に名前を割り当てることができるので、これはどうしても必要な機能というわけではありません。BY句には、SELECT出力リストに出現しない列を含む、任意の式を使用できます。したがって、以下の文は有効です。BYを適用する場合は、式は使用できず、出力列の名前か序数のみを指定できるという制限があります。BYはそれを出力列名として扱います。BYの選択とは反対です。この不整合は、標準SQLとの互換性を保持するために発生しています。BY中の任意の式の後に、省略可能なキーワードASC(昇順)、DESC(降順)を付加することができます。指定がなければ、デフォルトでASCがあるものとして扱われます。その他、順序を指定する演算子名をUSING句に指定する方法もあります。順序指定演算子は何らかのB-Tree演算子族の小なりまたは大なり演算子でなければなりません。(ただし、ユーザ定義データ型の作成時には、デフォルトのソート順を定義することができます。異なる名前の演算子と対応付けすることもできます)。LASTが指定されると、NULL値はすべての非NULL値の後にソートされます。FIRSTが指定されると、NULL値はすべての非NULL値の前にソートされます。(したがって、デフォルトでは、NULLが非NULLよりも大きい値であるかのように動作します。USINGが指定されると、デフォルトのNULLの順序は、演算子が小なり演算子か大なり演算子によって変わります。順序付けオプションは直前の演算子にのみ適用されます。DESCと同一の意味ではありません。文字型データでは、格納する列に適用された照合順序に従ってソートされます。これは必要に応じてexpression内にCOLLATE句を含めることで上書きできます。詳細については項4.2.10および項22.2を参照してください。LIMIT句LIMIT句は2つの独立した副句から構成されます。startcountには返される行の最大数を、一方、startには行を返し始める前に飛ばす行数を指定します。両方とも指定された場合、start行分が飛ばされ、そこから数えてcount行が返されます。ALLとして、つまり制限無しとして扱われます。0と同様に扱われます。SQL:2008では同じ結果を実現する異なる構文が導入されました。PostgreSQLでもサポートしています。ONLYこの構文において、startまたはcountに単一整数定数以外を記述するためには、括弧でくくって記述しなければなりません。countをFETCH句で省略した場合、そのデフォルトは1です。ROWおよびROWS、そしてFIRSTおよびNEXTは意味がない単語で、この句に影響を与えることはありません。標準に従うとOFFSET句は、FETCH句と同時に使用する場合、これより前に存在しなければなりません。PostgreSQLは厳密ではなく、どちらが先でも許されます。BY句を使うとよいでしょう。しないと、問い合わせ結果のどの部分が返されるのかがわかりません。10〜20行目までを出力するとしても、どの順番で並べた時の10〜20行目なのでしょうか。BYを指定しない限り、行が返される順番は不明です。問い合わせプランナは問い合わせ計画を作成する時にLIMITを考慮するので、LIMITとOFFSETの指定によって異なった計画を得ることになるでしょう。計画が異なれば、異なる順番で行が返ります。BYで順序を並び替えない限り、矛盾した結果を返すことになります。これはバグではありません。BYで順序を制御されない限り、問い合わせ結果が返す順序を約束しない」という事実の当然の帰結なのです。BYがなければ、同じLIMIT問い合わせを繰り返し実行してもテーブル行から異なる部分集合が取り出される可能性すらあります。繰り返しますが、これは不具合ではありません。した場合に確定した結果は単に保証されていないのです。UPDATEは以下の形式となります。SHARE句は以下の形式となります。UPDATEを使用すると、問い合わせによって検索された行が更新用にロックされます。これにより、現行のトランザクションが終了するまでは、これらの行が他のトランザクションによって変更されたり削除されたりすることがなくなります。UPDATEを試行しても拒否されます。UPDATEはそのトランザクションが終了するのを待ってから、その後行をロックして更新された行を返します(行が削除された場合は返しません)。READまたはSERIALIZABLEトランザクションの内部では、ロック対象の行がトランザクション開始時から変更されていた場合、エラーが発生します。第13章を参照してください。SHAREも同様に振舞いますが、入手する行に対し排他的ロックを獲得するのではなく共有ロックを獲得する点が異なります。UPDATE操作はブロックされます。SHARE操作を防ぎません。他のトランザクションのコミットを待機することなく操作を進めるには、NOWAITオプションを使用してください。NOWAITでは、選択行のロックを即座に獲得できない時、文は待機せずに、エラーを報告します。NOWAITは行レベルロックにのみに適用される点に注意してください。第13章を参照)で獲得されます。テーブルレベルのロックを待機せずに獲得しなければならないのであれば、最初にLOCKのNOWAITオプションを使用してください。SHARE内に特定のテーブルが指定されている場合は、そのテーブルの行のみがロックされます。SELECT内の他のテーブルは通常通りに読み込まれます。SHARE句は、その文で使用されるすべてのテーブルに影響を与えます。SHAREがビューまたは副問い合わせで使用された場合、そのビューや副問い合わせで使用されるすべてのテーブルに影響を与えます。SHAREは主問い合わせで参照されるWITH問い合わせには適用されません。SHAREを指定してください。SHARE句を記述することができます。UPDATEとして処理されます。同様に、あるテーブルに影響を与える句のいずれかでNOWAITが指定された場合、そのテーブルはNOWAITとして処理されます。SHAREは、返される行がテーブルのどの行に対応するのかが明確に識別できない場合には使用することができません。集約には使用できません。SHAREがSELECT問い合わせの最上位レベルに存在する場合、ロック対象行は問い合わせが返す行に正確に一致します。結合問い合わせ内の場合、ロック対象行は返される結合行に関連する行となります。スナップショットを更新した後に問い合わせ条件を満たさなくなった場合は返されなくなりますが、問い合わせのスナップショット時点で問い合わせ条件を満たす行もロックされます。LIMITが使用された場合、制限を満たす行が返されるとロック処理は止まります。(しかし、OFFSETにより飛ばされた行はロックされることに注意してください。SHAREがカーソル問い合わせで使用された場合、カーソルにより実際に取り込んだ行または過去に処理された行のみがロックされます。SHAREが副SELECTに存在する場合、ロック対象行は副問い合わせの外側の問い合わせで返される行となります。外側の問い合わせからの条件が副問い合わせ実行の最適化に使用される可能性がありますので、これには副問い合わせ自体の検査が提示する行より少なくなるかもしれません。5を持つ行のみがロックされます。行をロックしてから後のセーブポイントやPL/pgSQL例外ブロックでその行を編集することは避けてください。後のロールバックでロックが失われてしまいます。s;ROLLBACK後、行は、セーブポイント前のロックされた更新前の状態に戻らず、実質ロックされません。現在のトランザクションでロックされた行が更新されたり削除されたりした場合や、共有ロックが排他ロックに向上した場合、これは危険です。すべての場合において、以前のロック状態が忘れられています。トランザクションがその後、元のロックコマンドと続く更新の間の状態にロールバックした場合、その行はロックされていない状態として現れます。これは実装上の問題であり、将来のPostgreSQLリリースで修正する予定です。COMMITTEDトランザクション隔離レベルで実行するSELECTコマンドでは、順序通りにならない行を返す可能性があります。BYが最初に適用されるためです。このコマンドは結果をソートしますが、その後、1行または複数の行のロック獲得がブロックされる可能性があります。このSELECTのブロックが解除された時点で、順序付け対象の列値の一部が変更されているかもしれません。これによりこうした行が(元の列値という観点では順序通りではありますが、)順序通りに現れません。UPDATE/SHARE句を記述することで、回避することができます。UPDATEは実際に返される行のみをロックするのに対して、結果としてmytableのすべての行をロックすることに注意してください。BYがLIMITやその他の制限と組み合わせている場合、性能上大きな違いを生み出す可能性があります。このため、この技法は、順序付け対象の列に対する同時実行の更新が想定され、かつ、厳密にソートされた結果が要求される場合にのみ推奨されます。READまたはSERIALIZABLEトランザクション隔離レベルでは、('40001'というSQLSTATEを持つ)シリアライゼーション失敗が発生します。このためこれらの隔離レベルでは順序外の行を受け取る可能性はありません。nameというコマンドは以下と完全に同じです。nameこれは、最上位のコマンドとしても複雑な問い合わせの一部として入力を省略する構文の一種としても使用することができます。例filmsテーブルをdistributorsテーブルと結合します。...全ての映画のlen列を合計しkind列によって結果をグループ化します。04:38全ての映画のlen列を合計しkind列によって結果をグループ化し、合計が5時間より少ないグループの合計を表示します。04:38次に、結果を2番目の列(name)の内容に基づいてソートする方法を2つ例示します。Westward次の例は、distributorsテーブルとactorsテーブルの和集合を取得する方法を示しています。両方のテーブルで結果をWという文字で始まる行のみに限定しています。重複しない行のみが必要なので、ALLキーワードは省略されています。Allen次に、FROM句内での関数の使用方法について、列定義リストがある場合とない場合の両方の例を示します。Disney以下の例では簡単なWITH句の使用方法を示します。0.0735620250925422WITH問い合わせが一度だけ評価されることに注意してください。このため3つのランダムな値の2つの集合を得ることになります。RECURSIVEを使用して、直接の部下しか表示しないテーブルから、従業員Maryの(直接または間接的な)部下とその間接度を見つけ出します。employee_recursive;初期条件、続いてUNION、さらに問い合わせの再帰部分という再起問い合わせの典型的な構文に注意してください。問い合わせの再帰部分は最終的にはタプルを返さないことを確実にしてください。ないと問い合わせは無限にループします。(より多くの例については項7.8を参照してください。当然ながら、SELECT文は標準SQLと互換性があります。拡張機能や実現されていない機能もいくつかあります。FROM句の省略PostgreSQLでは、FROM句を省略することができます。これによって、以下のように単純な式を計算させることができます。4他のSQLデータベースでは、このようなSELECTを行うためにはダミーの1行テーブルを使わなければなりません。FROM句の指定がない場合、問い合わせではデータベーステーブルを参照することができません。以下の問い合わせは無効です。'Westward';PostgreSQLリリース8.1より前まででは、こうした形の問い合わせを受け付け、問い合わせで参照する各テーブルに対する暗黙的な項目を問い合わせのFROM句に追加していました。これは許されなくなりました。標準SQLでは、省略可能なキーワードASは、新しい列名が有効な列名(つまり予約済みのキーワードと異なるものすべて)である場合は常に、出力列名の前から省くことができます。PostgreSQLには多少より強い制限があります。新しい列名が予約済みか否かに関わらず何らかのキーワードに一致する場合はASが必要です。推奨する実践方法は、今後のキーワードの追加と競合する可能性に備え、ASを使用する、または出力列名を二重引用符で括ることです。FROM項目において標準およびPostgreSQLでは、未予約のキーワードである別名の前のASを省略することができます。構文があいまいになるため、出力名では現実的ではありません。...のように、ONLYに続くテーブル名の前後を括弧でくくることを要求します。PostgreSQLではこれもサポートしますが、括弧を省略することもできます。(この点はONLYオプションをサポートするすべてのSQLコマンドで同様に適用されます。BY句で使用できるのは、入力列名からなる式のみです。(ただし、不明瞭さがある場合は標準の解釈が使用されます)。PostgreSQLではどちらの句にも任意の式を指定できます。式で使われる名前は、常に出力列名ではなく入力列の名前とみなされることに注意してください。SQL:1999以降では、SQL-92との上位互換性がまったくない、多少異なる定義が採用されています。BYで列を省くことができる)関数依存性を認識します。標準SQLでは、認識しなければならない追加の条件を規定しています。標準SQLではウィンドウ用のframe_clauseオプションをさらに提供します。現在のPostgreSQLでは上述のオプションのみをサポートします。LIMITおよびOFFSETLIMITおよびOFFSET句はPostgreSQL独自の構文ですが、MySQLでも使用されています。...が導入されました。DB2でも使用されています。(PostgreSQLでは利用できませんが、Oracle用に開発されたアプリケーションでは、これらの句の機能を実装するためによく自動生成されるrownum列を含めるという回避策を使用します。CURSORのオプションとしてしか許されていません。PostgreSQLでは、副SELECTなど任意のSELECTで許されます。SHAREの亜種、およびNOWAITオプションは標準にはありません。WITH内のデータ変更文PostgreSQLではWITH問い合わせとしてINSERT、UPDATEおよびDELETEを使用することができます。これは標準SQLにはありません。ON句は標準SQLでは定義されていません。