4.5.6 問い合わせ式の構文規則

問い合わせは,<問い合わせ文>(SELECT文)によって表現します。<問い合わせ文>には,SELECT句,FROM句,WHERE句,ORDER BY句,GROUP BY句およびHAVING句を指定できます。最も基本的な<問い合わせ文>は,SELECT句とFROM句から構成されます。

SELECT句には,検索結果として取得する項目を指定します。

FROM句,WHERE句,GROUP BY句およびHAVING句は,検索対象式として指定します。FROM句には,検索対象になるクラスを指定します。WHERE句には,検索条件を指定します。検索条件は,述語で表現します。述語については,「4.5.8 述語の構文規則」を参照してください。GROUP BY句には,複数のオブジェクトを一つのグループとするかどうかを指定します。HAVING句には,WHERE句,FROM句,GROUP BY句の結果,得られる各グループを選択する条件を指定します。なお,WHERE句およびHAVING句には,副問い合わせも指定できます。

ORDER BY句には,検索結果として取得した集合をソートするかどうかを指定します。ORDER BY句については,「4.5.10 データ操作の構文規則」を参照してください。

<この項の構成>
(1) 形式
(2) <問い合わせ文>
(3) <問い合わせ指定>
(4) <検索対象式>
(5) <FROM句>
(6) <WHERE句>
(7) <副問い合わせ>
(8) GROUP BY句
(9) HAVING句

(1) 形式

!! <問い合わせ文>の形式
<問い合わせ文> ::= <問い合わせ式> 〔 <ORDER BY句>〕
<問い合わせ式> ::= <問い合わせ指定>
         |<左括弧> <問い合わせ式> <右括弧>
 
!! <問い合わせ指定>の形式
<問い合わせ指定> ::= SELECT 〔 <集合指定子> 〕
          <選択項目の並び> <検索対象式>
<選択項目の並び> ::= <アスタリスク>
          |<選択項目> 〔 { <コンマ> <選択項目> }... 〕
<選択項目> ::= <一次子>
<集合指定子> ::= DISTINCT|ALL
 
!! <検索対象式>の形式
<検索対象式> ::= <FROM句>
        〔 <WHERE句> 〕
        〔 <GROUP BY句> 〕
        〔 <HAVING句> 〕
 
!! <FROM句>の形式
<FROM句> ::= FROM <検索対象>
<検索対象> ::=  <検索対象参照リスト>
         <結合された検索対象>
<検索対象参照リスト> ::=<検索対象参照>
            〔 { <コンマ> <検索対象参照> }... 〕
<検索対象参照> ::= <クラス名> 〔<相関名>〕
 
<結合された検索対象> ::= <条件指定結合>
<条件指定結合> ::= <検索対象一次子> 〔 <結合種別> 〕
        JOIN <検索対象参照> <結合指定>
 
<検索対象一次子> ::= <検索対象参照>
            |<結合された検索対象>
            |<左括弧><結合された検索対象><右括弧>
 
<結合指定> ::= <結合条件>
<結合条件> ::= ON <検索条件>
 
<結合種別> ::= INNER
       |<外部結合種別> 〔 OUTER 〕
<外部結合種別> ::= LEFT
 
!! <WHERE句>の形式
<WHERE句> ::= WHERE <検索条件>
 
!! <GROUP BY句>の形式
<GROUP BY句> ::= GROUP BY <グループ化項目の並び>
<グループ化項目の並び> ::= <グループ化項目>
           [ { <コンマ> <グループ化項目> }... ]
<グループ化項目> ::= <一次子>
 
!! <HAVING句>の形式
<HAVING句> ::= HAVING <検索条件>
 
!! <副問い合わせ>の形式
<副問い合わせ> ::=<左括弧> <問い合わせ式> <右括弧>
 
!!検索条件については,「4.5.8 述語の構文規則」を
!!参照してください。

(2) <問い合わせ文>

形式

<問い合わせ文> ::= <問い合わせ式> 〔 <ORDER BY句>〕
<問い合わせ式> ::= <問い合わせ指定>
         |<左括弧> <問い合わせ式> <右括弧>

<問い合わせ式>についての規則
<問い合わせ式>は,少なくともSELECT句とFROM句から構成される問い合わせの表現です。<問い合わせ式>は,検索結果集合として評価されます。
<ORDER BY句>についての規則
<ORDER BY句>には,<問い合わせ式>の評価である検索結果集合に対して,検索結果要素を並べ替えるためのソート方法を指定します。

(3) <問い合わせ指定>

形式

<問い合わせ指定> ::= SELECT 〔 <集合指定子> 〕
          <選択項目の並び> <検索対象式>
<選択項目の並び> ::= <アスタリスク>
          |<選択項目> 〔 { <コンマ> <選択項目> }... 〕
<選択項目> ::= <一次子>

<選択項目>および<選択項目の並び>についての規則
  • <選択項目の並び>には,検索を実行した場合の結果として出力する項目を指定します。一つまたは複数の<選択項目>(<選択項目の並び>)と<検索対象式>を指定することで,検索結果集合が求められます。
  • <選択項目>に指定できるプロパティは,<検索対象式>に指定したクラスに定義されているプロパティだけです。
  • <選択項目の並び>に<アスタリスク>を指定できるのは,<検索対象式>の中の<Exists述語>で指定された<副問い合わせ>の中だけです。
  • <検索対象式>中の<比較述語>や<In述語>で副問い合わせを指定する場合は,それぞれの述語によって求める検索結果と整合性のあるデータ型の項目を<選択項目>として指定してください。
  • <選択項目>の<一次子>に指定できる要素は,<プロパティ指定>,<集合関数>または<ルーチンの起動>だけです。
    <ルーチンの起動>に指定できる関数については,「4.5.9 関数指定の構文規則」を参照してください。
  • <選択項目>に,VariableArray型プロパティ以外のObject型プロパティを直接指定することはできません。オブジェクトリファレンスであるObject型プロパティを指定する場合は,oiidstr関数によって,OIID文字列に変換して指定してください。
<集合指定子>についての規則
  • <集合指定子>は,検索結果集合内の結果として同じ要素が返却された場合に,その重複した要素を排除(重複排除)する場合に指定します。
  • DISTINCTを指定すると,検索結果集合に対して重複排除が実行され,重複を排除した検索結果集合が返却されます。
  • ALLを指定すると,重複している要素も含めて,すべての検索結果集合が返却されます。
  • 省略した場合は,ALLが仮定されます。
  • <選択項目>にVariableArray型プロパティを指定した場合は,<集合指定子>にDISTINCTは指定できません。DISTINCTを指定できる選択項目のデータ型については,データベースの制限に従います。
  • アクセス制御機能を使用している場合,<集合指定子>にDISTINCTは指定できません。

(4) <検索対象式>

形式

<検索対象式> ::= <FROM句>
        〔 <WHERE句> 〕
        〔 <GROUP BY句> 〕
        〔 <HAVING句> 〕

なお,<WHERE句>,<GROUP BY句>および<HAVING句>は,省略できます。

(5) <FROM句>

<FROM句>には,検索対象になる一つまたは複数のクラスを指定します。複数のクラスを検索対象に指定する場合には,結合条件も指定できます。

edmSQLでは,結合方法として,次の方法が使用できます。

形式

<FROM句> ::= FROM <検索対象>
<検索対象> ::=  <検索対象参照リスト>
       |<結合された検索対象>
<検索対象参照リスト> ::= <検索対象参照>
             〔{ <コンマ> <検索対象参照> }...〕
<検索対象参照> ::= <クラス名> 〔<相関名>〕
 
<結合された検索対象> ::= <条件指定結合>
<条件指定結合> ::= <検索対象一次子> 〔 <結合種別> 〕
          JOIN <検索対象参照> <結合指定>
 
<検索対象一次子> ::= <検索対象参照>
            |<結合された検索対象>
            |<左括弧><結合された検索対象><右括弧>
 
<結合指定> ::= <結合条件>
<結合条件> ::= ON <検索条件>
 
<結合種別> ::= INNER
       |<外部結合種別> 〔 OUTER 〕
<外部結合種別> ::= LEFT

<検索対象>についての規則
  • <検索対象>には<検索対象参照リスト>を指定します。<検索対象参照リスト>として<コンマ>で区切った<検索対象参照>を指定すると,それぞれの<検索対象参照>は暗黙的な結合で結合されて,検索対象として扱われます。
    暗黙的な結合によって検索対象を結合した場合は,結合条件を<WHERE句>に指定することで,内部結合を指定した場合と同じ結合が表現できます。<WHERE句>に結合条件を指定しない場合は,指定したクラスの直積空間が検索の対象になります。
<結合された検索対象>についての規則
  • <結合された検索対象>は,複数の検索対象(クラス)を明示的に結合種別と結合条件を指定して結合する場合に指定します。
<条件指定結合>についての規則
  • <条件指定結合>には,内部結合(INNER JOIN)または左外部結合(LEFT OUTER JOIN)が指定できます。
  • <条件指定結合>では,<結合種別>の左側に指定する<検索対象一次子>に,さらに<結合された検索対象>を指定できます。つまり,結合のネストができます。
  • <条件指定結合>を指定する場合は,必ず<結合指定>(ON条件)を指定してください。
<結合条件>についての規則
  • <結合条件>に指定するプロパティには,その<結合条件>を含む<検索対象一次子>および<検索対象>で指定しているクラスのプロパティ,またはその<問い合わせ指定>の外側の検索対象のクラスのプロパティを指定してください。
<結合種別>についての規則
  • 内部結合を指定する場合は,<結合種別>に「INNER」を指定します。内部結合を指定すると,指定したクラスの直積空間のうち,<結合条件>を満たす結果の集合が検索対象になります。<結合条件>に結合キーとして指定したプロパティがNULL値の場合,<結合条件>を満たす集合が存在しないので,指定したクラスの直積空間は検索対象にはなりません。このため,結合を指定したどちらのクラスのオブジェクトも検索対象になりません。
  • 左外部結合を指定する場合は,<結合種別>に「LEFT」または「LEFT OUTER」を指定します。外部結合を指定した場合,<結合条件>に結合キーとして指定したプロパティがNULL値であっても,<結合種別>の左側に指定した<検索対象一次子>のクラスのオブジェクトは,すべて検索対象になります。この場合,<結合種別>の右側に指定した検索対象のクラスのオブジェクトは存在しないことになるため,該当する項目にはNULL値が設定されます。
  • <結合種別>を省略すると,「INNER」が仮定されます。
<FROM句>全体についての規則
  • 次の項目については,データベースの制限に従います。
    結合できるクラスの数や,結合で指定できるネストの深さ。
    <結合条件>に指定できるプロパティ。
    実行できる結合および結合の組み合わせ。
  • 一つのFROM句内で,相関名は重複できません。また,検索対象クラスのクラス名と相関名も,重複できません。
  • FROM句で指定する<クラス名>および<相関名>の有効範囲は,次のとおりです。副問い合わせでこれらの<クラス名>および<相関名>を指定するときには,ご注意ください。
<クラス名>と<相関名>の有効範囲
  • FROM句で指定した<相関名>および<相関名>なしで指定した<クラス名>の有効範囲は,その<FROM句>を含む<問い合わせ指定>内全体です。したがって,その<問い合わせ指定>内にある<副問い合わせ>でも有効になります。
  • <相関名>を指定した<クラス名>の有効範囲は,そのFROM句を含む<問い合わせ指定>だけです。したがって,<問い合わせ指定>内にある<副問い合わせ>では,その名前は有効になりません。

(6) <WHERE句>

<WHERE句>には,検索条件を指定します。

検索対象のオブジェクトに対して,<WHERE句>で指定した<検索条件>が真である場合に,そのオブジェクトが検索結果として取得できます。取得した検索結果は,<選択項目>に指定した項目の値として取得できます。

形式

<WHERE句> ::= WHERE <検索条件>

<検索条件>については,「4.5.8 述語の構文規則」を参照してください。

(7) <副問い合わせ>

形式

<副問い合わせ> ::=<左括弧> <問い合わせ式> <右括弧>

<副問い合わせ>についての規則
  • <副問い合わせ>は,<In述語>,<比較述語>または<Exists述語>の対象として指定します。それぞれの述語については,「4.5.8 述語の構文規則」を参照してください。
  • <副問い合わせ>の<選択項目>にVariableArray型プロパティは指定できません。
  • アクセス制御機能を使用している場合も,<副問い合わせ>ではアクセス制御は実行されません。<副問い合わせ>の検索結果として取得できる検索結果には,アクセス権を持たないものが含まれる可能性があります。
  • <副問い合わせ>の外側に指定したクラスのプロパティを<副問い合わせ>で指定する場合は,<副問い合わせ>で指定するプロパティに<プロパティ修飾子>を指定してください。

(8) GROUP BY句

<GROUP BY句>には,複数のオブジェクトを一つのグループとする条件を指定します。

形式

<GROUP BY句> ::= GROUP BY <グループ化項目の並び>
<グループ化項目の並び> ::= <グループ化項目>
           [ { <コンマ> <グループ化項目> }... ]
<グループ化項目> ::= <一次子>

<GROUP BY句>全体についての規則
  • GROUP BY句で指定したプロパティの検索結果がすべて同じオブジェクトを一つのグループとして,検索結果をグループごとに取得できます。
  • GROUP BY句にはプロパティだけが指定できます。
  • <グループ化項目の並び>に指定できるプロパティは,GROUP BY句を指定した問い合わせのFROM句で指定したクラスのプロパティです。
  • <グループ化項目の並び>に指定できる <一次子 > の最大数は,前提となるDBMSの仕様に制限されます。
  • SELECT句に指定できる選択項目はGROUP BY句で指定したプロパティおよび集合関数です。
  • オブジェクト型,バイナリ型のプロパティ,特殊なプロパティおよび関数はGROUP BY句に指定できません。
  • 同一のプロパティを重複してGROUP BY句に指定することはできません。

(9) HAVING句

<HAVING句>には,GROUP BY句,WHERE句,FROM句の結果,得られる各グループを選択する条件を指定します。

形式

<HAVING句> ::= HAVING <検索条件>

<HAVING句>全体についての規則
  • GROUP BY句,WHERE句,またはFROM句の結果,得られる各グループを選択する条件を指定します。
  • NULL述語およびLIKE述語はHAVING句に直接指定できません。
  • HAVING句に指定できるプロパティは,GROUP BY句で指定したプロパティ,集合関数の引数として指定したプロパティ,または外側の問い合わせのFROM句に指定したクラスのプロパティです。