query.sgml
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:15k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1.  <Chapter ID="query">
  2.   <TITLE>The Query Language</TITLE>
  3.   <Para>
  4.    The  <ProductName>Postgres</ProductName>  query language is a variant of
  5.    the <Acronym>SQL3</Acronym> draft next-generation standard. It
  6.    has many extensions such as an extensible type  system,
  7.    inheritance,  functions and production rules. These are
  8.    features carried over from the original <ProductName>Postgres</ProductName>  query
  9.    language,  <ProductName>PostQuel</ProductName>.  This section provides an overview
  10.    of how to use <ProductName>Postgres</ProductName>
  11.    <Acronym>SQL</Acronym>  to  perform  simple  operations.
  12.    This manual is only intended to give you an idea of our
  13.    flavor of <Acronym>SQL</Acronym> and is in no way a complete  tutorial  on
  14.    <Acronym>SQL</Acronym>.  Numerous  books  have  been  written  on
  15.    <Acronym>SQL</Acronym>, including
  16. <!--
  17. <XRef LinkEnd="MELT93"> and <XRef LinkEnd="DATE97">.
  18. -->
  19. [MELT93] and [DATE97].
  20.    You should be  aware  that  some language features 
  21.    are extensions to the <Acronym>ANSI</Acronym> standard.
  22.   </Para>
  23.   <Sect1>
  24.    <Title>Interactive Monitor</Title>
  25.    <Para>
  26.     In the examples that follow, we assume  that  you  have
  27.     created  the mydb database as described in the previous
  28.     subsection and have started <Application>psql</Application>.
  29.     Examples  in  this  manual  can  also   be   found   in
  30.     <FileName>/usr/local/pgsql/src/tutorial/</FileName>.    Refer   to   the
  31.     <FileName>README</FileName> file in that directory for how to use them.   To
  32.     start the tutorial, do the following:
  33.     <ProgramListing>
  34. % cd /usr/local/pgsql/src/tutorial
  35. % psql -s mydb
  36. Welcome to the POSTGRESQL interactive sql monitor:
  37.   Please read the file COPYRIGHT for copyright terms of POSTGRESQL
  38.    type ? for help on slash commands
  39.    type q to quit
  40.    type g or terminate with semicolon to execute query
  41.  You are currently connected to the database: postgres
  42. mydb=> i basics.sql
  43.     </ProgramListing>
  44.    </Para>
  45.    <Para>
  46.     The  <Literal>i</Literal>  command  read  in  queries  from the specified
  47.     files. The <Literal>-s</Literal> option puts you in single step mode which
  48.     pauses  before  sending a query to the backend. Queries
  49.     in this section are in the file <FileName>basics.sql</FileName>.
  50.    </Para>
  51.    <Para>
  52.     <Application>psql</Application>
  53.     has a variety of <Literal>d</Literal> commands for showing system information.
  54.     Consult these commands for more details;
  55.     for a listing, type <Literal>?</Literal> at the <Application>psql</Application> prompt.
  56.    </Para>
  57.   </sect1>
  58.   <Sect1>
  59.    <Title>Concepts</Title>
  60.    <Para>
  61.     The fundamental notion in <ProductName>Postgres</ProductName> is that of a  class,
  62.     which  is a named collection of object instances.  Each
  63.     instance has the same collection of  named  attributes,
  64.     and each attribute is of a specific type.  Furthermore,
  65.     each instance has a permanent <FirstTerm>object identifier</FirstTerm>
  66.     (<Acronym>OID</Acronym>)
  67.     that  is  unique  throughout the installation.  Because
  68.     <Acronym>SQL</Acronym> syntax refers to tables,  we  will use  the  terms
  69.     <FirstTerm>table</FirstTerm> and <FirstTerm>class</FirstTerm> interchangeably.
  70.     Likewise, an <Acronym>SQL</Acronym> <FirstTerm>row</FirstTerm> is an
  71.     <FirstTerm>instance</FirstTerm> and <Acronym>SQL</Acronym> <FirstTerm>columns</FirstTerm>
  72.     are <FirstTerm>attributes</FirstTerm>.
  73.     As  previously  discussed,  classes  are  grouped  into
  74.     databases,  and  a collection of databases managed by a
  75.     single <Application>postmaster</Application> process constitutes  an  installation
  76.     or site.
  77.    </Para>
  78.   </sect1>
  79.   <Sect1>
  80.    <Title>Creating a New Class</Title>
  81.    <Para>
  82.     You  can  create  a  new  class by specifying the class
  83.     name, along with all attribute names and their types:
  84.     <ProgramListing>
  85. CREATE TABLE weather (
  86.     city            varchar(80),
  87.     temp_lo         int,           -- low temperature
  88.     temp_hi         int,           -- high temperature
  89.     prcp            real,          -- precipitation
  90.     date            date
  91. );
  92.     </ProgramListing>
  93.    </para>
  94.    <Para>
  95.     Note that both keywords and identifiers are case-insensitive; identifiers can become
  96.     case-sensitive by surrounding them with double-quotes as allowed
  97.     by <Acronym>SQL92</Acronym>.
  98.     <ProductName>Postgres</ProductName>  <Acronym>SQL</Acronym> supports the usual
  99.     <Acronym>SQL</Acronym> types <Type>int</Type>,
  100.     <Type>float</Type>,  <Type>real</Type>,  <Type>smallint</Type>,  <Type>char(N)</Type>,  
  101.     <Type>varchar(N)</Type>,  <Type>date</Type>, <Type>time</Type>,
  102.     and <Type>timestamp</Type>, as well as other types of general utility and
  103.     a rich set of geometric types.  As we will 
  104.     see later, <ProductName>Postgres</ProductName> can be customized  with  an  
  105.     arbitrary  number  of
  106.     user-defined  data types.  Consequently, type names are
  107.     not syntactical keywords, except where required to support special
  108.     cases in the <Acronym>SQL92</Acronym> standard.
  109.     So far, the <ProductName>Postgres</ProductName> create command
  110.     looks exactly  like
  111.     the  command  used  to  create a table in a traditional
  112.     relational system.  However, we will presently see that
  113.     classes  have  properties  that  are  extensions of the
  114.     relational model.
  115.    </Para>
  116.   </sect1>
  117.   <Sect1>
  118.    <Title>Populating a Class with Instances</Title>
  119.    <Para>
  120.     The <Command>insert</Command> statement is used to populate a  class  with
  121.     instances:
  122.     <ProgramListing>
  123. INSERT INTO weather
  124.     VALUES ('San Francisco', 46, 50, 0.25, '11/27/1994')
  125.     </ProgramListing>
  126.    </Para>
  127.    <Para>
  128.     You can also use the <Command>copy</Command> command to perform load large
  129.     amounts of data from flat (<Acronym>ASCII</Acronym>) files.
  130.     This is usually faster because the data is read (or written) as a single atomic
  131.     transaction directly to or from the target table. An example would be:
  132.     <ProgramListing>
  133. COPY INTO weather FROM '/home/user/weather.txt'
  134.     USING DELIMITERS '|';
  135.     </ProgramListing>
  136.     where the path name for the source file must be available to the backend server
  137.     machine, not the client, since the backend server reads the file directly.
  138.    </para>
  139.   </sect1>
  140.   <Sect1>
  141.    <Title>Querying a Class</Title>
  142.    <Para>
  143.     The weather class can be queried with normal relational
  144.     selection  and projection queries.  A <Acronym>SQL</Acronym> <Command>select</Command> 
  145.     statement is used to do this.  The statement is divided into
  146.     a target list (the part that lists the attributes to be
  147.     returned) and a qualification (the part that  specifies
  148.     any  restrictions).   For  example, to retrieve all the
  149.     rows of weather, type:
  150.     <ProgramListing>
  151. SELECT * FROM WEATHER;
  152.     </ProgramListing>
  153.     and the output should be:
  154.     <ProgramListing>
  155. +--------------+---------+---------+------+------------+
  156. |city          | temp_lo | temp_hi | prcp | date       |
  157. +--------------+---------+---------+------+------------+
  158. |San Francisco | 46      | 50      | 0.25 | 11-27-1994 |
  159. +--------------+---------+---------+------+------------+
  160. |San Francisco | 43      | 57      | 0    | 11-29-1994 |
  161. +--------------+---------+---------+------+------------+
  162. |Hayward       | 37      | 54      |      | 11-29-1994 |
  163. +--------------+---------+---------+------+------------+
  164.     </ProgramListing>
  165.     You may specify any arbitrary expressions in the  target list. For example, you can do:
  166.     <ProgramListing>
  167. SELECT city, (temp_hi+temp_lo)/2 AS temp_avg, date FROM weather;
  168.     </ProgramListing>
  169.    </Para>
  170.    <Para>
  171.     Arbitrary  Boolean  operators
  172.     (<Command>and</Command>,  <Command>or</Command> and <Command>not</Command>) are
  173.     allowed in the qualification of any query.   For  example,
  174.     <ProgramListing>
  175. SELECT * FROM weather
  176.     WHERE city = 'San Francisco'
  177.     AND prcp > 0.0;
  178.     </programlisting>
  179. results in:
  180.     <programlisting>
  181. +--------------+---------+---------+------+------------+
  182. |city          | temp_lo | temp_hi | prcp | date       |
  183. +--------------+---------+---------+------+------------+
  184. |San Francisco | 46      | 50      | 0.25 | 11-27-1994 |
  185. +--------------+---------+---------+------+------------+
  186.     </ProgramListing>
  187.    </Para>
  188.    <Para>
  189.     As  a final note, you can specify that the results of a
  190.     select can be returned in a <FirstTerm>sorted order</FirstTerm>
  191.     or with <FirstTerm>duplicate instances</FirstTerm> removed.
  192.     <ProgramListing>
  193. SELECT DISTINCT city
  194.     FROM weather
  195.     ORDER BY city;
  196.     </ProgramListing>
  197.    </Para>
  198.   </sect1>
  199.   <Sect1>
  200.    <Title>Redirecting SELECT Queries</Title>
  201.    <Para>
  202.     Any select query can be redirected to a new class
  203.     <ProgramListing>
  204. SELECT * INTO TABLE temp FROM weather;
  205.     </ProgramListing>
  206.    </Para>
  207.    <Para>
  208.     This forms an implicit <Command>create</Command> command, creating a new
  209.     class temp with the attribute names and types specified
  210.     in  the target list of the <Command>select into</Command> command.  We can
  211.     then, of course, perform any operations on the  resulting 
  212.     class that we can perform on other classes.
  213.    </Para>
  214.   </sect1>
  215.   <Sect1>
  216.    <Title>Joins Between Classes</Title>
  217.    <Para>
  218.     Thus far, our queries have only accessed one class at a
  219.     time.  Queries can access multiple classes at once,  or
  220.     access  the  same  class  in  such  a way that multiple
  221.     instances of the class are being processed at the  same
  222.     time.   A query that accesses multiple instances of the
  223.     same or different classes at one time is called a  join
  224.     query.
  225.     As an example, say we wish to find all the records that
  226.     are in the  temperature  range  of  other  records.  In
  227.     effect,  we  need  to  compare  the temp_lo and temp_hi
  228.     attributes of each EMP  instance  to  the  temp_lo  and
  229.     temp_hi  attributes of all other EMP instances.
  230.     <Note>
  231.      <Para>
  232.       This  is only a conceptual model.  The actual join may
  233.       be performed in a more efficient manner, but this is invisible to the user.
  234.      </Para>
  235.     </Note>
  236.     We can do this with the following query:
  237.     <ProgramListing>
  238. SELECT W1.city, W1.temp_lo AS low, W1.temp_hi AS high,
  239.     W2.city, W2.temp_lo AS low, W2.temp_hi AS high
  240.     FROM weather W1, weather W2
  241.     WHERE W1.temp_lo < W2.temp_lo
  242.     AND W1.temp_hi > W2.temp_hi;
  243. +--------------+-----+------+---------------+-----+------+
  244. |city          | low | high | city          | low | high |
  245. +--------------+-----+------+---------------+-----+------+
  246. |San Francisco | 43  | 57   | San Francisco | 46  | 50   |
  247. +--------------+-----+------+---------------+-----+------+
  248. |San Francisco | 37  | 54   | San Francisco | 46  | 50   |
  249. +--------------+-----+------+---------------+-----+------+
  250.     </ProgramListing>     
  251.     <Note>
  252.      <Para>
  253.       The semantics of such a join are 
  254.       that the qualification
  255.       is a truth expression defined for the Cartesian  product  of
  256.       the  classes indicated in the query.  For those instances in
  257.       the Cartesian product for which the qualification  is  true,
  258.       <ProductName>Postgres</ProductName>  computes  and  returns the
  259.       values specified in the target list.  
  260.       <ProductName>Postgres</ProductName> <Acronym>SQL</Acronym>
  261.       does not assign  any  meaning  to
  262.       duplicate values in such expressions. 
  263.       This means that <ProductName>Postgres</ProductName> 
  264.       sometimes recomputes the same target list several times;
  265.       this frequently happens when Boolean expressions are connected 
  266.       with an "or".  To remove such duplicates, you must  use
  267.       the <Command>select distinct</Command> statement.
  268.      </Para>
  269.     </Note>
  270.    </para>
  271.    <Para>
  272.     In this case, both W1 and  W2  are  surrogates for  an
  273.     instance  of the class weather, and both range over all
  274.     instances of the class.  (In the  terminology  of  most
  275.     database  systems,  W1 and W2 are known as <FirstTerm>range variables</FirstTerm>.)  
  276.     A query can contain an  arbitrary  number  of
  277.     class names and surrogates.
  278.    </Para>
  279.   </sect1>
  280.   <Sect1>
  281.    <Title>Updates</Title>
  282.    <Para>
  283.     You can update existing instances using the update command. 
  284.     Suppose you discover the temperature readings are
  285.     all  off  by 2 degrees as of Nov 28, you may update the
  286.     data as follow:
  287.     <ProgramListing>
  288. UPDATE weather
  289.     SET temp_hi = temp_hi - 2,  temp_lo = temp_lo - 2
  290.     WHERE date > '11/28/1994';
  291.     </ProgramListing>
  292.    </Para>
  293.   </sect1>
  294.   <Sect1>
  295.    <Title>Deletions</Title>
  296.    <Para>
  297.     Deletions are performed using the <Command>delete</Command> command:
  298.     <ProgramListing>
  299. DELETE FROM weather WHERE city = 'Hayward';
  300.     </ProgramListing>
  301.     All weather recording belongs to Hayward is removed.
  302.     One should be wary of queries of the form
  303.     <ProgramListing>
  304. DELETE FROM classname;
  305.     </ProgramListing>
  306.     Without a qualification, <Command>delete</Command> will simply
  307.     remove  all  instances  of  the given class, leaving it
  308.     empty.  The system will not request confirmation before
  309.     doing this.
  310.    </Para>
  311.   </sect1>
  312.   <Sect1>
  313.    <Title>Using Aggregate Functions</Title>
  314.    <Para>
  315.     Like  most  other  query  languages, 
  316.     <ProductName>PostgreSQL</ProductName> supports
  317.     aggregate functions.
  318.     The current  implementation  of
  319.     <ProductName>Postgres</ProductName> aggregate functions have some limitations.
  320.     Specifically, while there  are  aggregates  to  compute
  321.     such  functions as the <Function>count</Function>, <Function>sum</Function>,
  322.     <Function>avg</Function> (average), <Function>max</Function> (maximum) and
  323.     <Function>min</Function> (minimum) over a set of instances,  aggregates  can  only
  324.     appear  in  the  target  list of a query and not directly in the
  325.     qualification (the where clause). As an example,
  326.     <ProgramListing>
  327. SELECT max(temp_lo) FROM weather;
  328.     </ProgramListing>
  329.     is allowed, while
  330.     <ProgramListing>
  331. SELECT city FROM weather WHERE temp_lo = max(temp_lo);
  332.     </ProgramListing>
  333.     is not. However, as is often the case the query can be restated to accomplish 
  334.     the intended result; here by using a <FirstTerm>subselect</FirstTerm>:
  335.     <ProgramListing>
  336. SELECT city FROM weather WHERE temp_lo = (SELECT max(temp_lo) FROM weather);
  337.     </ProgramListing>
  338.    </Para>
  339.    <Para>
  340.     Aggregates may also have <FirstTerm>group by</FirstTerm> clauses:
  341.     <ProgramListing>
  342. SELECT city, max(temp_lo)
  343.     FROM weather
  344.     GROUP BY city;
  345.     </ProgramListing>
  346.    </Para>
  347.   </sect1>
  348.  </Chapter>
  349. <!-- Keep this comment at the end of the file
  350. Local variables:
  351. mode: sgml
  352. sgml-omittag:nil
  353. sgml-shorttag:t
  354. sgml-minimize-attributes:nil
  355. sgml-always-quote-attributes:t
  356. sgml-indent-step:1
  357. sgml-indent-data:t
  358. sgml-parent-document:nil
  359. sgml-default-dtd-file:"./reference.ced"
  360. sgml-exposed-tags:nil
  361. sgml-local-catalogs:"/usr/lib/sgml/CATALOG"
  362. sgml-local-ecat-files:nil
  363. End:
  364. -->