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

数据库系统

开发平台:

Unix_Linux

  1.  <chapter id="sql">
  2.   <title>SQL</title>
  3.   <abstract>
  4.    <para>
  5.     This chapter originally appeared as a part of
  6.     Stefan Simkovics' Master's Thesis
  7.     (<xref linkend="SIM98" endterm="SIM98">).
  8.    </para>
  9.   </abstract>
  10.   <para>
  11.    <acronym>SQL</acronym> has become the most popular relational query language.
  12.    The name <quote><acronym>SQL</acronym></quote> is an abbreviation for
  13.    <firstterm>Structured Query Language</firstterm>. 
  14.    In 1974 Donald Chamberlin and others defined the
  15.    language SEQUEL (<firstterm>Structured English Query Language</firstterm>) at IBM
  16.    Research. This language was first implemented in an IBM
  17.    prototype called SEQUEL-XRM in 1974-75. In 1976-77 a revised version
  18.    of SEQUEL called SEQUEL/2 was defined and the name was changed to
  19.    <acronym>SQL</acronym>
  20.    subsequently.
  21.   </para>
  22.   <para>
  23.    A new prototype called System R was developed by IBM in 1977. System R
  24.    implemented a large subset of SEQUEL/2 (now <acronym>SQL</acronym>) and a number of
  25.    changes were made to <acronym>SQL</acronym> during the project.
  26.    System R was installed in
  27.    a number of user sites, both internal IBM sites and also some selected
  28.    customer sites. Thanks to the success and acceptance of System R at
  29.    those user sites IBM started to develop commercial products that
  30.    implemented the <acronym>SQL</acronym> language based on the System R technology.
  31.   </para>
  32.   <para>
  33.    Over the next years IBM and also a number of other vendors announced
  34.    <acronym>SQL</acronym> products such as
  35.    <productname>SQL/DS</productname> (IBM),
  36.    <productname>DB2</productname> (IBM),
  37.    <productname>ORACLE</productname> (Oracle Corp.),
  38.    <productname>DG/SQL</productname> (Data General Corp.),
  39.    and <productname>SYBASE</productname> (Sybase Inc.).
  40.   </para>
  41.   <para>
  42.    <acronym>SQL</acronym> is also an official standard now. In 1982 the American National
  43.    Standards Institute (<acronym>ANSI</acronym>) chartered its Database Committee X3H2 to
  44.    develop a proposal for a standard relational language. This proposal
  45.    was ratified in 1986 and consisted essentially of the IBM dialect of
  46.    <acronym>SQL</acronym>. In 1987 this <acronym>ANSI</acronym> 
  47.    standard was also accepted as an international
  48.    standard by the International Organization for Standardization
  49.    (<acronym>ISO</acronym>).
  50.    This original standard version of <acronym>SQL</acronym> is often referred to,
  51.    informally, as "<abbrev>SQL/86</abbrev>". In 1989 the original standard was extended
  52.    and this new standard is often, again informally, referred to as
  53.    "<abbrev>SQL/89</abbrev>". Also in 1989, a related standard called
  54.    <firstterm>Database Language Embedded <acronym>SQL</acronym></firstterm>
  55.    (<acronym>ESQL</acronym>) was developed.
  56.   </para>
  57.   <para>
  58.    The <acronym>ISO</acronym> and <acronym>ANSI</acronym> committees
  59.    have been working for many years on the
  60.    definition of a greatly expanded version of the original standard,
  61.    referred to informally as <firstterm><acronym>SQL2</acronym></firstterm>
  62.    or <firstterm><acronym>SQL/92</acronym></firstterm>. This version became a
  63.    ratified standard - "International Standard ISO/IEC 9075:1992,
  64.    Database Language <acronym>SQL</acronym>" - in late 1992.
  65.    <acronym>SQL/92</acronym> is the version
  66.    normally meant when people refer to "the <acronym>SQL</acronym> standard". A detailed
  67.    description of <acronym>SQL/92</acronym> is given in 
  68.    <xref linkend="DATE97" endterm="DATE97">. At the time of
  69.    writing this document a new standard informally referred to
  70.    as <firstterm><acronym>SQL3</acronym></firstterm>
  71.    is under development. It is planned to make <acronym>SQL</acronym> a Turing-complete
  72.    language, i.e. all computable queries (e.g. recursive queries) will be
  73.    possible. This is a very complex task and therefore the completion of
  74.    the new standard can not be expected before 1999.
  75.   </para>
  76.   <sect1 id="rel-model">
  77.    <title>The Relational Data Model</title>
  78.   <para>
  79.     As mentioned before, <acronym>SQL</acronym> is a relational
  80.     language. That means it is
  81.     based on the <firstterm>relational data model</firstterm>
  82.     first published by E.F. Codd in
  83.     1970. We will give a formal description of the relational model
  84.     later (in
  85.     <xref linkend="formal-notion" endterm="formal-notion">)
  86.     but first we want to have a look at it from a more intuitive
  87.     point of view.
  88.   </para>
  89.   <para>
  90.     A <firstterm>relational database</firstterm> is a database that is perceived by its
  91.     users as a <firstterm>collection of tables</firstterm> (and nothing else but tables).
  92.     A table consists of rows and columns where each row represents a
  93.     record and each column represents an attribute of the records
  94.     contained in the table.
  95.     <xref linkend="supplier-fig" endterm="supplier-fig">
  96.     shows an example of a database consisting of three tables:
  97.     <itemizedlist>
  98.      <listitem>
  99.       <para>
  100.        SUPPLIER is a table storing the number
  101.        (SNO), the name (SNAME) and the city (CITY) of a supplier.
  102.       </para>
  103.      </listitem>
  104.      <listitem>
  105.       <para>
  106.        PART is a table storing the number (PNO) the name (PNAME) and
  107.        the price (PRICE) of a part.
  108.       </para>
  109.      </listitem>
  110.      <listitem>
  111.       <para>
  112.        SELLS stores information about which part (PNO) is sold by which
  113.        supplier (SNO). 
  114.        It serves in a sense to connect the other two tables together.
  115.       </para>
  116.      </listitem>
  117.     </itemizedlist>
  118.     <example>
  119.      <title id="supplier-fig">The Suppliers and Parts Database</title>
  120.      <programlisting>
  121.    SUPPLIER   SNO |  SNAME  |  CITY      SELLS   SNO | PNO
  122.              -----+---------+--------           -----+-----
  123.                1  |  Smith  | London              1  |  1
  124.                2  |  Jones  | Paris               1  |  2
  125.                3  |  Adams  | Vienna              2  |  4
  126.                4  |  Blake  | Rome                3  |  1
  127.                                                   3  |  3
  128.                                                   4  |  2
  129.    PART       PNO |  PNAME  |  PRICE              4  |  3 
  130.              -----+---------+---------            4  |  4
  131.                1  |  Screw  |   10
  132.                2  |  Nut    |    8
  133.                3  |  Bolt   |   15
  134.                4  |  Cam    |   25
  135.      </programlisting>
  136.     </example>
  137.    </para>
  138.    <para>
  139.     The tables PART and SUPPLIER may be regarded as <firstterm>entities</firstterm> and
  140.     SELLS may be regarded as a <firstterm>relationship</firstterm> between a particular
  141.     part and a particular supplier. 
  142.    </para>
  143.    <para>
  144.     As we will see later, <acronym>SQL</acronym> operates on tables like the ones just
  145.     defined but before that we will study the theory of the relational
  146.     model.
  147.    </para>
  148.   </sect1>
  149.   <sect1>
  150.    <title id="formal-notion">Relational Data Model Formalities</title>
  151.    <para>
  152.     The mathematical concept underlying the relational model is the
  153.     set-theoretic <firstterm>relation</firstterm> which is a subset of the Cartesian
  154.     product of a list of domains. This set-theoretic relation gives
  155.     the model its name (do not confuse it with the relationship from the
  156.     <firstterm>Entity-Relationship model</firstterm>).
  157.     Formally a domain is simply a set of
  158.     values. For example the set of integers is a domain. Also the set of
  159.     character strings of length 20 and the real numbers are examples of
  160.     domains.
  161.    </para>
  162.    <para>
  163. <!--
  164. begin{definition}
  165. The <firstterm>Cartesian product</firstterm> of domains $D_{1}, D_{2},ldots, D_{k}$ written
  166. mbox{$D_{1} times D_{2} times ldots times D_{k}$} is the set of
  167. all $k$-tuples $(v_{1},v_{2},ldots,v_{k})$ such that mbox{$v_{1} in
  168. D_{1}, v_{2} in D_{2}, ldots, v_{k} in D_{k}$}.
  169. end{definition}
  170. -->
  171.     The <firstterm>Cartesian product</firstterm> of domains
  172.     <parameter>D<subscript>1</subscript></parameter>,
  173.     <parameter>D<subscript>2</subscript></parameter>,
  174.     ...
  175.     <parameter>D<subscript>k</subscript></parameter>,
  176.     written
  177.     <parameter>D<subscript>1</subscript></parameter> &times;
  178.     <parameter>D<subscript>2</subscript></parameter> &times;
  179.     ... &times;
  180.     <parameter>D<subscript>k</subscript></parameter>
  181.     is the set of all k-tuples
  182.     <parameter>v<subscript>1</subscript></parameter>,
  183.     <parameter>v<subscript>2</subscript></parameter>,
  184.     ...
  185.     <parameter>v<subscript>k</subscript></parameter>,
  186.     such that
  187.     <parameter>v<subscript>1</subscript></parameter> &isin; 
  188.     <parameter>D<subscript>1</subscript></parameter>,
  189.     <parameter>v<subscript>1</subscript></parameter> &isin; 
  190.     <parameter>D<subscript>1</subscript></parameter>,
  191.     ...
  192.     <parameter>v<subscript>k</subscript></parameter> &isin; 
  193.     <parameter>D<subscript>k</subscript></parameter>.
  194.    </para>
  195.    <para>
  196.     For example, when we have
  197. <!--
  198.  $k=2$, $D_{1}={0,1}$ and
  199. $D_{2}={a,b,c}$, then $D_{1} times D_{2}$ is
  200. ${(0,a),(0,b),(0,c),(1,a),(1,b),(1,c)}$.
  201. -->
  202.     <parameter>k</parameter>=2,
  203.     <parameter>D<subscript>1</subscript></parameter>=<literal>{0,1}</literal> and
  204.     <parameter>D<subscript>2</subscript></parameter>=<literal>{a,b,c}</literal> then
  205.     <parameter>D<subscript>1</subscript></parameter> &times;
  206.     <parameter>D<subscript>2</subscript></parameter> is
  207.     <literal>{(0,a),(0,b),(0,c),(1,a),(1,b),(1,c)}</literal>.
  208.    </para>
  209.    <para>
  210. <!--
  211. begin{definition}
  212. A Relation is any subset of the Cartesian product of one or more
  213. domains: $R subseteq$ mbox{$D_{1} times D_{2} times ldots times D_{k}$}
  214. end{definition}
  215. -->
  216.     A Relation is any subset of the Cartesian product of one or more
  217.     domains: <parameter>R</parameter> &sube;
  218.     <parameter>D<subscript>1</subscript></parameter> &times;
  219.     <parameter>D<subscript>2</subscript></parameter> &times;
  220.     ... &times;
  221.     <parameter>D<subscript>k</subscript></parameter>.
  222.    </para>
  223.    <para>
  224.     For example <literal>{(0,a),(0,b),(1,a)}</literal> is a relation;
  225.     it is in fact a subset of
  226.     <parameter>D<subscript>1</subscript></parameter> &times;
  227.     <parameter>D<subscript>2</subscript></parameter>
  228.     mentioned above.
  229.    </para>
  230.    <para>
  231.     The members of a relation are called tuples. Each relation of some
  232.     Cartesian product
  233.     <parameter>D<subscript>1</subscript></parameter> &times;
  234.     <parameter>D<subscript>2</subscript></parameter> &times;
  235.     ... &times;
  236.     <parameter>D<subscript>k</subscript></parameter>
  237.     is said to have arity <literal>k</literal> and is therefore a set
  238.     of <literal>k</literal>-tuples.
  239.    </para>
  240.    <para>
  241.     A relation can be viewed as a table (as we already did, remember
  242.     <xref linkend="supplier-fig" endterm="supplier-fig"> where
  243.     every tuple is represented by a row and every column corresponds to
  244.     one component of a tuple. Giving names (called attributes) to the
  245.     columns leads to the definition of a 
  246.     <firstterm>relation scheme</firstterm>.
  247.    </para>
  248.    <para>
  249. <!--
  250. begin{definition}
  251. A {it relation scheme} $R$ is a finite set of attributes
  252. mbox{${A_{1},A_{2},ldots,A_{k}}$}. There is a domain $D_{i}$ for
  253. each attribute $A_{i}, 1 le i le k$ where the values of the
  254. attributes are taken from. We often write a relation scheme as
  255. mbox{$R(A_{1},A_{2},ldots,A_{k})$}.
  256. end{definition}
  257. -->
  258.     A <firstterm>relation scheme</firstterm> <literal>R</literal> is a 
  259.     finite set of attributes
  260.     <parameter>A<subscript>1</subscript></parameter>,
  261.     <parameter>A<subscript>2</subscript></parameter>,
  262.     ...
  263.     <parameter>A<subscript>k</subscript></parameter>.
  264.     There is a domain
  265.     <parameter>D<subscript>i</subscript></parameter>,
  266.     for each attribute
  267.     <parameter>A<subscript>i</subscript></parameter>,
  268.     1 &lt;= <literal>i</literal> &lt;= <literal>k</literal>,
  269.     where the values of the attributes are taken from. We often write
  270.     a relation scheme as
  271.     <literal>R(<parameter>A<subscript>1</subscript></parameter>,
  272.     <parameter>A<subscript>2</subscript></parameter>,
  273.     ...
  274.     <parameter>A<subscript>k</subscript></parameter>)</literal>.
  275.     <note>
  276.      <para>
  277.       A <firstterm>relation scheme</firstterm> is just a kind of template
  278.        whereas a <firstterm>relation</firstterm> is an instance of a <firstterm>relation
  279.        scheme</firstterm>. The relation consists of tuples (and can therefore be
  280.       viewed as a table); not so the relation scheme.
  281.      </para>
  282.     </note>
  283.    </para>
  284.    <sect2>
  285.     <title id="domains">Domains vs. Data Types</title>
  286.     <para>
  287.      We often talked about <firstterm>domains</firstterm>
  288.      in the last section. Recall that a
  289.      domain is, formally, just a set of values (e.g., the set of integers or
  290.      the real numbers). In terms of database systems we often talk of
  291.      <firstterm>data types</firstterm> instead of domains.
  292.      When we define a table we have to make
  293.      a decision about which attributes to include. Additionally we
  294.      have to decide which kind of data is going to be stored as
  295.      attribute values. For example the values of
  296.      <classname>SNAME</classname> from the table
  297.      <classname>SUPPLIER</classname> will be character strings,
  298.      whereas <classname>SNO</classname> will store
  299.      integers. We define this by assigning a data type to each
  300.      attribute. The type of <classname>SNAME</classname> will be
  301.      <type>VARCHAR(20)</type> (this is the <acronym>SQL</acronym> type
  302.      for character strings of length &lt;= 20),
  303.      the type of <classname>SNO</classname> will be
  304.      <type>INTEGER</type>. With the assignment of a data type we also have selected
  305.      a domain for an attribute. The domain of <classname>SNAME</classname> is the set of all
  306.      character strings of length &lt;= 20,
  307.      the domain of <classname>SNO</classname> is the set of
  308.      all integer numbers.
  309.     </para>
  310.    </sect2>
  311.   </sect1>
  312.   <sect1>
  313.    <title id="operations">Operations in the Relational Data Model</title>
  314.    <para>
  315.     In the previous section (<xref linkend="formal-notion" endterm="formal-notion">)
  316.     we defined the mathematical notion of
  317.     the relational model. Now we know how the data can be stored using a
  318.     relational data model but we do not know what to do with all these
  319.     tables to retrieve something from the database yet. For example somebody
  320.     could ask for the names of all suppliers that sell the part
  321.     'Screw'. Therefore two rather different kinds of notations for
  322.     expressing operations on relations have been defined:
  323.     <itemizedlist>
  324.      <listitem>
  325.       <para>
  326.        The <firstterm>Relational Algebra</firstterm> which is an algebraic notation,
  327.        where queries are expressed by applying specialized operators to the
  328.        relations.
  329.       </para>
  330.      </listitem>
  331.      <listitem>
  332.       <para>
  333.        The <firstterm>Relational Calculus</firstterm> which is a logical notation,
  334.        where queries are expressed by formulating some logical restrictions
  335.        that the tuples in the answer must satisfy.
  336.       </para>
  337.     </listitem>
  338.     </itemizedlist>
  339.    </para>
  340.    <sect2>
  341.     <title id="rel-alg">Relational Algebra</title>
  342.     <para>
  343.      The <firstterm>Relational Algebra</firstterm> was introduced by
  344.      E. F. Codd in 1972. It consists of a set of operations on relations:
  345.      <itemizedlist>
  346.       <listitem>
  347.        <para>
  348. SELECT (&sigma;): extracts <firstterm>tuples</firstterm> from a relation that
  349. satisfy a given restriction. Let <parameter>R</parameter> be a 
  350. table that contains an attribute
  351. <parameter>A</parameter>.
  352. &sigma;<subscript>A=a</subscript>(R) = {t &isin; R &mid; t(A) = a}
  353. where <literal>t</literal> denotes a
  354. tuple of <parameter>R</parameter> and <literal>t(A)</literal>
  355. denotes the value of attribute <parameter>A</parameter> of
  356. tuple <literal>t</literal>.
  357.        </para>
  358.       </listitem>
  359.       <listitem>
  360.        <para>
  361. PROJECT (&pi;): extracts specified
  362. <firstterm>attributes</firstterm> (columns) from a
  363. relation. Let <classname>R</classname> be a relation
  364. that contains an attribute <classname>X</classname>.
  365. &pi;<subscript>X</subscript>(<classname>R</classname>) = {t(X) &mid; t &isin; <classname>R</classname>},
  366. where <literal>t</literal>(<classname>X</classname>) denotes the value of
  367. attribute <classname>X</classname> of tuple <literal>t</literal>.
  368.        </para>
  369.       </listitem>
  370.       <listitem>
  371.        <para>
  372. PRODUCT (&times;): builds the Cartesian product of two
  373. relations. Let <classname>R</classname> be a table with arity
  374. <literal>k</literal><subscript>1</subscript> and let
  375. <classname>S</classname> be a table with
  376. arity <literal>k</literal><subscript>2</subscript>.
  377. <classname>R</classname> &times; <classname>S</classname>
  378. is the set of all 
  379. <literal>k</literal><subscript>1</subscript>
  380. + <literal>k</literal><subscript>2</subscript>-tuples
  381. whose first <literal>k</literal><subscript>1</subscript>
  382. components form a tuple in <classname>R</classname> and whose last
  383. <literal>k</literal><subscript>2</subscript> components form a
  384. tuple in <classname>S</classname>.
  385.        </para>
  386.       </listitem>
  387.       <listitem>
  388.        <para>
  389. UNION (&cup;): builds the set-theoretic union of two
  390. tables. Given the tables <classname>R</classname> and
  391. <classname>S</classname> (both must have the same arity),
  392. the union <classname>R</classname> &cup; <classname>S</classname>
  393. is the set of tuples that are in <classname>R</classname>
  394. or <classname>S</classname> or both.
  395.        </para>
  396.       </listitem>
  397.       <listitem>
  398.        <para>
  399. INTERSECT (&cap;): builds the set-theoretic intersection of two
  400. tables. Given the tables <classname>R</classname> and
  401. <classname>S</classname>,
  402. <classname>R</classname> &cup; <classname>S</classname> is the set of tuples
  403. that are in <classname>R</classname> and in
  404. <classname>S</classname>.
  405. We again require that <classname>R</classname> and <classname>S</classname> have the
  406. same arity.
  407.        </para>
  408.       </listitem>
  409.       <listitem>
  410.        <para>
  411. DIFFERENCE (&minus; or &setmn;): builds the set difference of
  412. two tables. Let <classname>R</classname> and <classname>S</classname>
  413. again be two tables with the same
  414. arity. <classname>R</classname> - <classname>S</classname>
  415. is the set of tuples in <classname>R</classname> but not in <classname>S</classname>.
  416.        </para>
  417.       </listitem>
  418.       <listitem>
  419.        <para>
  420. JOIN (&prod;): connects two tables by their common
  421. attributes. Let <classname>R</classname> be a table with the 
  422. attributes <classname>A</classname>,<classname>B</classname> 
  423. and <classname>C</classname> and
  424. let <classname>S</classname> be a table with the attributes
  425. <classname>C</classname>,<classname>D</classname>
  426. and <classname>E</classname>. There is one
  427. attribute common to both relations,
  428. the attribute <classname>C</classname>. 
  429. <!--
  430. <classname>R</classname> &prod; <classname>S</classname> =
  431. &pi;<subscript><classname>R</classname>.<classname>A</classname>,<classname>R</classname>.<classname>B</classname>,<classname>R</classname>.<classname>C</classname>,<classname>S</classname>.<classname>D</classname>,<classname>S</classname>.<classname>E</classname></subscript>(&sigma;<subscript><classname>R</classname>.<classname>C</classname>=<classname>S</classname>.<classname>C</classname></subscript>(<classname>R</classname> &times; <classname>S</classname>)).
  432. -->
  433. R &prod; S = &pi;<subscript>R.A,R.B,R.C,S.D,S.E</subscript>(&sigma;<subscript>R.C=S.C</subscript>(R &times; S)).
  434. What are we doing here? We first calculate the Cartesian
  435. product
  436. <classname>R</classname> &times; <classname>S</classname>.
  437. Then we select those tuples whose values for the common
  438. attribute <classname>C</classname> are equal
  439. (&sigma;<subscript>R.C = S.C</subscript>).
  440. Now we have a table
  441. that contains the attribute <classname>C</classname>
  442. two times and we correct this by
  443. projecting out the duplicate column.
  444.        </para>
  445.        <example>
  446. <title id="join-example">An Inner Join</title>
  447. <para>
  448.  Let's have a look at the tables that are produced by evaluating the steps
  449.  necessary for a join.
  450.  Let the following two tables be given:
  451.  <programlisting>
  452.          R   A | B | C      S   C | D | E
  453.             ---+---+---        ---+---+---
  454.              1 | 2 | 3          3 | a | b
  455.              4 | 5 | 6          6 | c | d
  456.              7 | 8 | 9
  457.  </programlisting>
  458. </para>
  459.        </example>
  460.        <para>
  461. First we calculate the Cartesian product
  462. <classname>R</classname> &times; <classname>S</classname> and
  463. get:
  464. <programlisting>
  465.        R x S   A | B | R.C | S.C | D | E
  466.               ---+---+-----+-----+---+---
  467.                1 | 2 |  3  |  3  | a | b
  468.                1 | 2 |  3  |  6  | c | d
  469.                4 | 5 |  6  |  3  | a | b
  470.                4 | 5 |  6  |  6  | c | d
  471.                7 | 8 |  9  |  3  | a | b
  472.                7 | 8 |  9  |  6  | c | d
  473. </programlisting>
  474.        </para>
  475.        <para>
  476. After the selection
  477. &sigma;<subscript>R.C=S.C</subscript>(R &times; S)
  478. we get:
  479. <programlisting>
  480.                A | B | R.C | S.C | D | E
  481.               ---+---+-----+-----+---+---
  482.                1 | 2 |  3  |  3  | a | b
  483.                4 | 5 |  6  |  6  | c | d
  484. </programlisting>
  485.        </para>
  486.        <para>
  487. To remove the duplicate column
  488. <classname>S</classname>.<classname>C</classname>
  489. we project it out by the following operation:
  490. &pi;<subscript>R.A,R.B,R.C,S.D,S.E</subscript>(&sigma;<subscript>R.C=S.C</subscript>(R &times; S))
  491. and get:
  492. <programlisting>
  493.                    A | B | C | D | E
  494.                   ---+---+---+---+---
  495.                    1 | 2 | 3 | a | b
  496.                    4 | 5 | 6 | c | d
  497. </programlisting>
  498.        </para>
  499.       </listitem>
  500.       <listitem>
  501.        <para>
  502. DIVIDE (&divide;): Let <classname>R</classname> be a table
  503. with the attributes A, B, C, and D and let
  504. <classname>S</classname> be a table with the attributes
  505. C and D.
  506. Then we define the division as:
  507. R &divide; S = {t &mid; &forall; t<subscript>s</subscript> &isin; S
  508.  &exist; t<subscript>r</subscript> &isin; R
  509. such that
  510. t<subscript>r</subscript>(A,B)=t&and;t<subscript>r</subscript>(C,D)=t<subscript>s</subscript>}
  511. where
  512. t<subscript>r</subscript>(x,y)
  513. denotes a
  514. tuple of table <classname>R</classname> that consists only of
  515. the components <literal>x</literal> and <literal>y</literal>.
  516. Note that the tuple <literal>t</literal> only consists of the
  517. components <classname>A</classname> and
  518. <classname>B</classname> of relation <classname>R</classname>.
  519.        </para>
  520.        <para id="divide-example">
  521. Given the following tables
  522. <programlisting>
  523.           R   A | B | C | D        S   C | D
  524.              ---+---+---+---          ---+---
  525.               a | b | c | d            c | d
  526.               a | b | e | f            e | f
  527.               b | c | e | f
  528.               e | d | c | d
  529.               e | d | e | f
  530.               a | b | d | e
  531. </programlisting>
  532. R &divide; S
  533. is derived as
  534. <programlisting>
  535.                          A | B
  536.                         ---+---
  537.                          a | b
  538.                          e | d
  539. </programlisting>
  540.        </para>
  541.       </listitem>
  542.      </itemizedlist>
  543.     </para>
  544.     <para>
  545.      For a more detailed description and definition of the relational
  546.      algebra refer to [<xref linkend="ULL88" endterm="ULL88">] or
  547.      [<xref linkend="DATE94" endterm="DATE94">].
  548.     </para>
  549.     <example>
  550.      <title id="suppl-rel-alg">A Query Using Relational Algebra</title>
  551.      <para>
  552.       Recall that we formulated all those relational operators to be able to
  553.       retrieve data from the database. Let's return to our example from 
  554.       the previous
  555.       section (<xref linkend="operations" endterm="operations">)
  556.       where someone wanted to know the names of all
  557.       suppliers that sell the part <literal>Screw</literal>. 
  558.       This question can be answered
  559.       using relational algebra by the following operation:
  560.       <programlisting>
  561. &pi;<subscript>SUPPLIER.SNAME</subscript>(&sigma;<subscript>PART.PNAME='Screw'</subscript>(SUPPLIER &prod; SELLS &prod; PART))
  562.       </programlisting>
  563.      </para>
  564.      <para>
  565.       We call such an operation a query. If we evaluate the above query
  566.       against the our example tables
  567.       (<xref linkend="supplier-fig" endterm="supplier-fig">)
  568.       we will obtain the following result:
  569.       <programlisting>
  570.                              SNAME
  571.                             -------
  572.                              Smith
  573.                              Adams
  574.       </programlisting>
  575.      </para>
  576.     </example>
  577.    </sect2>
  578.    <sect2 id="rel-calc">
  579.     <title>Relational Calculus</title>
  580.     <para>
  581.      The relational calculus is based on the
  582.      <firstterm>first order logic</firstterm>. There are
  583.      two variants of the relational calculus:
  584.      <itemizedlist>
  585.       <listitem>
  586.        <para>
  587. The <firstterm>Domain Relational Calculus</firstterm>
  588. (<acronym>DRC</acronym>), where variables
  589. stand for components (attributes) of the tuples.
  590.        </para>
  591.       </listitem>
  592.       <listitem>
  593.        <para>
  594. The <firstterm>Tuple Relational Calculus</firstterm>
  595. (<acronym>TRC</acronym>), where variables stand for tuples.
  596.        </para>
  597.       </listitem>
  598.      </itemizedlist>
  599.     </para>
  600.     <para>
  601.      We want to discuss the tuple relational calculus only because it is
  602.      the one underlying the most relational languages. For a detailed
  603.      discussion on <acronym>DRC</acronym> (and also
  604.      <acronym>TRC</acronym>) see
  605.      [<xref linkend="DATE94" endterm="DATE94">]
  606.      or
  607.      [<xref linkend="ULL88" endterm="ULL88">].
  608.     </para>
  609.    </sect2>
  610.    <sect2>
  611.     <title>Tuple Relational Calculus</title>
  612.     <para>
  613.      The queries used in <acronym>TRC</acronym> are of the following
  614.      form:
  615.       x(A) &mid; F(x)
  616.      where <literal>x</literal> is a tuple variable
  617.      <classname>A</classname> is a set of attributes and <literal>F</literal> is a
  618.      formula. The resulting relation consists of all tuples
  619.      <literal>t(A)</literal> that satisfy <literal>F(t)</literal>.
  620.     </para>
  621.     <para>
  622.      If we want to answer the question from example
  623.      <xref linkend="suppl-rel-alg" endterm="suppl-rel-alg">
  624.      using <acronym>TRC</acronym> we formulate the following query:
  625. <programlisting>
  626.      {x(SNAME) &mid; x &isin; SUPPLIER &and; nonumber
  627.                        &exist; y &isin; SELLS &exist; z &isin; PART (y(SNO)=x(SNO) &and; nonumber
  628.                         z(PNO)=y(PNO) &and; nonumber
  629.                         z(PNAME)='Screw')} nonumber
  630.      </programlisting>
  631.     </para>
  632.     <para>
  633.      Evaluating the query against the tables from
  634.      <xref linkend="supplier-fig" endterm="supplier-fig">
  635.      again leads to the same result
  636.      as in
  637.      <xref linkend="suppl-rel-alg" endterm="suppl-rel-alg">.
  638.     </para>
  639.    </sect2>
  640.    <sect2 id="alg-vs-calc">
  641.     <title>Relational Algebra vs. Relational Calculus</title>
  642.     <para>
  643.      The relational algebra and the relational calculus have the same
  644.      <firstterm>expressive power</firstterm>; i.e. all queries that
  645.      can be formulated using relational algebra can also be formulated 
  646.      using the relational calculus and vice versa.
  647.      This was first proved by E. F. Codd in
  648.      1972. This proof is based on an algorithm (<quote>Codd's reduction
  649.      algorithm</quote>) by which an arbitrary expression of the relational
  650.      calculus can be reduced to a semantically equivalent expression of
  651.      relational algebra. For a more detailed discussion on that refer to
  652.      [<xref linkend="DATE94" endterm="DATE94">]
  653.      and
  654.      [<xref linkend="ULL88" endterm="ULL88">].
  655.     </para>
  656.     <para>
  657.      It is sometimes said that languages based on the relational calculus
  658.      are "higher level" or "more declarative" than languages based on
  659.      relational algebra because the algebra (partially) specifies the order
  660.      of operations while the calculus leaves it to a compiler or
  661.      interpreter to determine the most efficient order of evaluation.
  662.     </para>
  663.    </sect2>
  664.   </sect1>
  665.   <sect1 id="sql-language">
  666.    <title>The <acronym>SQL</acronym> Language</title>
  667.    <para>
  668.     As is the case with most modern relational languages,
  669.     <acronym>SQL</acronym> is based on the tuple
  670.     relational calculus. As a result every query that can be formulated
  671.     using the tuple relational calculus (or equivalently, relational
  672.     algebra) can also be formulated using <acronym>SQL</acronym>. There are, however,
  673.     capabilities beyond the scope of relational algebra or calculus. Here
  674.     is a list of some additional features provided by <acronym>SQL</acronym> that are not
  675.     part of relational algebra or calculus:
  676.     <itemizedlist>
  677.      <listitem>
  678.       <para>
  679.        Commands for insertion, deletion or modification of data.
  680.       </para>
  681.      </listitem>
  682.      <listitem>
  683.       <para>
  684.        Arithmetic capability: In <acronym>SQL</acronym> it is possible to involve
  685.        arithmetic operations as well as comparisons, e.g.
  686.        A &lt; B + 3.
  687.        Note
  688.        that + or other arithmetic operators appear neither in relational
  689.        algebra nor in relational calculus.
  690.       </para>
  691.      </listitem>
  692.      <listitem>
  693.       <para>
  694.        Assignment and Print Commands: It is possible to print a
  695.        relation constructed by a query and to assign a computed relation to a
  696.        relation name.
  697.       </para>
  698.      </listitem>
  699.      <listitem>
  700.       <para>
  701.        Aggregate Functions: Operations such as
  702.        <firstterm>average</firstterm>, <firstterm>sum</firstterm>,
  703.        <firstterm>max</firstterm>, etc. can be applied to columns of a relation to
  704.        obtain a single quantity.
  705.       </para>
  706.      </listitem>
  707.     </itemizedlist>
  708.    </para>
  709.    <sect2 id="select">
  710.     <title id="select-title">Select</title>
  711.     <para>
  712.      The most often used command in <acronym>SQL</acronym> is the
  713.      SELECT statement,
  714.      used to retrieve data. The syntax is:
  715.      <synopsis>
  716.    SELECT [ALL|DISTINCT] 
  717.           { * | <replaceable class="parameter">expr_1</replaceable> [AS <replaceable class="parameter">c_alias_1</replaceable>] [, ... 
  718.                 [, <replaceable class="parameter">expr_k</replaceable> [AS <replaceable class="parameter">c_alias_k</replaceable>]]]}
  719.    FROM <replaceable class="parameter">table_name_1</replaceable> [<replaceable class="parameter">t_alias_1</replaceable>] 
  720.         [, ... [, <replaceable class="parameter">table_name_n</replaceable> [<replaceable class="parameter">t_alias_n</replaceable>]]]
  721.    [WHERE <replaceable class="parameter">condition</replaceable>]
  722.    [GROUP BY <replaceable class="parameter">name_of_attr_i</replaceable> 
  723.              [,... [, <replaceable class="parameter">name_of_attr_j</replaceable>]] [HAVING <replaceable class="parameter">condition</replaceable>]]
  724.    [{UNION [ALL] | INTERSECT | EXCEPT} SELECT ...]
  725.    [ORDER BY <replaceable class="parameter">name_of_attr_i</replaceable> [ASC|DESC] 
  726.              [, ... [, <replaceable class="parameter">name_of_attr_j</replaceable> [ASC|DESC]]]];
  727.      </synopsis>
  728.     </para>
  729.     <para>
  730.      Now we will illustrate the complex syntax of the SELECT statement
  731.      with various examples. The tables used for the examples are defined in
  732.      <xref linkend="supplier-fig" endterm="supplier-fig">.
  733.     </para>
  734.     <sect3>
  735.      <title>Simple Selects</title>
  736.      <para>
  737.       Here are some simple examples using a SELECT statement:
  738.       <example>
  739.        <title id="simple-query">Simple Query with Qualification</title>
  740.        <para>
  741. To retrieve all tuples from table PART where the attribute PRICE is
  742. greater than 10 we formulate the following query:
  743. <programlisting>
  744.    SELECT * FROM PART
  745.      WHERE PRICE > 10;
  746. </programlisting>
  747. and get the table:
  748. <programlisting>
  749.                    PNO |  PNAME  |  PRICE
  750.                   -----+---------+--------
  751.                     3  |  Bolt   |   15
  752.                     4  |  Cam    |   25
  753. </programlisting>
  754.        </para>
  755.        <para>
  756. Using "*" in the SELECT statement will deliver all attributes from
  757. the table. If we want to retrieve only the attributes PNAME and PRICE
  758. from table PART we use the statement:
  759. <programlisting>
  760.    SELECT PNAME, PRICE 
  761.    FROM PART
  762.    WHERE PRICE > 10;
  763. </programlisting>
  764. In this case the result is:
  765. <programlisting>
  766.                       PNAME  |  PRICE
  767.                      --------+--------
  768.                       Bolt   |   15
  769.                       Cam    |   25
  770. </programlisting>
  771. Note that the <acronym>SQL</acronym> SELECT corresponds to the 
  772. "projection" in relational algebra not to the "selection"
  773. (see <xref linkend="rel-alg" endterm="rel-alg"> for more details).
  774.        </para>
  775.        <para>
  776. The qualifications in the WHERE clause can also be logically connected
  777. using the keywords OR, AND, and NOT:
  778. <programlisting>
  779.    SELECT PNAME, PRICE 
  780.    FROM PART
  781.    WHERE PNAME = 'Bolt' AND
  782.          (PRICE = 0 OR PRICE < 15);
  783. </programlisting>
  784. will lead to the result:
  785. <programlisting>
  786.                       PNAME  |  PRICE
  787.                      --------+--------
  788.                       Bolt   |   15
  789. </programlisting>
  790.        </para>
  791.        <para>
  792. Arithmetic operations may be used in the target list and in the WHERE
  793. clause. For example if we want to know how much it would cost if we
  794. take two pieces of a part we could use the following query:
  795. <programlisting>
  796.    SELECT PNAME, PRICE * 2 AS DOUBLE
  797.    FROM PART
  798.    WHERE PRICE * 2 < 50;
  799. </programlisting>
  800. and we get:
  801. <programlisting>
  802.                       PNAME  |  DOUBLE
  803.                      --------+---------
  804.                       Screw  |    20
  805.                       Nut    |    16
  806.                       Bolt   |    30
  807. </programlisting>
  808. Note that the word DOUBLE after the keyword AS is the new title of the
  809. second column. This technique can be used for every element of the
  810. target list to assign a new title to the resulting column. This new title
  811. is often referred to as alias. The alias cannot be used throughout the
  812. rest of the query.
  813.        </para>
  814.       </example>
  815.      </para>
  816.     </sect3>
  817.     <sect3>
  818.      <title>Joins</title>
  819.      <para id="simple-join">
  820.       The following example shows how <firstterm>joins</firstterm> are
  821.       realized in <acronym>SQL</acronym>.
  822.      </para>
  823.      <para>
  824.       To join the three tables SUPPLIER, PART and SELLS over their common
  825.       attributes we formulate the following statement:
  826.       <programlisting>
  827.    SELECT S.SNAME, P.PNAME
  828.    FROM SUPPLIER S, PART P, SELLS SE
  829.    WHERE S.SNO = SE.SNO AND
  830.          P.PNO = SE.PNO;
  831.       </programlisting>
  832.       and get the following table as a result:
  833.       <programlisting>
  834.                        SNAME | PNAME
  835.                       -------+-------
  836.                        Smith | Screw
  837.                        Smith | Nut
  838.                        Jones | Cam
  839.                        Adams | Screw
  840.                        Adams | Bolt
  841.                        Blake | Nut
  842.                        Blake | Bolt
  843.                        Blake | Cam
  844.       </programlisting>
  845.      </para>
  846.      <para>
  847.       In the FROM clause we introduced an alias name for every relation
  848.       because there are common named attributes (SNO and PNO) among the
  849.       relations. Now we can distinguish between the common named attributes
  850.       by simply prefixing the attribute name with the alias name followed by
  851.       a dot. The join is calculated in the same way as shown in 
  852.       <xref linkend="join-example" endterm="join-example">.
  853.       First the Cartesian product
  854.       SUPPLIER &times; PART &times; SELLS
  855.       is derived. Now only those tuples satisfying the
  856.       conditions given in the WHERE clause are selected (i.e. the common
  857.       named attributes have to be equal). Finally we project out all
  858.       columns but S.SNAME and P.PNAME. 
  859.      </para>
  860.     </sect3>
  861.     <sect3>
  862.      <title>Aggregate Operators</title>
  863.      <para>
  864.       <acronym>SQL</acronym> provides aggregate operators
  865.       (e.g. AVG, COUNT, SUM, MIN, MAX) that
  866.       take the name of an attribute as an argument. The value of the
  867.       aggregate operator is calculated over all values of the specified
  868.       attribute (column) of the whole table. If groups are specified in the
  869.       query the calculation is done only over the values of a group (see next
  870.       section).
  871.       <example>
  872.        <title id="aggregates-example">Aggregates</title>
  873.        <para>
  874. If we want to know the average cost of all parts in table PART we use
  875. the following query:
  876. <programlisting>
  877.    SELECT AVG(PRICE) AS AVG_PRICE
  878.    FROM PART;
  879. </programlisting>
  880.        </para>
  881.        <para>
  882. The result is:
  883. <programlisting>
  884.                          AVG_PRICE
  885.                         -----------
  886.                            14.5
  887. </programlisting>
  888.        </para>
  889.        <para>
  890. If we want to know how many parts are stored in table PART we use
  891. the statement:
  892. <programlisting>
  893.    SELECT COUNT(PNO)
  894.    FROM PART;
  895. </programlisting>
  896. and get:
  897. <programlisting>
  898.                            COUNT
  899.                           -------
  900.                              4
  901. </programlisting>
  902.        </para>
  903.       </example>
  904.      </para>
  905.     </sect3>
  906.     <sect3>
  907.      <title>Aggregation by Groups</title>
  908.      <para>
  909.       <acronym>SQL</acronym> allows one to partition the tuples of a table
  910.       into groups. Then the
  911.       aggregate operators described above can be applied to the groups
  912.       (i.e. the value of the aggregate operator is no longer calculated over
  913.       all the values of the specified column but over all values of a
  914.       group. Thus the aggregate operator is evaluated individually for every
  915.       group.) 
  916.      </para>
  917.      <para>
  918.       The partitioning of the tuples into groups is done by using the
  919.       keywords <command>GROUP BY</command> followed by a list of
  920.       attributes that define the
  921.       groups. If we have 
  922.       <command>GROUP BY A<subscript>1</subscript>, &tdot;, A<subscript>k</subscript></command>
  923.       we partition
  924.       the relation into groups, such that two tuples are in the same group
  925.       if and only if they agree on all the attributes 
  926.       A<subscript>1</subscript>, &tdot;, A<subscript>k</subscript>.
  927.       <example>
  928.        <title id="aggregates-groupby">Aggregates</title>
  929.        <para>
  930. If we want to know how many parts are sold by every supplier we
  931. formulate the query:
  932. <programlisting>
  933.    SELECT S.SNO, S.SNAME, COUNT(SE.PNO)
  934.    FROM SUPPLIER S, SELLS SE
  935.    WHERE S.SNO = SE.SNO
  936.    GROUP BY S.SNO, S.SNAME;
  937. </programlisting>
  938. and get:
  939. <programlisting>
  940.                      SNO | SNAME | COUNT
  941.                     -----+-------+-------
  942.                       1  | Smith |   2
  943.                       2  | Jones |   1
  944.                       3  | Adams |   2
  945.                       4  | Blake |   3
  946. </programlisting>
  947.        </para>
  948.        <para>
  949. Now let's have a look of what is happening here.
  950. First the join of the
  951. tables SUPPLIER and SELLS is derived:
  952. <programlisting>
  953.                   S.SNO | S.SNAME | SE.PNO
  954.                  -------+---------+--------
  955.                     1   |  Smith  |   1
  956.                     1   |  Smith  |   2
  957.                     2   |  Jones  |   4
  958.                     3   |  Adams  |   1
  959.                     3   |  Adams  |   3
  960.                     4   |  Blake  |   2
  961.                     4   |  Blake  |   3
  962.                     4   |  Blake  |   4
  963. </programlisting>
  964.        </para>
  965.        <para>
  966. Next we partition the tuples into groups by putting all tuples
  967. together that agree on both attributes S.SNO and S.SNAME:
  968. <programlisting>
  969.                   S.SNO | S.SNAME | SE.PNO
  970.                  -------+---------+--------
  971.                     1   |  Smith  |   1
  972.                                   |   2
  973.                  --------------------------
  974.                     2   |  Jones  |   4
  975.                  --------------------------
  976.                     3   |  Adams  |   1
  977.                                   |   3
  978.                  --------------------------
  979.                     4   |  Blake  |   2
  980.                                   |   3
  981.                                   |   4
  982. </programlisting>
  983.        </para>
  984.        <para>
  985. In our example we got four groups and now we can apply the aggregate
  986. operator COUNT to every group leading to the total result of the query
  987. given above.
  988.        </para>
  989.       </example>
  990.      </para>
  991.      <para>
  992.       Note that for the result of a query using GROUP BY and aggregate
  993.       operators to make sense the attributes grouped by must also appear in
  994.       the target list. All further attributes not appearing in the GROUP
  995.       BY clause can only be selected by using an aggregate function. On
  996.       the other hand you can not use aggregate functions on attributes
  997.       appearing in the GROUP BY clause.
  998.      </para>
  999.     </sect3>
  1000.     <sect3>
  1001.      <title>Having</title>
  1002.      <para>
  1003.       The HAVING clause works much like the WHERE clause and is used to
  1004.       consider only those groups satisfying the qualification given in the
  1005.       HAVING clause. The expressions allowed in the HAVING clause must
  1006.       involve aggregate functions. Every expression using only  plain
  1007.       attributes belongs to the WHERE clause. On the other hand every
  1008.       expression involving an aggregate function must be put to the HAVING
  1009.       clause. 
  1010.       <example>
  1011.        <title id="having-example">Having</title>
  1012.        <para>
  1013. If we want only those suppliers selling more than one part we use the
  1014. query:
  1015. <programlisting>
  1016.    SELECT S.SNO, S.SNAME, COUNT(SE.PNO)
  1017.    FROM SUPPLIER S, SELLS SE
  1018.    WHERE S.SNO = SE.SNO
  1019.    GROUP BY S.SNO, S.SNAME
  1020.    HAVING COUNT(SE.PNO) > 1;
  1021. </programlisting>
  1022. and get:
  1023. <programlisting>
  1024.                      SNO | SNAME | COUNT
  1025.                     -----+-------+-------
  1026.                       1  | Smith |   2
  1027.                       3  | Adams |   2
  1028.                       4  | Blake |   3
  1029. </programlisting>
  1030.        </para>
  1031.       </example>
  1032.      </para>
  1033.     </sect3>
  1034.     <sect3>
  1035.      <title>Subqueries</title>
  1036.      <para>
  1037.       In the WHERE and HAVING clauses the use of subqueries (subselects) is
  1038.       allowed in every place where a value is expected. In this case the
  1039.       value must be derived by evaluating the subquery first. The usage of
  1040.       subqueries extends the expressive power of
  1041.       <acronym>SQL</acronym>.
  1042.       <example>
  1043.        <title id="subselect-example">Subselect</title>
  1044.        <para>
  1045. If we want to know all parts having a greater price than the part
  1046. named 'Screw' we use the query:
  1047. <programlisting>
  1048.    SELECT * 
  1049.    FROM PART 
  1050.    WHERE PRICE > (SELECT PRICE FROM PART
  1051.                   WHERE PNAME='Screw');
  1052. </programlisting>
  1053.        </para>
  1054.        <para>
  1055. The result is:
  1056. <programlisting>
  1057.                    PNO |  PNAME  |  PRICE
  1058.                   -----+---------+--------
  1059.                     3  |  Bolt   |   15
  1060.                     4  |  Cam    |   25
  1061. </programlisting>
  1062.        </para>
  1063.        <para>
  1064. When we look at the above query we can see
  1065. the keyword SELECT two times. The first one at the beginning of the
  1066. query - we will refer to it as outer SELECT - and the one in the WHERE
  1067. clause which begins a nested query - we will refer to it as inner
  1068. SELECT. For every tuple of the outer SELECT the inner SELECT has to be
  1069. evaluated. After every evaluation we know the price of the tuple named
  1070. 'Screw' and we can check if the price of the actual tuple is
  1071. greater. 
  1072.        </para>
  1073. <para>
  1074. If we want to know all suppliers that do not sell any part 
  1075. (e.g. to be able to remove these suppliers from the database) we use:
  1076. <programlisting>
  1077.    SELECT * 
  1078.    FROM SUPPLIER S
  1079.    WHERE NOT EXISTS
  1080.              (SELECT * FROM SELLS SE
  1081.               WHERE SE.SNO = S.SNO);
  1082. </programlisting>
  1083.        </para>
  1084.        <para>
  1085. In our example the result will be empty because every supplier sells
  1086. at least one part. Note that we use S.SNO from the outer SELECT within
  1087. the WHERE clause of the inner SELECT. As described above the subquery
  1088. is evaluated for every tuple from the outer query i.e. the value for
  1089. S.SNO is always taken from the actual tuple of the outer SELECT. 
  1090.        </para>
  1091.       </example>
  1092.      </para>
  1093.     </sect3>
  1094.     <sect3>
  1095.      <title>Union, Intersect, Except</title>
  1096.      <para>
  1097.       These operations calculate the union, intersect and set theoretic
  1098.       difference of the tuples derived by two subqueries.
  1099.       <example>
  1100.        <title id="union-example">Union, Intersect, Except</title>
  1101.        <para>
  1102. The following query is an example for UNION:
  1103. <programlisting>
  1104.    SELECT S.SNO, S.SNAME, S.CITY
  1105.    FROM SUPPLIER S
  1106.    WHERE S.SNAME = 'Jones'
  1107.    UNION
  1108.    SELECT S.SNO, S.SNAME, S.CITY
  1109.    FROM SUPPLIER S
  1110.    WHERE S.SNAME = 'Adams';    
  1111. </programlisting>
  1112. gives the result:
  1113. <programlisting>
  1114.                      SNO | SNAME |  CITY
  1115.                     -----+-------+--------
  1116.                       2  | Jones | Paris
  1117.                       3  | Adams | Vienna
  1118. </programlisting>
  1119.        </para>
  1120.        <para>
  1121. Here an example for INTERSECT:
  1122. <programlisting>
  1123.    SELECT S.SNO, S.SNAME, S.CITY
  1124.    FROM SUPPLIER S
  1125.    WHERE S.SNO > 1
  1126.    INTERSECT
  1127.    SELECT S.SNO, S.SNAME, S.CITY
  1128.    FROM SUPPLIER S
  1129.    WHERE S.SNO > 2;
  1130. </programlisting>
  1131. gives the result:
  1132. <programlisting>
  1133.                      SNO | SNAME |  CITY
  1134.                     -----+-------+--------
  1135.                       2  | Jones | Paris
  1136. The only tuple returned by both parts of the query is the one having $SNO=2$.
  1137. </programlisting>
  1138.        </para>
  1139.        <para>
  1140. Finally an example for EXCEPT:
  1141. <programlisting>
  1142.    SELECT S.SNO, S.SNAME, S.CITY
  1143.    FROM SUPPLIER S
  1144.    WHERE S.SNO > 1
  1145.    EXCEPT
  1146.    SELECT S.SNO, S.SNAME, S.CITY
  1147.    FROM SUPPLIER S
  1148.    WHERE S.SNO > 3;
  1149. </programlisting>
  1150. gives the result:
  1151. <programlisting>
  1152.                      SNO | SNAME |  CITY
  1153.                     -----+-------+--------
  1154.                       2  | Jones | Paris
  1155.                       3  | Adams | Vienna
  1156. </programlisting>
  1157.        </para>
  1158.       </example>
  1159.      </para>
  1160.     </sect3>
  1161.    </sect2>
  1162.    <sect2 id="datadef">
  1163.     <title>Data Definition</title>
  1164.     <para>
  1165.      There is a set of commands used for data definition included in the
  1166.      <acronym>SQL</acronym> language. 
  1167.     </para>
  1168.     <sect3 id="create">
  1169.      <title id="create-title">Create Table</title>
  1170.      <para>
  1171.       The most fundamental command for data definition is the
  1172.       one that creates a new relation (a new table). The syntax of the
  1173.       CREATE TABLE command is:
  1174. <synopsis>
  1175.    CREATE TABLE <replaceable class="parameter">table_name</replaceable>
  1176.                 (<replaceable class="parameter">name_of_attr_1</replaceable> <replaceable class="parameter">type_of_attr_1</replaceable>
  1177.                  [, <replaceable class="parameter">name_of_attr_2</replaceable> <replaceable class="parameter">type_of_attr_2</replaceable> 
  1178.                  [, ...]]);
  1179.       </synopsis>
  1180.       <example>
  1181.        <title id="table-create">Table Creation</title>
  1182.        <para>
  1183. To create the tables defined in
  1184. <xref linkend="supplier-fig" endterm="supplier-fig"> the
  1185. following <acronym>SQL</acronym> statements are used:
  1186. <programlisting>
  1187.    CREATE TABLE SUPPLIER
  1188.                 (SNO   INTEGER,
  1189.                  SNAME VARCHAR(20),
  1190.                  CITY  VARCHAR(20));
  1191. </programlisting>
  1192. <programlisting>
  1193.    CREATE TABLE PART
  1194.                 (PNO   INTEGER,
  1195.                  PNAME VARCHAR(20),
  1196.                  PRICE DECIMAL(4 , 2));
  1197. </programlisting>
  1198. <programlisting>
  1199.    CREATE TABLE SELLS
  1200.                 (SNO INTEGER,
  1201.                  PNO INTEGER);
  1202. </programlisting>
  1203.        </para>
  1204.       </example>
  1205.      </para>
  1206.     </sect3>
  1207.     <sect3>
  1208.      <title>Data Types in <acronym>SQL</acronym></title>
  1209.      <para>
  1210.       The following is a list of some data types that are supported by 
  1211.       <acronym>SQL</acronym>:
  1212.       <itemizedlist>
  1213.        <listitem>
  1214. <para>
  1215.  INTEGER: signed fullword binary integer (31 bits precision).
  1216. </para>
  1217.        </listitem>
  1218.        <listitem>
  1219. <para>
  1220.  SMALLINT: signed halfword binary integer (15 bits precision).
  1221. </para>
  1222.        </listitem>
  1223.        <listitem>
  1224. <para>
  1225.  DECIMAL (<replaceable class="parameter">p</replaceable>[,<replaceable class="parameter">q</replaceable>]):
  1226.  signed packed decimal number of
  1227.  <replaceable class="parameter">p</replaceable>
  1228.  digits precision with assumed
  1229.  <replaceable class="parameter">q</replaceable>
  1230.  of them right to the decimal point.
  1231. (15 &ge; <replaceable class="parameter">p</replaceable> &ge; <replaceable class="parameter">q</replaceable>q &ge; 0).
  1232.  If <replaceable class="parameter">q</replaceable>
  1233.  is omitted it is assumed to be 0.
  1234. </para>
  1235.        </listitem>
  1236.        <listitem>
  1237. <para>
  1238.  FLOAT: signed doubleword floating point number.
  1239. </para>
  1240.        </listitem>
  1241.        <listitem>
  1242. <para>
  1243.  CHAR(<replaceable class="parameter">n</replaceable>):
  1244.  fixed length character string of length
  1245.  <replaceable class="parameter">n</replaceable>.
  1246. </para>
  1247.        </listitem>
  1248.        <listitem>
  1249. <para>
  1250.  VARCHAR(<replaceable class="parameter">n</replaceable>):
  1251.  varying length character string of maximum length
  1252.  <replaceable class="parameter">n</replaceable>.
  1253. </para>
  1254.        </listitem>
  1255.       </itemizedlist>
  1256.      </para>
  1257.     </sect3>
  1258.     <sect3>
  1259.      <title>Create Index</title>
  1260.      <para>
  1261.       Indices are used to speed up access to a relation. If a relation <classname>R</classname>
  1262.       has an index on attribute <classname>A</classname> then we can
  1263.       retrieve all tuples <replaceable>t</replaceable>
  1264.       having
  1265.       <replaceable>t</replaceable>(<classname>A</classname>) = <replaceable>a</replaceable>
  1266.       in time roughly proportional to the number of such
  1267.       tuples <replaceable>t</replaceable>
  1268.       rather than in time proportional to the size of <classname>R</classname>.
  1269.      </para>
  1270.      <para>
  1271.       To create an index in <acronym>SQL</acronym>
  1272.       the CREATE INDEX command is used. The syntax is:
  1273.       <programlisting>
  1274.    CREATE INDEX <replaceable class="parameter">index_name</replaceable> 
  1275.    ON <replaceable class="parameter">table_name</replaceable> ( <replaceable class="parameter">name_of_attribute</replaceable> );
  1276.       </programlisting>
  1277.      </para>
  1278.      <para>
  1279.       <example>
  1280.        <title id="index-create">Create Index</title>
  1281.        <para>
  1282. To create an index named I on attribute SNAME of relation SUPPLIER
  1283. we use the following statement:
  1284.       <programlisting>
  1285.    CREATE INDEX I
  1286.    ON SUPPLIER (SNAME);
  1287.       </programlisting>
  1288.      </para>
  1289.        <para>
  1290. The created index is maintained automatically, i.e. whenever a new tuple
  1291. is inserted into the relation SUPPLIER the index I is adapted. Note
  1292. that the only changes a user can percept when an index is present
  1293. are an increased speed.
  1294.        </para>
  1295.       </example>
  1296.      </para>
  1297.     </sect3>
  1298.     <sect3>
  1299.      <title>Create View</title>
  1300.      <para>
  1301.       A view may be regarded as a <firstterm>virtual table</firstterm>,
  1302.       i.e. a table that
  1303.       does not <emphasis>physically</emphasis> exist in the database but looks to the user
  1304.       as if it does. By contrast, when we talk of a <firstterm>base table</firstterm> there is
  1305.       really a physically stored counterpart of each row of the table
  1306.       somewhere in the physical storage.
  1307.      </para>
  1308.      <para>
  1309.       Views do not have their own, physically separate, distinguishable
  1310.       stored data. Instead, the system stores the definition of the
  1311.       view (i.e. the rules about how to access physically stored base
  1312.       tables in order to materialize the view) somewhere in the system
  1313.       catalogs (see
  1314.       <xref linkend="catalogs-title" endterm="catalogs-title">). For a
  1315.       discussion on different techniques to implement views refer to
  1316. <!--
  1317.       section
  1318.       <xref linkend="view-impl" endterm="view-impl">.
  1319. -->
  1320.       <citetitle>SIM98</citetitle>.
  1321.      </para>
  1322.      <para>
  1323.       In <acronym>SQL</acronym> the <command>CREATE VIEW</command>
  1324.       command is used to define a view. The syntax
  1325.       is:
  1326.       <programlisting>
  1327.    CREATE VIEW <replaceable class="parameter">view_name</replaceable>
  1328.    AS <replaceable class="parameter">select_stmt</replaceable>
  1329.       </programlisting>
  1330.       where <replaceable class="parameter">select_stmt</replaceable> 
  1331.       is a valid select statement as defined
  1332.       in <xref linkend="select-title" endterm="select-title">.
  1333.       Note that <replaceable class="parameter">select_stmt</replaceable> is
  1334.       not executed when the view is created. It is just stored in the 
  1335.       <firstterm>system catalogs</firstterm>
  1336.       and is executed whenever a query against the view is made.
  1337.      </para>
  1338.      <para>
  1339.       Let the following view definition be given (we use
  1340.       the tables from <xref linkend="supplier-fig" endterm="supplier-fig"> again):
  1341.       <programlisting>
  1342.    CREATE VIEW London_Suppliers
  1343.       AS SELECT S.SNAME, P.PNAME
  1344.          FROM SUPPLIER S, PART P, SELLS SE
  1345.          WHERE S.SNO = SE.SNO AND
  1346.                P.PNO = SE.PNO AND
  1347.                S.CITY = 'London';
  1348.       </programlisting>
  1349.      </para>
  1350.      <para>
  1351.       Now we can use this <firstterm>virtual relation</firstterm>
  1352.       <classname>London_Suppliers</classname> as
  1353.       if it were another base table:
  1354.       <programlisting>
  1355.    SELECT *
  1356.    FROM London_Suppliers
  1357.    WHERE P.PNAME = 'Screw';
  1358.       </programlisting>
  1359.       which will return the following table:
  1360.       <programlisting>
  1361.                        SNAME | PNAME
  1362.                       -------+-------
  1363.                        Smith | Screw                 
  1364.       </programlisting>
  1365.      </para>
  1366.      <para>
  1367.       To calculate this result the database system has to do a
  1368.       <emphasis>hidden</emphasis>
  1369.       access to the base tables SUPPLIER, SELLS and PART first. It
  1370.       does so by executing the query given in the view definition against
  1371.       those base tables. After that the additional qualifications (given in the
  1372.       query against the view) can be applied to obtain the resulting
  1373.       table.
  1374.      </para>
  1375.     </sect3>
  1376.     <sect3>
  1377.      <title>Drop Table, Drop Index, Drop View</title>
  1378.      <para>
  1379.       To destroy a table (including all tuples stored in that table) the
  1380.       DROP TABLE command is used:
  1381.       <programlisting>
  1382.    DROP TABLE <replaceable class="parameter">table_name</replaceable>;
  1383.        </programlisting>
  1384.       </para>
  1385.      <para>
  1386.       To destroy the SUPPLIER table use the following statement:
  1387.       <programlisting>
  1388.    DROP TABLE SUPPLIER;
  1389.       </programlisting>
  1390.      </para>
  1391.      <para>
  1392.       The DROP INDEX command is used to destroy an index:
  1393.       <programlisting>
  1394.    DROP INDEX <replaceable class="parameter">index_name</replaceable>;
  1395.       </programlisting>
  1396.      </para>
  1397.      <para>
  1398.       Finally to destroy a given view use the command DROP VIEW:
  1399.       <programlisting>
  1400.    DROP VIEW <replaceable class="parameter">view_name</replaceable>;
  1401.       </programlisting>
  1402.      </para>
  1403.     </sect3>
  1404.    </sect2>
  1405.    <sect2>
  1406.     <title>Data Manipulation</title>
  1407.     <sect3>
  1408.      <title>Insert Into</title>
  1409.      <para>
  1410.       Once a table is created (see
  1411.       <xref linkend="create-title" endterm="create-title">), it can be filled
  1412.       with tuples using the command <command>INSERT INTO</command>.
  1413.       The syntax is:
  1414.       <programlisting>
  1415.    INSERT INTO <replaceable class="parameter">table_name</replaceable> (<replaceable class="parameter">name_of_attr_1</replaceable> 
  1416.                              [, <replaceable class="parameter">name_of_attr_2</replaceable> [,...]])
  1417.    VALUES (<replaceable class="parameter">val_attr_1</replaceable> 
  1418.            [, <replaceable class="parameter">val_attr_2</replaceable> [, ...]]);
  1419.       </programlisting>
  1420.      </para>
  1421.      <para>
  1422.       To insert the first tuple into the relation SUPPLIER (from
  1423.       <xref linkend="supplier-fig" endterm="supplier-fig">) we use the
  1424.       following statement:
  1425.       <programlisting>
  1426.    INSERT INTO SUPPLIER (SNO, SNAME, CITY)
  1427.    VALUES (1, 'Smith', 'London');
  1428.       </programlisting>
  1429.      </para>
  1430.      <para>
  1431.       To insert the first tuple into the relation SELLS we use:
  1432.       <programlisting>
  1433.    INSERT INTO SELLS (SNO, PNO)
  1434.    VALUES (1, 1);
  1435.       </programlisting>
  1436.      </para>
  1437.     </sect3>
  1438.     <sect3>
  1439.      <title>Update</title>
  1440.      <para>
  1441.       To change one or more attribute values of tuples in a relation the
  1442.       UPDATE command is used. The syntax is:
  1443.       <programlisting>
  1444.    UPDATE <replaceable class="parameter">table_name</replaceable>
  1445.    SET <replaceable class="parameter">name_of_attr_1</replaceable> = <replaceable class="parameter">value_1</replaceable> 
  1446.        [, ... [, <replaceable class="parameter">name_of_attr_k</replaceable> = <replaceable class="parameter">value_k</replaceable>]]
  1447.    WHERE <replaceable class="parameter">condition</replaceable>;
  1448.       </programlisting>
  1449.      </para>
  1450.      <para>
  1451.       To change the value of attribute PRICE of the part 'Screw' in the
  1452.       relation PART we use:
  1453.       <programlisting>
  1454.    UPDATE PART
  1455.    SET PRICE = 15
  1456.    WHERE PNAME = 'Screw';
  1457.       </programlisting>
  1458.      </para>
  1459.      <para>
  1460.       The new value of attribute PRICE of the tuple whose name is 'Screw' is
  1461.       now 15.
  1462.      </para>
  1463.     </sect3>
  1464.     <sect3>
  1465.      <title>Delete</title>
  1466.      <para>
  1467.       To delete a tuple from a particular table use the command DELETE
  1468.       FROM. The syntax is:
  1469.       <programlisting>
  1470.    DELETE FROM <replaceable class="parameter">table_name</replaceable>
  1471.    WHERE <replaceable class="parameter">condition</replaceable>;
  1472.       </programlisting>
  1473.      </para>
  1474.      <para>
  1475.       To delete the supplier called 'Smith' of the table SUPPLIER the
  1476.       following statement is used:
  1477.       <programlisting>
  1478.    DELETE FROM SUPPLIER
  1479.    WHERE SNAME = 'Smith';
  1480.       </programlisting>
  1481.      </para>
  1482.     </sect3>
  1483.    </sect2>
  1484.    <sect2 id="catalogs">
  1485.     <title id="catalogs-title">System Catalogs</title>
  1486.     <para>
  1487.      In every <acronym>SQL</acronym> database system
  1488.      <firstterm>system catalogs</firstterm> are used to keep
  1489.      track of which tables, views indexes etc. are defined in the
  1490.      database. These system catalogs can be queried as if they were normal
  1491.      relations. For example there is one catalog used for the definition of
  1492.      views. This catalog stores the query from the view definition. Whenever
  1493.      a query against a view is made, the system first gets the
  1494.      <firstterm>view definition query</firstterm> out of the catalog
  1495.      and materializes the view
  1496.      before proceeding with the user query (see
  1497. <!--
  1498.       section
  1499.       <xref linkend="view-impl" endterm="view-impl">.
  1500. -->
  1501.      <citetitle>SIM98</citetitle>
  1502.      for a more detailed
  1503.      description). For more information about system catalogs refer to
  1504.      <citetitle>DATE</citetitle>.
  1505.     </para>
  1506.    </sect2>
  1507.    <sect2>
  1508.     <title>Embedded <acronym>SQL</acronym></title>
  1509.     <para>
  1510.      In this section we will sketch how <acronym>SQL</acronym> can be
  1511.      embedded into a host language (e.g. <literal>C</literal>).
  1512.      There are two main reasons why we want to use <acronym>SQL</acronym>
  1513.      from a host language:
  1514.      <itemizedlist>
  1515.       <listitem>
  1516.        <para>
  1517. There are queries that cannot be formulated using pure <acronym>SQL</acronym>
  1518. (i.e. recursive queries). To be able to perform such queries we need a
  1519. host language with a greater expressive power than
  1520. <acronym>SQL</acronym>.
  1521.        </para>
  1522.       </listitem>
  1523.       <listitem>
  1524.        <para>
  1525. We simply want to access a database from some application that
  1526. is written in the host language (e.g. a ticket reservation system
  1527. with a graphical user interface is written in C and the information
  1528. about which tickets are still left is stored in a database that can be
  1529. accessed using embedded <acronym>SQL</acronym>).
  1530.        </para>
  1531.       </listitem>
  1532.      </itemizedlist>
  1533.     </para>
  1534.     <para>
  1535.      A program using embedded <acronym>SQL</acronym>
  1536.      in a host language consists of statements
  1537.      of the host language and of
  1538.      <firstterm>embedded <acronym>SQL</acronym></firstterm>
  1539.      (<acronym>ESQL</acronym>) statements. Every <acronym>ESQL</acronym>
  1540.      statement begins with the keywords <command>EXEC SQL</command>.
  1541.      The <acronym>ESQL</acronym> statements are
  1542.      transformed to statements of the host language
  1543.      by a <firstterm>precompiler</firstterm>
  1544.      (which usually inserts
  1545.      calls to library routines that perform the various <acronym>SQL</acronym>
  1546.      commands). 
  1547.     </para>
  1548.     <para>
  1549.      When we look at the examples throughout
  1550.      <xref linkend="select-title" endterm="select-title"> we
  1551.      realize that the result of the queries is very often a set of
  1552.      tuples. Most host languages are not designed to operate on sets so we
  1553.      need a mechanism to access every single tuple of the set of tuples
  1554.      returned by a SELECT statement. This mechanism can be provided by
  1555.      declaring a <firstterm>cursor</firstterm>.
  1556.      After that we can use the FETCH command to
  1557.      retrieve a tuple and set the cursor to the next tuple.
  1558.     </para>
  1559.     <para>
  1560.      For a detailed discussion on embedded <acronym>SQL</acronym>
  1561.      refer to
  1562.      [<xref linkend="DATE97" endterm="DATE97">],
  1563.      [<xref linkend="DATE94" endterm="DATE94">],
  1564.      or
  1565.      [<xref linkend="ULL88" endterm="ULL88">].
  1566.     </para>
  1567.    </sect2>
  1568.   </sect1>
  1569.  </chapter>
  1570. <!-- Keep this comment at the end of the file
  1571. Local variables:
  1572. mode: sgml
  1573. sgml-omittag:nil
  1574. sgml-shorttag:t
  1575. sgml-minimize-attributes:nil
  1576. sgml-always-quote-attributes:t
  1577. sgml-indent-step:1
  1578. sgml-indent-data:t
  1579. sgml-parent-document:nil
  1580. sgml-default-dtd-file:"./reference.ced"
  1581. sgml-exposed-tags:nil
  1582. sgml-local-catalogs:"/usr/lib/sgml/catalog"
  1583. sgml-local-ecat-files:nil
  1584. End:
  1585. -->