<!--
$Header: /usr/prj/pg/cvsroot/doc/doc/src/sgml/advanced.sgml,v 1.7 2001/09/07 11:18:58 i-kaori Exp $
-->

 <chapter id="advanced">
  <!--<title>Advanced <productname>Postgres</productname> <acronym>SQL</acronym> Features</title>-->
  <title><productname>Postgres</productname> <acronym>SQL</acronym>の高度な機能</title>
<indexterm><primary>PostgresのSQL</primary></indexterm>

  <para>
   <!--Having covered the basics  of  using
   <productname>Postgres</productname> <acronym>SQL</acronym>  to
   access your data, we will now discuss those features of
   <productname>Postgres</productname> that distinguish  it  from  conventional  data
   managers.   These  features  include  inheritance, time
   travel and non-atomic  data  values  (array-  and  
   set-valued attributes).
   Examples   in   this  section  can  also  be  found  in
   <filename>advance.sql</filename> in the tutorial directory.
   (Refer to <xref linkend="QUERY"> for how to use it.)-->

   <productname>Postgres</productname> <acronym>SQL</acronym>を使ったデータアクセスの基本を説明してきましたが、ここでは従来のデータマネージャとは違った<productname>Postgres</productname>の機能について説明します。それらの機能とは、継承、タイムトラベル、非原子的データ値（配列属性と組属性）です。ここで使う例は、tutorialディレクトリにある<filename>advance.sql</filename>にもあります。（詳細は<xref linkend="QUERY">を参照してください）。
  </para>

  <sect1 id="inheritance">
   <title><!--Inheritance-->継承</title>
<indexterm><primary sortas="けいしょう">継承</primary></indexterm>
<indexterm><primary sortas="てーぶる">テーブル</primary><secondary sortas="けいしょう">継承</secondary></indexterm>

   <para>
    <!--Let's create two tables. The capitals  table  contains
    state  capitals  that  are also cities. Naturally, the
    capitals table should inherit from cities.-->

    例として、2つのテーブルを作成します。capitals（州都）テーブルは、cities（市）でもあるstate capitals（州都）を持っています。capitalsテーブルはcitiesテーブルから継承するのが自然です。</para>


<programlisting>
CREATE TABLE cities (
    name            text,   -- 名前
    population      real,   -- 人口
    altitude        int     -- 標高（フィート）
);

CREATE TABLE capitals (
    state           char(2)
) INHERITS (cities);
</programlisting>

    <!--In this case, a row  of  capitals  <firstterm>inherits</firstterm>  all
    columns (name,  population,  and altitude) from its
    parent, cities.  The type  of  the  column name  is
    <type>text</type>,  a  native  <productname>Postgres</productname>
    type  for variable length
    ASCII strings.  The type of the column population is
    <type>real</type>,  a  type for single precision
    floating point numbers.  State capitals have  an  extra
    column, state, that shows their state.
    In <productname>Postgres</productname>,
    a  table  can inherit from zero or more other tables,
    and a query can reference either  all  rows  of  a
    table  or  all  rows  of  a  tables plus all of its
    descendants.-->

<para>この場合、capitalsの列は、すべての列、つまりname（都市名）、population（人口）、altitude（標高）を、親であるcitiesテーブルから<firstterm>継承</firstterm>します。name列のデータ型は<type>text</type>型で、これは可変長ASCII文字列とする<productname>Postgres</productname>固有のデータ型です。population列のデータ型は<type>real</type>型で、4バイト浮動小数点です。State capitals（州都）には、州を表すためにstateという列が追加されています。<productname>Postgres</productname>では、テーブルは複数のテーブル（なくてもよい）を継承することができ、1回の問い合わせで、あるテーブルのすべての行、または、あるテーブルとその子、孫すべてのテーブルの行を参照することができます。</para>


    <note>
     <para>
      <!--The inheritance hierarchy is a  directed  acyclic graph.-->
      継承階層は、有方向非循環グラフです。
     </para>
    </note>

   <para>
    <!--For example, the  following  query finds the  names  of  all  cities,
    including  state capitals, that are located at an altitude
    over 500ft:-->

    以下の問い合わせの例は、州都を含む、標高500フィート以上に位置するすべての都市を検索します。</para>

<programlisting>
SELECT name, altitude
    FROM cities
    WHERE altitude &gt; 500;
</programlisting>

    <!--which returns:-->
<para>結果は下記のようになります。</para>

<programlisting>
+----------+----------+
|name      | altitude |
+----------+----------+
|Las Vegas | 2174     |
+----------+----------+
|Mariposa  | 1953     |
+----------+----------+
|Madison   | 845      |
+----------+----------+
</programlisting>

   <para>
    <!--On the other hand, the  following  query  finds
    all  the cities that are not state capitals and
    are situated at an altitude of 500ft or higher:-->

逆に、標高が500フィートを超える場所に位置する州都以外の都市を検索する問い合わせは、下記のようになります。</para>

<programlisting>
SELECT name, altitude
    FROM ONLY cities
    WHERE altitude &gt; 500;

+----------+----------+
|name      | altitude |
+----------+----------+
|Las Vegas | 2174     |
+----------+----------+
|Mariposa  | 1953     |
+----------+----------+
</programlisting>

   <para>
    <!--Here the <quote>ONLY</quote> before cities indicates that the query should
    be  run over only the cities table, and not tables below cities in the
    inheritance hierarchy.  Many of the  commands  that  we
    have  already discussed - <command>SELECT</command>,
    <command>UPDATE</command> and <command>DELETE</command> -
    support this <quote>ONLY</quote> notation.-->

    ここでcitiesの前に記述された<quote>ONLY</quote>は、citiesの継承階層の下にあるテーブルではなく、citiesのテーブルだけを参照することを意味します。すでに説明のあった<command>SELECT</command>、<command>UPDATE</command>、<command>DELETE</command>などの多くのコマンドは、この<quote>ONLY</quote>表記法をサポートしています。   </para>

   <note>
    <!--<title>Deprecated</title> -->
    <title>仕様変更に伴い削除された機能</title> 
<indexterm><primary>PostgreSQL</primary><secondary sortas="さくじょされたきのう">削除された機能</secondary></indexterm>

    <para>
     <!--In previous versions of <productname>Postgres</productname>, the
     default was not to get access to child tables. This was found to
     be error prone and is also in violation of SQL99. Under the old
     syntax, to get the sub-tables you append "*" to the table name.
     For example-->

     <productname>Postgres</productname>の前のバージョンでは、子テーブルにデフォルトで接続できないようになっていました。しかし、これは間違いであったようで、またSQL99にも反することが判明しました。旧構文によると、サブテーブルを得るためには下記の例のようにテーブル名の後に「*」を追加していました。</para>

<programlisting>
SELECT * from cities*;
</programlisting>

     <!--You can still explicitly specify scanning child tables by appending
     "*", as well as explicitly specify not scanning child tables by
     writing <quote>ONLY</quote>.  But beginning in version 7.1, the default
     behavior for an undecorated table name is to scan its child tables
     too, whereas before the default was not to do so.  To get the old
     default behavior, set the configuration option
     <literal>SQL_Inheritance</literal> to off, e.g.,-->

<para><quote>ONLY</quote>を使って子テーブルを参照しないことを明示的に指定できるのと同様に、今でも「*」を追加することで子テーブルを参照することを明示的に指定することができます。しかし、バージョン7.1以前のリリースではデフォルトではありませんでしたが、バージョン7.1になってから、デフォルトで装飾されていないテーブル名は子テーブルも参照するようになっています。以前のデフォルトの設定にするには、たとえば設定オプションの<literal>SQL_Inheritance</literal>をoffにしてください。</para>

<programlisting>
SET SQL_Inheritance TO OFF;
</programlisting>
     <!--or add a line in your <filename>postgresql.conf</filename> file.-->

<para>あるいは、<filename>postgresql.conf</filename>ファイルに1行追加してください。
    </para>
   </note>
  </sect1>

  <sect1 id="non-atomic-values">
   <title><!--Non-Atomic Values-->非原子的データ値</title>
<indexterm><primary sortas="ひげんしてきでーたち">非原子的データ値</primary></indexterm>
<indexterm><primary>PostgreSQL</primary><secondary sortas="ひげんしてきでーたち">非原子的データ値</secondary></indexterm>

   <para>
    <!--One  of  the tenets of the relational model is that the
    columns of a table are atomic.
    <productname>Postgres</productname> does not
    have  this  restriction; columns can themselves contain 
    sub-values that can be  accessed  from  the  query
    language.   For example, you can create columns that
    are arrays of base types.-->

    リレーショナルモデルの決め事の1つに、テーブルの行は原子的であるということがあります。<productname>Postgres</productname>ではこの制約がありません。列は問い合わせ言語からアクセス可能な部分値を含むことができます。たとえば、基本型が配列である列を作成できます。
   </para>

   <sect2>
    <title><!--Arrays-->配列</title>
<indexterm><primary sortas="はいれつ">配列</primary></indexterm>
<indexterm><primary>PostgreSQL</primary><secondary sortas="はいれつ">配列</secondary></indexterm>

    <para>
     <!--<productname>Postgres</productname> allows columns of a
     row to be defined
     as  fixed-length  or  variable-length multi-dimensional
     arrays. Arrays of any base type  or  user-defined  type
     can  be created. To illustrate their use, we first create a 
     table with arrays of base types.-->

     <productname>Postgres</productname>では、ある行の列を固定長あるいは可変長の多次元配列として定義することが可能です。いかなる基本型、またはユーザー定義型である配列を作成することができます。その使用法を説明するために、例としてまず基本型の配列のテーブルを作成します。</para>

<programlisting>
CREATE TABLE SAL_EMP (
    name            text,
    pay_by_quarter  integer[],
    schedule        text[][]
);
</programlisting>

    <para>
     <!--The above query will create a table named SAL_EMP  with
     a  <firstterm>text</firstterm>  string (name), a one-dimensional
     array of <firstterm>integer</firstterm>
     (pay_by_quarter),  which  represents   the   employee's
     salary by quarter and a two-dimensional array of
     <firstterm>text</firstterm>
     (schedule),  which  represents  the  employee's  weekly
     schedule.   Now  we  do  some  <firstterm>INSERT</firstterm>s;
     note that when
     appending to an array, we  enclose  the  values  within
     braces  and  separate  them  by commas.  If you know
     <firstterm>C</firstterm>,
     this is not unlike the syntax for  initializing  structures.-->

     この文を実行すると、氏名を表す<firstterm>text</firstterm>型文字列（name）、従業員の4半期ごとの給与を表す<firstterm>integer</firstterm>型一次元配列（pay_by_quarter）、従業員の1週間のスケジュールを表す<firstterm>text</firstterm>型二次元配列（schedule）を持つSAL_EMPというテーブルが作成されます。そこにいくつかの<firstterm>INSERT</firstterm>文を実行してみます。配列へデータを追加するときには、値をかっこで囲み、そしてそれらをカンマで区切ることに注意してください。<firstterm>C</firstterm>の知識があれば、構造体を初期化する構文と同じことに気づくでしょう</para>

<programlisting>
INSERT INTO SAL_EMP
    VALUES ('Bill',
    '{10000, 10000, 10000, 10000}',
    '{{"meeting", "lunch"}, {}}');

INSERT INTO SAL_EMP
    VALUES ('Carol',
    '{20000, 25000, 25000, 25000}',
    '{{"talk", "consult"}, {"meeting"}}');
</programlisting>

     <!--By  default,  <productname>Postgres</productname>  uses  the
     "one-based" numbering
     convention for arrays - that is, an array  of  n  elements
     starts with array[1] and ends with array[n].
     Now,  we  can  run  some queries on SAL_EMP.  First, we
     show how to access a single element of an  array  at  a
     time.   This query retrieves the names of the employees
     whose pay changed in the second quarter:-->

<para><productname>Postgres</productname>ではデフォルトで配列の番号付け規約に「1始まり」を採用しています。ということは、要素が<replaceable>n</replaceable>個の配列は、array[1]で始まり、array[<replaceable>n</replaceable>]で終わるということを意味します。ここで、SAL_EMPについて何らかの問い合わせを行う準備ができました。まず、1回に配列の1つの要素にアクセスする方法を示します。この問い合わせは、第2四半期に給与が変更した従業員の名前を取り出します。</para>

<programlisting>
SELECT name
    FROM SAL_EMP
    WHERE SAL_EMP.pay_by_quarter[1] &lt;&gt;
    SAL_EMP.pay_by_quarter[2];

+------+
|name  |
+------+
|Carol |
+------+
</programlisting>

    <para>
     <!--This query retrieves  the  third  quarter  pay  of  all
     employees:-->

     また、下記の問い合わせはすべての従業員の第3四半期の給与を抽出します。</para>

<programlisting>
SELECT SAL_EMP.pay_by_quarter[3] FROM SAL_EMP;


+---------------+
|pay_by_quarter |
+---------------+
|10000          |
+---------------+
|25000          |
+---------------+
</programlisting>

    <para>
     <!--We  can  also  access  arbitrary slices of an array (subarrays)
     by specifying both lower and upper bounds for
     each subscript.  This query  retrieves  the  first  item  on
     Bill's schedule for the first two days of the week.-->

     同様に、それぞれのサブスクリプトの上限/下限を指定することによって、配列/配列の任意の部分（副配列）を切り出すことも可能です。下記の問い合わせは、週の始めの2日間のBillさんのスケジュールにある、最初の項目を検索します。</para>

<programlisting>
SELECT SAL_EMP.schedule[1:2][1:1]
    FROM SAL_EMP
    WHERE SAL_EMP.name = 'Bill';

+-------------------+
|schedule           |
+-------------------+
|{{"meeting"},{""}} |
+-------------------+
</programlisting>
   </sect2>
  </sect1>

  <sect1 id="more-advanced">
   <title><!--More Advanced Features-->より高度な機能</title>
<indexterm><primary sortas="こうどなきのう">高度な機能</primary></indexterm>
<indexterm><primary>PostgreSQL</primary><secondary sortas="こうどなきのう">高度な機能</secondary></indexterm>

   <para>
    <!--<productname>Postgres</productname> has many features not touched
    upon in this
    tutorial introduction, which has been oriented toward newer users of
    <acronym>SQL</acronym>.
    These are discussed in more detail in both the User's and
    Programmer's Guides.-->

    <productname>Postgres</productname>には、<acronym>SQL</acronym>初心者ユーザーを対象としているこの導入チュートリアルでは触れられていないような、多くの機能があります。これらについては、<citetitle>&user-guide;</citetitle>や<citetitle>&programmer-guide;</citetitle>で詳しく述べられています。
   </para>

  </sect1>

 </chapter>

<!-- Keep this comment at the end of the file
Local variables:
mode:sgml
sgml-omittag:nil
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
sgml-parent-document:nil
sgml-default-dtd-file:"./reference.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:("/usr/lib/sgml/catalog")
sgml-local-ecat-files:nil
End:
-->
