<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="topic_template.xsl"?>
<topic>
<category>Statement</category>
<classification>SQL-DML</classification>
<ref_entry>SELECT</ref_entry>
<creator date="2004/06/13 00:00:00">T.Hayashi</creator>
<modified />
<definition>データベースにデータを問い合わせる。</definition>
<structure>
  <sql>
   <left><syn>SELECT</syn></left><br />
   <right><option>FIRST<var>int</var></option><option>SKIP<var>int</var></option>
   <option><selgroup><item>DISTINCT</item><item>ALL</item></selgroup></option><br />
   <selgroup><item>*</item><item><clause>field_expression</clause><option>, <clause>field_expression</clause> ...</option></item></selgroup><br />
   <syn>FROM</syn><clause>table_expression</clause><option>, <clause>table_expression</clause> ...</option><br />
   <option><syn>WHERE</syn><clause>search_condition</clause></option><br />
   <option><syn>GROUP BY</syn><var>field_name</var><option><syn>COLLATE</syn><var>collation_order</var></option><option>, <var>field_name</var><option><syn>COLLATE</syn><var>collation_order</var></option> ...</option></option><br />
   <option><syn>HAVING</syn><clause>search_condition</clause></option><br />
   <option><syn>UNION</syn><option><syn>ALL</syn></option><clause>select_expression</clause></option><br />
   <option><syn>PLAN</syn><clause>palan_expression</clause></option><br />
   <option><syn>ORDER BY</syn><clause>order_list</clause></option><br />
   <option><syn>FOR UPDATE</syn><option><syn>OF</syn><var>field_name</var><option>, <var>field_name</var> ...</option></option></option>;</right><br />

    <clausenote>
      <left><clause refer="no">field_expression</clause></left>
      <right><selgroup><br />
        <item><var>field_name</var><option> <clause>array_expression</clause></option></item><br />
        <item><clause>constant</clause></item><br />
        <item><clause>calcurate_expression</clause></item><br />
        <item><clause>internal_function</clause></item><br />
        <item><var>udf</var> (<option><clause>value</clause><option>, <clause>value</clause>...</option></option>)</item><br />
        <item>NULL</item><item>USER</item><item>CURRENT_USER</item><item>CURRENT_ROLE</item><br />
        <item>RDB$DB_KEY</item><br />
        </selgroup><br />
        <option>COLLATE <var>collation_order</var></option><br />
        <option>AS <var>alias_name</var></option><br />
      </right>
    </clausenote>
    <clausenote>
      <left><clause refer="no">array_expression</clause></left>
      <right><option><option>x :</option>y <option>, <option>x :</option>y ...</option></option></right>
    </clausenote>
    <clausenote>
      <left><clause  refer="no">constant</clause></left>
      <right><selgroup><br />
        <item><var>int</var></item><br />
        <item>'<var>string</var>'</item><br />
        <item>CHARSETNAME '<var>character_set_name</var>'</item><br />
      </selgroup></right>
    </clausenote>
    <clausenote>
      <left><clause refer="no">internal_function</clause></left>
      <right><selgroup><br />
        <item>COUNT (
          <selgroup>
            <item>*</item>
            <item><option>ALL</option><clause>field_expression</clause></item>
            <item>DISTINCT <clause>field_expression</clause></item>
          </selgroup>)
        </item><br />
        <item>SUM (
          <selgroup>
            <item>*</item>
            <item><option>ALL</option><clause>field_expression</clause></item>
            <item>DISTINCT <clause>field_expression</clause></item>
          </selgroup>)
        </item><br />
        <item>AVG (
          <selgroup>
            <item>*</item>
            <item><option>ALL</option><clause>field_expression</clause></item>
            <item>DISTINCT <clause>field_expression</clause></item>
          </selgroup>)
        </item><br />
        <item>MAX (
          <selgroup>
            <item>*</item>
            <item><option>ALL</option><clause>field_expression</clause></item>
            <item>DISTINCT <clause>field_expression</clause></item>
          </selgroup>)
        </item><br />
        <item>MIN (
          <selgroup>
            <item>*</item>
            <item><option>ALL</option><clause>field_expression</clause></item>
            <item>DISTINCT <clause>field_expression</clause></item>
          </selgroup>)
        </item><br />
        <item>CAST (<clause>field_expression</clause> AS <clause>data_type</clause>)</item><br />
        <item>UPPER (<clause>field_expression</clause>)</item><br />
        <item>GEN_ID (<var>generator_name</var>, <var>int</var>)</item><br />
      </selgroup></right>
    </clausenote>
    <clausenote>
      <left><clause refer="no">table_expression</clause></left>
      <right><selgroup><br />
        <item><clause>joined_table_expression</clause></item><br />
        <item><var>table_name</var></item><br />
        <item><var>view_name</var></item><br />
        <item><var>stored_procedure_name</var><option>(<clause>field_expression</clause><option>, <clause>field_expression</clause>...</option>)</option></item><br />
        <item><var>alias_name</var></item><br />
      </selgroup></right>
    </clausenote>
    <clausenote>
      <left><clause refer="no">joined_table_expression</clause></left>
      <right><selgroup><br />
        <item><clause>table_expression</clause><clause>join_type</clause><clause>table_expression</clause>ON<clause>search_expression</clause></item><br />
        <item>(<clause>joined_table_expression</clause>)</item><br />
      </selgroup></right>
    </clausenote>
    <clausenote>
      <left><clause refer="no">join_type</clause></left>
      <right><selgroup><br />
        <item><option>INNER</option>JOIN</item><br />
        <item><selgroup><item>LEFT</item><item>RIGHT</item><item>FULL</item></selgroup><option>OUTER</option>JOIN</item><br />
      </selgroup></right>
    </clausenote>
    <clausenote>
      <left><clause refer="no">search_condition</clause></left><br />
      <right>
      <selgroup><br />
        <item><clause>field_expression</clause><clause>operator</clause>
          <selgroup>
            <item><clause>field_expression</clause></item>
            <item>(<clause>select_one</clause>)</item>
          </selgroup>
        </item><br />
        <item>
          <clause>field_expression</clause><option>NOT </option>BETWEEN <clause>field_expression</clause>
          AND <clause>field_expression</clause>
        </item><br />
        <item><clause>field_expression</clause><option>NOT </option>LIKE <clause>field_expression</clause>
          <option>ESCAPE <clause>field_expression</clause></option>
        </item><br />
        <item><clause>field_expression</clause><option>NOT</option>IN 
          <selgroup>
            <item><clause>field_expression</clause><option>, <clause>field_expression</clause> ...</option></item>
            <item><clause>select_list</clause></item>
          </selgroup>
        </item><br />
        <item><clause>field_expression</clause> IS <option>NOT</option>NULL <clause>field_expression</clause>
          <selgroup>
            <item>&gt;=</item>
            <item>&lt;=</item></selgroup>
          <clause>field_expression</clause>
        </item><br />
        <item><clause>field_expression</clause><option>NOT </option>
          <selgroup><item>=</item><item>&lt;</item><item>&gt;</item></selgroup><clause>field_expression</clause>
        </item><br />
        <item><selgroup>
          <item>ALL</item><item>SOME</item><item>ANY</item></selgroup>
          (<clause>select_list</clause>)
        </item><br />
        <item>EXISTS (<clause>select_expression</clause>)
        </item><br />
        <item>SINGULAR (<clause>select_expression</clause>)
        </item><br />
        <item><clause>field_expression</clause><option>NOT</option> CONTAINING <clause>field_expression</clause>
        </item><br />
        <item><clause>field_expression</clause><option>NOT </option>STARTING <option>WITH </option>
          <clause>field_expression</clause>
        </item><br />
        <item>(<clause>search_condition</clause>)</item><br />
        <item>NOT <clause>search_condition</clause></item><br />
        <item><clause>search_condition</clause>OR <clause>search_condition</clause></item><br />
        <item><clause>search_condition</clause>AND <clause>search_condition</clause></item><br />
      </selgroup></right>
    </clausenote>
    <clausenote>
      <left><clause refer="no">operator</clause></left>
      <right><selgroup>
        <item>= </item><item>&lt; </item><item>&gt; </item><item>&lt;= </item><item>&gt;=</item><item>!&gt; </item><item>!&lt; </item><item>&lt;&gt; </item><item>!= </item></selgroup>
      </right>
    </clausenote>
    <clausenote>
      <left><clause refer="no">plan_expression</clause></left>
      <right><option><selgroup>
        <item>JOIN </item><item><option>SORT</option><option>MERGE</option></item></selgroup></option><br />
      (<selgroup><item><clause>plan_item</clause></item><item><clause>plan_expr</clause></item></selgroup><br />
       <option>, <selgroup>
         <item><clause>plan_item</clause></item><item><clause>plan_expr</clause></item>
         </selgroup>...</option>)<br />
       </right>
     </clausenote>
     <clausenote>
       <left><clause refer="no">plan_item</clause></left>
       <right><selgroup><item><var>table_name</var></item><item><var>alias_name</var></item></selgroup><br />
       <selgroup><item>NATURAL</item><item>INDEX (<var>index_name</var> <option>, <var>index_name</var> ...</option>)</item><item>ORDER <var>index_name</var></item></selgroup></right>
     </clausenote>
     <clausenote>
       <left><clause refer="no"><var>order_list</var></clause></left>
       <right><selgroup>
         <item>col </item><item><var>int</var> </item></selgroup><option>COLLATE <var>collation_order</var></option><br />
         <selgroup>
           <option><item>ASC<option>ENDING</option></item>
           <item>DESC<option>ENDING</option></item></option>
         </selgroup>
         <option>, <clause><var>order_list</var></clause> ...</option>
       </right>
     </clausenote>
  </sql>
</structure>
<arguments>
  <argument>
  <name><var>field_name</var></name>
  <description>テーブルで有効な列名を指定します。</description>
  </argument>
  <argument>
  <name><var>table_name</var></name>
  <description>既に作成されているテーブル名を指定します。</description>
  </argument>
  <argument>
  <name><var>vew_name</var></name>
  <description>既に作成されているビュー名を指定します。</description>
  </argument>
  <argument>
  <name><var>stored_procedure_name</var></name>
  <description>既に作成されているストアド・プロシージャ名を指定します。</description>
  </argument>
  <argument>
  <name><var>collation_order</var></name>
  <description>Firebirdで有効なコレーションオーダーを指定します。</description>
  </argument>
  <argument>
  <name><var>udf</var></name>
  <description>Firebirdで有効なUDFを指定します。</description>
  </argument>
  <argument>
  <name><var>alias_name</var></name>
  <description>テーブルに対する別名を指定します。</description>
  </argument>
  <argument>
  <name><var>generator_name</var></name>
  <description>既に作成されているジェネレータ名を指定します。</description>
  </argument>
  <argument>
  <name><var>character_set_name</var></name>
  <description>Firebirdで有効なキャラクタセット名を指定します。</description>
  </argument>
</arguments>
<description>
SELECT文はテーブルからデータを抽出するために使用されます。WHERE句ではサブクエリーを使用できますが、FROM句では使用できません。代わりに、行を返すストアドプロシージャーを利用することが可能です。
</description>
<examples>
 <example>
  <description>
FROM句で指定するテーブル参照には、テーブル、ビュー、行を返すストアドプロシージャを指定することが出来ます。各オブジェクトはJOIN構文によって結合することや、ネストした結合を指定することが可能です。
  </description>
  <samplecode>SELECT * FROM T_Test JOIN T_Test2 ON T_Test.ID = T_Test2.ID;</samplecode>
 </example>
 <example>
  <description>
ネストした結合の例です。
  </description>
  <samplecode>SELECT * FROM (T_Test T1 LEFT JOIN T_Test2 T2 ON T1.ID = T2.ID) T12 JOIN T_Test3 T3 ON T12.ID = T3.ID;</samplecode>
 </example>
 <example>
  <description>
WHERE句を指定した場合、検索条件に一致する行だけが返されます。検索条件には単純な演算子による&lt;値&gt;の比較から、集合演算まで様々な条件を指定することが可能です。<br />
BETWEEN演算子は&lt;値&gt;が指定した範囲内に存在するかどうかを検証します。
  </description>
  <samplecode>SELECT * FROM T_Test   WHERE DT BETWEEN ‘2003/1/1’ AND ‘2003/2/28';</samplecode>
 </example>
 <example>
  <description>
LIKE演算子は&lt;値&gt;が指定した&lt;値&gt;に含まれるかどうかを検証します。対象となるのは文字型のデータ、CHAR、VARCHAR等です。ワイルドカードとして%と_が使用可能です。%は0文字以上の任意の文字列を、_は任意の1文字とマッチします。
  </description>
  <samplecode>SELECT * FROM T_TEST WHERE Name LIKE ‘%tom%';</samplecode>
 </example>
 <example>
  <description>
IN演算子は、&lt;値&gt;が指定した集合に含まれるかどうかを検証します。()で囲まれた値のリストまたは1列で0行以上の行を返すSELECT文が比較対象となります。()の中を空にするとエラーになります。
  </description>
  <samplecode>SELECT * FROM T_Test  WHERE Name IN ('tom','jelly');</samplecode>
 </example>
 <example>
  <description>
IN句にはサブクエリーを指定することも出来ます。
  </description>
  <samplecode>SELECT T1.* FROM T_Test T1 WHERE T1.Name IN (SELECT T2.Name FROM T_Test T2 WHERE T2.Name = ‘tom’);
  </samplecode>
 </example>

 <example>
  <description>
FIRST句とSKIP句はFirebirdで拡張された構文です。FIRST 数値　で、SELECT文の結果の先頭から指定した行数を返します。また、SKIP句は先頭から指定した行数を文字通りスキップして結果を返します。<br />
数値には、有効な正の数を返す数値及び計算式を指定することが可能です。ver.1.0.3では残念ながら集計関数やサブクエリーを直接指定することは出来ません。EXTRACT()関数やCAST()関数は使用可能です。<br />
また、()でくくることでUDFも使用可能です。
  </description>
  <samplecode>SELECT FIRST 10 SKIP 5 * FROM EMPLOYEE;</samplecode><br />
 </example>
 <example>
  <description>
FIRST句は単独で使用することが出来ます。
  </description>
  <samplecode>SELECT FIRST (10 * 2) * FROM EMPLOYEE;</samplecode><br />
 </example>
 <example>
  <description>
SKIP句も単独で使用することが出来ます。この場合、先頭からスキップします。
  </description>
  <samplecode>SELECT SKIP (2 - 3) * FROM EMPLOYEE;</samplecode><br />
 </example>
 <example>
  <description>
以下のSQLでは、全体の半分の行を返します。(ver.1.5)
  </description>
  <samplecode>SELECT FIRST ((SELECT COUNT(*) FROM T_TEST)/2) *  FROM T_TEST; </samplecode><br />
 </example>
 <example>
  <description>
同様に、全体の半分の行を返します。ver.1.0.3ではUDFラッパーを利用しないと、FIRST句にサブクエリーを指定できません。
  </description>
  <samplecode>SELECT FIRST (BIN_OR((SELECT COUNT(*) FROM T_TEST)/2,1)) *  FROM T_TEST; (ver.1.0.3)</samplecode><br />
 </example>
</examples>
<see_also>
  <keyword name="sql_delete">DELETE</keyword>
  <keyword name="sql_insert">INSERT</keyword>
  <keyword name="sql_update">UPDATE</keyword>
</see_also>
</topic>
