advanced.sgml 7.56 KB
Newer Older
1
<!--
Thomas G. Lockhart's avatar
Thomas G. Lockhart committed
2
$Header: /cvsroot/pgsql/doc/src/sgml/advanced.sgml,v 1.11 2000/04/11 05:39:06 thomas Exp $
3 4
-->

5 6 7 8 9
 <chapter id="advanced">
  <title>Advanced <productname>Postgres</productname> <acronym>SQL</acronym> Features</title>

  <para>
   Having covered the basics  of  using
Thomas G. Lockhart's avatar
Thomas G. Lockhart committed
10
   <productname>Postgres</productname> <acronym>SQL</acronym>  to
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
   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.)
  </para>

  <sect1>
   <title>Inheritance</title>

   <para>
    Let's create two classes. The capitals  class  contains
    state  capitals  which  are also cities. Naturally, the
    capitals class should inherit from cities.

    <programlisting>
30 31 32
CREATE TABLE cities (
    name            text,
    population      float,
33
    altitude        int     -- (in ft)
34 35 36
);

CREATE TABLE capitals (
37
    state           char(2)
38
) INHERITS (cities);
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
    </programlisting>

    In this case, an  instance  of  capitals  <firstterm>inherits</firstterm>  all
    attributes  (name,  population,  and altitude) from its
    parent, cities.  The type  of  the  attribute  name  is
    <type>text</type>,  a  native  <productname>Postgres</productname>
    type  for variable length
    ASCII strings.  The type of the attribute population is
    <type>float</type>,  a  native <productname>Postgres</productname>
    type for double precision
    floating point numbers.  State capitals have  an  extra
    attribute, state, that shows their state.
    In <productname>Postgres</productname>,
    a  class  can inherit from zero or more other classes,
    and a query can reference either  all  instances  of  a
    class  or  all  instances  of  a  class plus all of its
    descendants.

    <note>
     <para>
      The inheritance hierarchy is a  directed  acyclic graph.
     </para>
    </note>

    For example, the  following  query  finds
    all  the cities that are situated at an attitude of 500ft or higher:
65
     
66
    <programlisting>
67 68 69 70 71 72 73 74 75 76 77
SELECT name, altitude
    FROM cities
    WHERE altitude &gt; 500;

+----------+----------+
|name      | altitude |
+----------+----------+
|Las Vegas | 2174     |
+----------+----------+
|Mariposa  | 1953     |
+----------+----------+
78 79
    </programlisting>         
   </para>
80

81 82 83 84
   <para>
    On the other hand, to find the  names  of  all  cities,
    including  state capitals, that are located at an altitude 
    over 500ft, the query is:
85

86
    <programlisting>
87 88 89
SELECT c.name, c.altitude
    FROM cities* c
    WHERE c.altitude > 500;
90
    </programlisting>
91

92
    which returns:
93
     
94
    <programlisting>
95 96 97 98 99 100 101 102 103
+----------+----------+
|name      | altitude |
+----------+----------+
|Las Vegas | 2174     |
+----------+----------+
|Mariposa  | 1953     |
+----------+----------+
|Madison   | 845      |
+----------+----------+
104 105 106 107 108
    </programlisting>

    Here the <quote>*</quote> after cities indicates that the query should
    be  run over cities and all classes below cities in the
    inheritance hierarchy.  Many of the  commands  that  we
109 110
    have  already discussed (<command>SELECT</command>,
    <command>UPDATE</command> and <command>DELETE</command>)
111
    support this <quote>*</quote> notation, as do others, like
112
    <command>ALTER</command>.
113 114 115 116 117 118 119 120
   </para>
  </sect1>

  <sect1>
   <title>Non-Atomic Values</title>

   <para>
    One  of  the tenets of the relational model is that the
121 122
    attributes of a relation are atomic.
    <productname>Postgres</productname> does not
123 124 125 126 127 128 129 130 131 132
    have  this  restriction; attributes can themselves contain 
    sub-values that can be  accessed  from  the  query
    language.   For example, you can create attributes that
    are arrays of base types.
   </para>

   <sect2>
    <title>Arrays</title>

    <para>
133 134
     <productname>Postgres</productname> allows attributes of an
     instance to be defined
135 136 137 138
     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 
     class with arrays of base types.
139 140

     <programlisting>
141 142 143
CREATE TABLE SAL_EMP (
    name            text,
    pay_by_quarter  int4[],
144
    schedule        text[][]
145
);
146 147
     </programlisting>
    </para>
148

149
    <para>
150
     The above query will create a class named SAL_EMP  with
151 152
     a  <firstterm>text</firstterm>  string (name), a one-dimensional
     array of <firstterm>int4</firstterm>
153
     (pay_by_quarter),  which  represents   the   employee's
154 155
     salary by quarter and a two-dimensional array of
     <firstterm>text</firstterm>
156
     (schedule),  which  represents  the  employee's  weekly
157 158
     schedule.   Now  we  do  some  <firstterm>INSERTS</firstterm>s;
     note that when
159
     appending to an array, we  enclose  the  values  within
160 161
     braces  and  separate  them  by commas.  If you know
     <firstterm>C</firstterm>,
162
     this is not unlike the syntax for  initializing  structures.
163 164

     <programlisting>
165 166 167 168 169 170 171 172 173
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"}}');
174
     </programlisting>
175

176 177
     By  default,  <productname>Postgres</productname>  uses  the
     "one-based" numbering
178 179
     convention for arrays -- that is, an array  of  n  elements
     starts with array[1] and ends with array[n].
180 181 182 183
     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:
184 185

     <programlisting>
186 187 188 189 190 191 192 193 194 195
SELECT name
    FROM SAL_EMP
    WHERE SAL_EMP.pay_by_quarter[1] &lt;&gt;
    SAL_EMP.pay_by_quarter[2];

+------+
|name  |
+------+
|Carol |
+------+
196 197
     </programlisting>
    </para>
198

199
    <para>
200 201 202
     This query retrieves  the  third  quarter  pay  of  all
     employees:
     
203
     <programlisting>
204 205 206 207 208 209 210 211 212 213
SELECT SAL_EMP.pay_by_quarter[3] FROM SAL_EMP;


+---------------+
|pay_by_quarter |
+---------------+
|10000          |
+---------------+
|25000          |
+---------------+
214 215
     </programlisting>
    </para>
216

217
    <para>
218 219 220
     We  can  also  access  arbitrary slices of an array, or
     subarrays.  This query  retrieves  the  first  item  on
     Bill's schedule for the first two days of the week.
221 222

     <programlisting>
223 224 225 226 227 228 229 230 231
SELECT SAL_EMP.schedule[1:2][1:1]
    FROM SAL_EMP
    WHERE SAL_EMP.name = 'Bill';

+-------------------+
|schedule           |
+-------------------+
|{{"meeting"},{""}} |
+-------------------+
232 233 234 235 236 237 238 239 240
     </programlisting>
    </para>
   </sect2>
  </sect1>

  <sect1>
   <title>More Advanced Features</title>

   <para>
241 242
    <productname>Postgres</productname> has many features not touched
    upon in this
243 244
    tutorial introduction, which has been oriented toward newer users of
    <acronym>SQL</acronym>.
245 246
    These are discussed in more detail in both the User's and
    Programmer's Guides.
247 248 249
   </para>

  </sect1>
250

251 252 253 254
 </chapter>

<!-- Keep this comment at the end of the file
Local variables:
255
mode:sgml
256 257 258 259 260 261 262 263 264
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
265
sgml-local-catalogs:("/usr/lib/sgml/catalog")
266 267 268
sgml-local-ecat-files:nil
End:
-->