HP 3000 Manuals

SELECT [ ALLBASE/SQL Reference Manual ] MPE/iX 5.5 Documentation


ALLBASE/SQL Reference Manual

SELECT 

The SELECT statement retrieves data from one or more tables or views.
The retrieved data is presented in the form of a table, called the result
table or query result.  The explanation of SQL Select syntax is broken
down into several levels for easier understanding.  An overview of the
syntax at each of these levels is presented here starting with the Select
Statement Level and continuing through the syntax for the FromSpec.

Detailed discussion of each of these syntax levels is presented in the
same order, on the following pages.

Scope 

ISQL or Application Programs

SQL Syntax--Select Statement Level 

[BULK] QueryExpression [ORDER BY {ColumnID [ASC ]} [,...]]
                       [         {         [DESC]}       ]
SQL Syntax--Subquery Level 

(QueryExpression)

SQL Syntax--Query Expression Level 

{QueryBlock       } [UNION [ALL] {QueryBlock       }] [...]
{(QueryExpression)} [            {(QueryExpression)}]

SQL Syntax--Query Block Level 

SELECT [ALL     ] SelectList [INTO HostVariableSpecification]  FROM
       [DISTINCT]

FromSpec [,...]  [WHERE SearchCondition1]  [GROUP BY GroupColumnList]

[HAVING SearchCondition2]

SelectList 

{*                         }
{[Owner.]Table.*           }
{CorrelationName.*         } [,...]
{Expression                }
{[[Owner.]Table.]ColumnName}
{CorrelationName.ColumnName}
HostVariableSpecification--With BULK Option 

:Buffer [,:StartIndex [,:NumberOfRows]]

HostVariableSpecification--Without BULK Option 

{:HostVariable [[INDICATOR] :Indicator]} [,...]

FromSpec 

{TableSpec                                                       }
{(FromSpec)                                                      }
{                 [INNER        ]                                }
{FromSpec NATURAL [LEFT [OUTER] ] JOIN {TableSpec }              }
{                 [RIGHT [OUTER]]      {(FromSpec)}              }
{                                                                }
{         [INNER        ]                                        }
{FromSpec [LEFT [OUTER] ] JOIN {TableSpec } {ON SearchCondition3}}
{         [RIGHT [OUTER]]      {(FromSpec)} {USING (ColumnList) }}

TableSpec 

[Owner.]TableName [CorrelationName]

A SELECT statement can be examined at the following four levels:

Select Statement        A select statement is a syntactically complete
                        SQL statement containing one or more SELECT
                        statements but having a single query result that
                        can optionally be sorted with an ORDER BY clause.
                        At its simplest, a select statement is a query
                        expression consisting of a single query block.

Subquery                A subquery (also known as a nested query) is a
                        query expression enclosed in parentheses and
                        embedded in a search condition.  A subquery
                        returns a value which is used in evaluating the
                        search condition.

Query Expression        A query expression is a complex expression
                        consisting of one or more query blocks and
                        UNION/UNION ALL operators.

Query Block             A query block is the primary query syntax for
                        specifying which tables to query and which
                        columns to return.

The syntax and usage of each of these levels is described below.  For
additional information, refer to the chapter "SQL Queries."

SQL Syntax--Select Statement Level 

[BULK] QueryExpression [ORDER BY {ColumnID [ASC ]} [,...]]
                       [         {         [DESC]}       ]
Parameters--Select Statement Level 

BULK                    is specified in an application program to
                        retrieve multiple rows with a single execution of
                        the SELECT statement.

                        Do not use this option in select statements
                        associated with a cursor.  Instead, use the BULK
                        option of the FETCH statement.

QueryExpression         is a complex expression specifying what is to be
                        selected.  The query expression is made up of one
                        or more query blocks, as described in the chapter
                        "SQL Queries."

ORDER BY                sorts the result table rows in order by specified
                        columns.  Specify the sort key columns in order
                        from major sort key to minor sort key.  You can
                        specify as many as 1023 columns.  The column
                        specified in the ORDER BY parameter must be one
                        of the columns appearing in the SELECT list.
                        Data is returned in descending order when the
                        ORDER BY columnID DESC clause is specified.

                        For each column you can specify whether the sort
                        order is to be ascending or descending.  If
                        neither ASC nor DESC is specified, ascending
                        order is used.

ColumnID                must correspond to a column in the select list.
                        You can identify a column to be sorted by giving
                        its name or by giving its ordinal number, with
                        the first column in the select list being column
                        number 1.  You must use a column number when
                        referring to columns in the query result that are
                        derived from column expressions.  You must also
                        use a column number to refer to columns if the
                        expression contains more than one query block.

                        The syntax for a column ID in the ORDER BY clause
                        follows:

                        {ColumnNumber                  }
                        {[[Owner.]TableName.]ColumnName}
                        {[CorrelationName.  ]          }

Description--Select Statement Level 

   *   The SELECT statement is considered updatable if the query
       expression it contains is updatable and if no ORDER BY clause is
       present.

   *   The BULK option cannot be used interactively or in a procedure.

   *   ALLBASE/SQL uses file space in the defined TempSpaces, and in the
       system files when processing queries containing ORDER BY clauses
       or UNION operators.  (No such space is used during UNION ALL.)

   *   When using this statement to select LONG columns, the name
       of the file is returned in the appropriate field in the
       HostVariableSpecification specified within the QueryExpression.
       With the BULK option, if the output mode is specified with $, then
       each LONG column in each row accessed has a file with a unique
       name containing the LONG data retrieved.

SQL Syntax--Subquery Level 

(QueryExpression)

Parameters--Subquery Level 

QueryExpression         is the basic syntax of a query or SELECT
                        statement.  The query expression in a subquery
                        may not contain any UNION or UNION ALL
                        operations.

Description--Subquery Level 

   *   Subqueries are used to retrieve data that is then used in
       evaluating a search condition.  For example, get supplier numbers
       for the suppliers who supply the maximum quantity of part 'P1'.

            SELECT SP.SNO
              FROM    SP
             WHERE SP.PNO = 'P1'
               AND SP.QTY = ( SELECT MAX(SP.QTY)
                                FROM SP
                               WHERE SP.PNO = 'P1')

       Without using nested queries, the same answer would require the
       two following queries--one to find the maximum, the other to list
       the supplier number:

            SELECT MAX(SP.QTY)
              FROM SP
             WHERE  SP.PNO = 'P1'

       and

            SELECT SP.SNO
              FROM SP
             WHERE SP.PNO = 'P1'
               AND SP.QTY = MaxQty 

       where MaxQty is the result of the first query.

   *   A subquery may be used only in the following types of predicates:
          *   EXISTS predicate.
          *   Quantified predicate.
          *   IN predicate.
          *   Comparison predicate.

   *   A subquery may be used in the WHERE or HAVING clause of SELECT
       statements and in the WHERE clause of UPDATE, INSERT, and DELETE
       statements.

   *   A subquery may also be nested in the WHERE or HAVING clause of
       another subquery.  No ALLBASE/SQL statement can have more than 16
       query blocks within it.

   *   A subquery may reference a column value in a higher level of the
       query (or outer query).  Such a reference is called an outer 
       reference.  A subquery making an outer reference is called a
       correlated subquery.  Because a correlated subquery depends on a
       value of the outer query, the subquery must be reevaluated for
       each new value of the outer query, as in the following example to
       get supplier numbers for those who supply the most parts for each
       part number.

            SELECT SP1.SNO
              FROM SP SP1
             WHERE SP1.QTY = (SELECT MAX(SP2.QTY)
                                FROM SP SP2
                               WHERE SP1.PNO = SP2.PNO)

       Note that the reference to SP1.PNO in the WHERE clause of the
       subquery is an outer reference.  In this case, because both the
       outer query and the subquery refer to table SP, correlation names
       SP1 and SP2 are assigned to make the distinction between the outer
       and normal references.  Within the subquery, any unqualified
       column names (that is, those which are specified without a table
       name) are assumed to refer only to tables specified in the FROM
       clause of that subquery.

   *   If a query has a HAVING clause with subqueries in it, any outer
       reference made from those subqueries to the query with the HAVING
       clause must refer to a column specified in a GROUP BY clause.

SQL Syntax--Query Expression Level 

{QueryBlock       } [UNION [ALL] {QueryBlock       }] [...]
{(QueryExpression)} [            {(QueryExpression)}]

Parameters--Query Expression Level 

QueryBlock              is the primary query stating which tables to
                        query, which columns to return, and which search
                        conditions to use for filtering data.  The query
                        block is further described in one of the next
                        sections.

UNION                   unites two query expressions into a combined
                        query expression.

                        The union of two sets is the set of all elements
                        that belong to either or both of the original
                        sets.  Because a table is a set of rows, the
                        union of two tables is possible.  The resulting
                        table consists of all rows appearing in either or
                        both of the original tables.

ALL                     indicates that duplicates are not removed from
                        the result table when UNION is specified.  If
                        UNION is specified without ALL, duplicates are 
                        removed.

(QueryExpression)       may be embedded within another query expression
                        if enclosed in parentheses.  Parentheses are
                        optional when a query expression is not embedded.

Description--Query Expression Level 

   *   For the following, assume that T1 is the result of the query block
       or query expression on the left of the UNION operator, and T2 is
       the result of the query block or query expression on the right of
       the UNION operator.  (The same conditions must be met if there are
       additional UNION operators which include results from T3,...Tn.):

          *   T1 and T2 must have the same number of columns.  (They may
              be derived from tables with varying numbers of columns.)

          *   The union is derived by first inserting each row of T1 and
              each row of T2 into a result table and then eliminating any
              redundant rows unless ALL is specified.

          *   The result of the union inherits the column names specified
              for T1.

          *   The maximum number of query blocks within a query
              expression is 16.

          *   Data types of corresponding columns in T1 and T2 must be
              comparable.  When columns are of the same type but of
              different sizes, the result has the length of the longer of
              the source columns.

   *   The ORDER BY clause can specify the ordinal number or the column
       name of a column in the leftmost query expression in a UNION.

   *   You cannot use LONG columns in a UNION statement except in long
       string functions.

Table 10-7  shows the conversion rules for comparable data types:

                                Table 10-7.   
----------------------------------------------------------------------------------------------------------------------
| CSI243sIX1581CSI32s             |                         |                       |                                |
|                                 |                         |                       |                                |
|                      Data Type  |     Source Columns      |     Result Column     |            Comment             |
|                                 |                         |                       |                                |
----------------------------------------------------------------------------------------------------------------------
|                                 |                         |                       |                                |
|                     Character   | One CHAR, one VARCHAR   | VARCHAR               | Result has the length of the   |
|                                 |                         |                       | longer of the two source       |
|                                 |                         |                       | columns.                       |
|                                 |                         |                       |                                |
----------------------------------------------------------------------------------------------------------------------
|                                 |                         |                       |                                |
|                                 | One NATIVE CHAR, one    | NATIVE VARCHAR        | Result has the length of the   |
|                                 | NATIVE VARCHAR          |                       | longer of the two source       |
|                                 |                         |                       | columns.                       |
|                                 |                         |                       |                                |
----------------------------------------------------------------------------------------------------------------------
|                                 |                         |                       |                                |
|                                 | One NATIVE CHAR, one    | NATIVE CHAR           | Result has the length of the   |
|                                 | CHAR                    |                       | longer of the two source       |
|                                 |                         |                       | columns.                       |
|                                 |                         |                       |                                |
----------------------------------------------------------------------------------------------------------------------
|                                 |                         |                       |                                |
|                                 | One NATIVE VARCHAR, one | NATIVE VARCHAR        | Result has the length of the   |
|                                 | CHAR or VARCHAR         |                       | longer of the two source       |
|                                 |                         |                       | columns.                       |
|                                 |                         |                       |                                |
----------------------------------------------------------------------------------------------------------------------
|                                 |                         |                       |                                |
|                                 | One NATIVE CHAR, one    | NATIVE VARCHAR        | Result has the length of the   |
|                                 | VARCHAR                 |                       | longer of the two source       |
|                                 |                         |                       | columns.                       |
|                                 |                         |                       |                                |
----------------------------------------------------------------------------------------------------------------------
|                                 |                         |                       |                                |
|                                 | One NATIVE VARCHAR, one | NATIVE VARCHAR        | Result has the length of the   |
|                                 | VARCHAR                 |                       | longer of the two source       |
|                                 |                         |                       | columns.                       |
|                                 |                         |                       |                                |
----------------------------------------------------------------------------------------------------------------------
|                                 |                         |                       |                                |
|                     Numeric     | One FLOAT or REAL       | FLOAT                 |                                |
|                                 |                         |                       |                                |
----------------------------------------------------------------------------------------------------------------------
|                                 |                         |                       |                                |
|                                 | Both DECIMAL            | DECIMAL               | If p1 and s1 are the precision |
|                                 |                         |                       | and scale of C1, and p2 and s2 |
|                                 |                         |                       | are the precision and scale of |
|                                 |                         |                       | C2, the precision and scale of |
|                                 |                         |                       | the result column is as        |
|                                 |                         |                       | follows:[REV BEG]              |
|                                 |                         |                       | MIN(27, MAX(s1,s2) +           |
|                                 |                         |                       | MAX(p1-s1, p2-s2))             |
|                                 |                         |                       | and the following is the scale |
|                                 |                         |                       | of the result column:          |
|                                 |                         |                       | MAX(s1,s2)[REV END]            |
|                                 |                         |                       |                                |
----------------------------------------------------------------------------------------------------------------------
|                                 |                         |                       |                                |
|                                 | One DECIMAL, one        | DECIMAL               | Precision and scale are        |
|                                 | SMALLINT or INTEGER     |                       | derived as above.  The         |
|                                 |                         |                       | precision and scale for an     |
|                                 |                         |                       | integer is (10,0); for a       |
|                                 |                         |                       | smallint, (5,0).               |
|                                 |                         |                       |                                |
----------------------------------------------------------------------------------------------------------------------
|                                 |                         |                       |                                |
|                                 | One INTEGER, one        | INTEGER               |                                |
|                                 | SMALLINT                |                       |                                |
|                                 |                         |                       |                                |
----------------------------------------------------------------------------------------------------------------------
|                                 |                         |                       |                                |
|                     Date/Time   | Both DATE, TIME,        | DATE, TIME, DATETIME, |                                |
|                                 | DATETIME, or INTERVAL   | or INTERVAL,          |                                |
|                                 |                         | respectively          |                                |
|                                 |                         |                       |                                |
----------------------------------------------------------------------------------------------------------------------
|                                 |                         |                       |                                |
|                                 | One CHAR or VARCHAR and | DATE, TIME, DATETIME, |                                |
|                                 | one DATE, TIME,         | or INTERVAL,          |                                |
|                                 | DATETIME, or INTERVAL   | respectively          |                                |
|                                 |                         |                       |                                |
----------------------------------------------------------------------------------------------------------------------
|                                 |                         |                       |                                |
|                     Binary      | One BINARY, one         | VARBINARY             | Result has length of the       |
|                                 | VARBINARY               |                       | longer of the two source       |
|                                 |                         |                       | columns.                       |
|                                 |                         |                       |                                |
----------------------------------------------------------------------------------------------------------------------

SQL Syntax--Query Block Level 

SELECT [ALL     ] SelectList [INTO HostVariableSpecification]  FROM
       [DISTINCT]

FromSpec [,...]  [WHERE SearchCondition1]  [GROUP BY GroupColumnList]

[HAVING SearchCondition2]

Parameters--Query Block Level 

ALL                       prevents elimination of duplicate rows from the
                          result.  If neither ALL nor DISTINCT is
                          specified, the ALL option is assumed.

DISTINCT                  ensures that each row in the query result is
                          unique.  All null values are considered equal.
                          You cannot specify this option if the select
                          list contains an aggregate function with
                          DISTINCT in the argument.  This option cannot
                          be used for a select list longer than 255
                          items.[REV BEG] Avoid DISTINCT in subqueries
                          since the query result is not changed, and it
                          hinders rather than helping performance.[REV
                          END] 

SelectList                tells how the columns of the result table are
                          to be derived.  The syntax of SelectList is
                          presented separately below. 

INTO                      The INTO clause defines host variables for
                          holding rows returned in application programs.
                          Do not use this clause for SELECT statements
                          associated with a cursor or dynamically
                          preprocessed SELECT statements, query blocks
                          within subqueries, nested query expressions, or
                          any but the first query block in a SELECT
                          statement.

HostVariableSpecification identifies one or more host variables for
                          holding rows returned in application programs.
                          Do not use this clause for SELECT statements
                          associated with a cursor or dynamically
                          preprocessed SELECT statements, query blocks
                          within subqueries, nested query expressions, or
                          any but the first query block in a SELECT
                          statement.  The syntax of BULK and non-BULK
                          types of HostVariableSpecification are
                          presented separately below.

FROM                      The FROM clause identifies the tables and views
                          referenced anywhere in the SELECT statement.
                          The maximum number of tables per query is 31. 

FromSpec                  identifies the tables and views in a query
                          block and explicitly defines inner and outer
                          joins.  The syntax of FromSpec is presented
                          separately below.

WHERE                     The WHERE clause determines the set of rows to
                          be retrieved.  Rows for which SearchCondition1 
                          is false or unknown are excluded from
                          processing.  If the WHERE clause is omitted, no
                          rows are excluded.  Aggregate functions cannot
                          be used in the WHERE clause.

                          Rows that do not satisfy SearchCondition1 are
                          eliminated before groups are formed and
                          aggregate functions are evaluated.

                          When you are joining tables or views, the WHERE
                          clause also specifies the condition(s) under
                          which rows should be joined.  You cannot join
                          on a column in a view derived using a GROUP BY
                          clause.  If you omit a join condition,
                          ALLBASE/SQL joins each row in each table in the
                          FROM clause with each row in all other tables
                          in the FROM clause.

                          SearchCondition1 may contain subqueries.  Each
                          subquery is effectively executed for each row
                          of the outer query and the results used in the
                          application of SearchCondition1 to the given
                          row.  If any executed subquery contains an
                          outer reference to a column of a table or view
                          in the FROM clause, then the reference is to
                          the value of that column in the given row.

                          Refer to the "Search Conditions" chapter for
                          additional information on search conditions. 

GROUP BY                  The GROUP BY clause identifies the columns to
                          be used for grouping when aggregate functions
                          are specified in the select list and you want
                          to apply the function to groups of rows.  You
                          can specify as many as 1023 columns, unless the
                          select list contains an aggregate function with
                          the DISTINCT option, in which case you can
                          specify as many as 254 columns.

                          The syntax for the group column list in the
                          GROUP BY clause follows:

                          {[[Owner.]TableName.]ColumnName}[,...]
                          {[CorrelationName.  ]          }
                          When you use the GROUP BY clause, the select
                          list can contain only aggregate functions and
                          columns referenced in the GROUP BY clause.  If
                          the select list contains an *, a TableName.*,
                          or an Owner.TableName.* construct, then the
                          GROUP BY clause must contain all columns that
                          the * includes.  Specify the grouping column
                          names in order from major to minor.

                          Null values are considered equivalent in
                          grouping columns.  If all other columns are
                          equal, all nulls in a column are placed in a
                          single group.

                          If the GROUP BY clause is omitted, the entire
                          query result table is treated as one group.

HAVING                    The HAVING clause specifies a test to be
                          applied to each group.  Any group for which the
                          result of the test is false or unknown is
                          excluded from the query result.  This test,
                          referred to as SearchCondition2, can be a
                          predicate containing either an aggregate
                          function or a column named in the GROUP BY
                          clause.

                          Each subquery in SearchCondition2 is
                          effectively checked for each group created by
                          the GROUP BY clause, and the result is used in
                          the application of SearchCondition2 to the
                          given group.  If any executed subquery contains
                          an outer reference to a column, then the
                          reference is to the values of that column in
                          the given group.  Only grouping columns can be
                          used as outer references in a subquery in
                          SearchCondition2.

SQL Syntax--SelectList 

{*                           }
{[Owner.] Table.*            }
{CorrelationName.*           } [,...]
{Expression                  }
{[[Owner.] Table.] ColumnName}
{CorrelationName.ColumnName  }

Parameters--SelectList 

*                       includes, as columns of the result table, all
                        columns of all tables and views specified in the
                        FROM clause.

[Owner.]Table.*         includes all columns of the specified table or
                        view in the result.

CorrelationName.*       includes all columns of the specified table or
                        view in the result.  The correlation name is a
                        synonym for the table or view as defined in the
                        FROM clause.

Expression              produces a single column in the result table; the
                        result column values are computed by evaluating
                        the specified expression for each row of the
                        result table.

                        The expression can be of any complexity.  For
                        example, it can simply designate a single column
                        of one of the tables or views specified in the
                        FROM clause, or it can involve aggregate
                        functions, multiple columns, and so on.  When you
                        specify one or more aggregate functions in a
                        select list, the only other entity you can
                        specify is the name(s) of the column(s) you group
                        by.

[ [Owner.]Table.]       includes a particular column from the named
ColumnName              owner's indicated table.

CorrelationName.        includes a specific column from the table whose
ColumnName              correlation name is defined in the FROM clause.

SQL Syntax--BULK HostVariableSpecification 

     :Buffer [,:StartIndex  [,:NumberOfRows] ]

Parameters--BULK HostVariableSpecification 

Buffer                is a host array or structure that is to receive the
                      output of the SELECT statement.  This array
                      contains elements for each column in the SelectList 
                      and indicator variables for columns that can
                      contain null values.  Whenever a column can contain
                      nulls, an indicator variable must be included in
                      the array definition immediately after the
                      definition of that column.  The indicator variable
                      can receive the following integer values after a
                      SELECT statement:

                      0      the column's value is not NULL

                      -1     the column's value is NULL

                      > 0    is truncated; the number indicates the data
                             length before truncation

StartIndex            is a host variable whose value specifies the array
                      subscript denoting where the first row in the query
                      result should be stored; default is the first
                      element of the array.

Number- OfRows        is a host variable whose value specifies the
                      maximum number of rows to store; default is to fill
                      from the starting index to the end of the array.

The total number of rows stored is returned in the SQLERRD[3] field of
the SQLCA. (SQLERRD[2] for the C language.)

SQL Syntax--non-BULK HostVariableSpecification 

{:HostVariable [[INDICATOR] :Indicator]} [,...]

Parameters--non-BULK HostVariableSpecification 

HostVariable          identifies the host variable corresponding to one
                      column in the row.

Indicator             names an indicator variable, an output host
                      variable whose value (see following) depends on
                      whether the host variable contains a null value:

                      0      the column's value is not NULL

                      -1     the column's value is NULL

                      > 0    is truncated; the number indicates the data
                             length before truncation

The order of the host variables must match the order of their
corresponding items in the select list.

SQL Syntax--FromSpec 

{TableSpec                                                       }
{(FromSpec)                                                      }
{                 [INNER        ]                                }
{FromSpec NATURAL [LEFT [OUTER] ] JOIN {TableSpec }              }
{                 [RIGHT [OUTER]]      {(FromSpec)}              }
{                                                                }
{         [INNER        ]                                        }
{FromSpec [LEFT [OUTER] ] JOIN {TableSpec } {ON SearchCondition3}}
{         [RIGHT [OUTER]]      {(FromSpec)} {USING (ColumnList) }}
Parameters--FromSpec 

TableSpec            identifies a table or view from which rows are
                     selected.

                     The syntax for a TableSpec in a FromSpec follows:

                     [Owner.]TableName [CorrelationName]

                     [Owner.]TableName   identifies a table or view to be
                                         referenced.  The TableName may
                                         be preceded by an OwnerName, and
                                         may be followed by the
                                         definition of a CorrelationName.

                     CorrelationName     specifies a synonym for the
                                         immediately preceding table or
                                         view.  The correlation name can
                                         be used instead of the actual
                                         table or view name anywhere
                                         within the SELECT statement when
                                         accessing columns or TID values
                                         of that table.

                                         The correlation name must
                                         conform to the syntax rules for
                                         a basic name.  All correlation
                                         names within one SELECT
                                         statement must be unique.  They
                                         cannot be the same as any table
                                         name or view name in the FROM
                                         clause that does not also have a
                                         correlation name associated with
                                         it.

                                         Correlation names are useful
                                         when you join a table to itself.
                                         You name the table twice in the
                                         FROM clause, and assign it two
                                         different correlation names.

(FromSpec)           allows the placement of parentheses around a
                     FromSpec in order to alter the order of evaluation
                     of the components of a complex FromSpec, such as one
                     used to describe a three or more table outer join.

NATURAL              indicates that for both inner and outer joins,
                     columns which are common to two tables being joined
                     will be coalesced into a single column when the
                     query result is returned.  Also, ALLBASE/SQL will
                     automatically identify and use the columns common to
                     both tables to execute the join.  When using
                     the keyword NATURAL you do not use an ON
                     SearchCondition3 clause or a USING (ColumnList)
                     clause to specify the join columns.

INNER                join type indicates that the only rows selected in
                     the join will be those rows for which a match is
                     found in the join column(s) of both tables being
                     joined.  If the join type is not specified, INNER is
                     the default.

LEFT                 defines the join as a LEFT OUTER JOIN. For a LEFT
                     OUTER JOIN the query result will contain not only
                     the matched rows from both tables being joined, but
                     will also preserve (contain) those rows from the
                     left hand table in the FromSpec for which there is
                     no match in the right hand table.  The preserved
                     rows are extended to the right with null column
                     values for each column obtained from the right hand
                     table.

                     For each instance of the keyword JOIN in a FromSpec,
                     the named table or the result table immediately
                     preceding JOIN is the left hand table, the named
                     table or the result table immediately following JOIN
                     is the right hand table.

RIGHT                defines the join as a RIGHT OUTER JOIN. For a RIGHT
                     OUTER JOIN the query result will contain not only
                     the matched rows from both tables being joined, but
                     will also preserve (contain) those rows from the
                     right hand table in the FromSpec for which there is
                     no match in the left hand table.  The preserved rows
                     are extended to the left with null column values for
                     each column obtained from the left hand table.

                     For each instance of the keyword JOIN in a FromSpec,
                     the named table immediately following JOIN is the
                     right hand table, the named table immediately
                     preceding JOIN is the left hand table.

OUTER                is optional as a keyword.  If either LEFT or RIGHT
                     are used, the join type is, by default, an outer
                     join.

JOIN                 specifies that a join is being defined.  Evaluation
                     of the FromSpec is from left to right.  For a three
                     or more table join, the two tables associated with
                     the left most instance of the JOIN keyword are
                     joined first, and the result of that join is
                     considered the left hand table for the next
                     occurring instance of the keyword JOIN. The same
                     algorithm applies for each additional occurrence of
                     JOIN. Parentheses can be used to force a change in
                     this order of evaluation of the FromSpec.

ON SearchCondition3     may only be used when the keyword NATURAL is not
                        used.  Two types of predicates are specified in
                        SearchCondition3.

                        The first type of predicate contains the equality
                        which specifies the join columns to be used for
                        the associated join.  For each occurrence in the
                        FromSpec of the keyword JOIN, in the ON
                        SearchCondition3 clause the column names
                        specified on each side of the equality must be
                        fully qualified.

                        The second type of predicate limits, for the
                        associated join only, the rows which participate
                        in the inner part of the join.  Rows which are
                        excluded from the inner part of the join will be
                        added to those preserved in the outer part of the
                        join.  This predicate follows all general rules
                        for search conditions as specified in the "Search
                        Conditions" chapter.

                        Predicates placed in the ON SearchCondition3 
                        clause, associated with an instance of JOIN,
                        apply only to that associated inner join.
                        However, predicates placed in the WHERE clause of
                        the SELECT statement apply to the entire query
                        result, after all joins have been evaluated.
                        Therefore you must consider carefully the
                        placement of limiting predicates to decide
                        whether they belong in the WHERE clause, or in an
                        ON SearchCondition3 clause associated with a
                        particular instance of JOIN in the FromSpec.  See
                        "Outer Joins" in the "SQL Queries" chapter for
                        specific examples illustrating the changes to the
                        query result brought about by changes in
                        placement of the limiting predicates.

USING(ColumnList)       specifies participating columns common to both
                        tables being joined, and can only be used if the
                        keyword NATURAL has not been used in the
                        FromSpec.  The column names must be unqualified
                        because the columns occur in more than one table.

Description--Query Block Level 

   *   The BULK option and INTO clause cannot be used interactively or in
       procedures.

   *   The clauses must be specified in the order given in the syntax
       diagram.

   *   A result column in the select list can be derived in any of these
       following ways:

          *   A result column can be taken directly from one of the
              tables or views listed in the FROM clause.

          *   Values in a result column can be computed, using an
              arithmetic expression, from values in a specified column of
              a table or view listed in the FROM clause.

          *   Values in several columns of a single table or view can be
              combined in an arithmetic expression to produce the result
              column values.

          *   Values in columns of various different tables or views can
              be combined in an arithmetic expression to produce the
              result column values. 

          *   Aggregate functions (AVG, MAX, MIN, SUM, and COUNT) can be
              used to compute result column values over groups of rows.
              Aggregate functions can be used alone or in an expression.
              If you specify more than one aggregate function containing
              the DISTINCT option, all these aggregate functions must
              operate on the same column.  If the GROUP BY clause is not
              specified, the function is applied over all rows that
              satisfy the query.  If the GROUP BY clause is specified,
              the function is applied once for each group defined by the
              GROUP BY clause.  When you use aggregate functions with the
              GROUP BY clause, the select list can contain only aggregate
              functions and columns referenced in the GROUP BY clause.

          *   A result column containing a fixed value can be created by
              specifying a constant or an expression involving only
              constants.

   *   In addition to specifying how the result columns are derived, the
       select list also controls their relative position from left to
       right in the result table.  The first result column specified by
       the select list becomes the leftmost column in the result table. 

   *   The maximum number of columns in a query result is 1024, except
       when the query contains the DISTINCT option or is within a UNION
       query expression.  In this case, the maximum number of columns is
       1023.  The maximum number of LONG data type columns which can be
       directly selected or fetched in a select list is 40.  However, any
       number can be referenced in long string functions.  They must be
       referenced by column name only and cannot participate in an
       expression in the select list, unless they are being accessed
       through long string functions.

   *   Result columns in the select list are numbered from left to right.
       The leftmost column is number 1.  Result columns can be referred
       to by column number in the ORDER BY clause; this is especially
       useful if you want to refer to a column defined by an arithmetic
       expression.

   *   When you specify the NATURAL....JOIN:
          *   You can not use the ON SearchCondition3 or USING
              (ColumnList) clauses. 
          *   Each pair of columns with the same column name, which are
              common to the two tables being joined, will be coalesced
              into a single common column in the query result.
              ALLBASE/SQL will automatically determine which columns to
              use for the join.  All columns which have the same column
              name in each of the tables being joined will be used for
              the join. 
          *   When common columns are referenced in the query, such as in
              the select list, you must use only the unqualified name of
              the column.
          *   Each pair of columns common to two tables being joined must
              have the same or compatible data types. 
          *   For a SELECT *, each pair of columns, common to the two
              tables being joined, will be coalesced into a single common
              column and will be the first columns displayed in the
              result, in the order in which they were defined in the left
              hand table.  They will be followed by the columns from the
              left hand table that were not used for the join.  The last
              columns displayed will be those from the right hand table
              not participating in the join.  Columns not used for the
              join will be displayed in the order in which they are
              defined in their respective tables.
          *   For any other SELECT, the columns displayed will be those
              specified in the select list, in the order specified. 
          *   If there are no common columns between the tables being
              joined, the columns resulting from the join are the same as
              the columns that would result from the Cartesian product of
              the joined tables.  See the "SQL Queries" chapter.

   *   When you specify JOIN....ON SearchCondition3:
          *   You cannot use the keyword NATURAL or the USING ColumnList 
              clause.
          *   Column Names from common columns used in the join predicate
              in SearchCondition3 must be fully qualified.  If additional
              predicates are used in SearchCondition3 to limit the rows
              returned from the join, each column name used must
              unambiguously reference a column in one of the tables being
              joined, or must be an outer reference (as in the case of
              nested subqueries).
          *   For a SELECT *, the columns contained in the result of the
              join are the same as the columns of the Cartesian product
              of the tables being joined.
          *   For any other SELECT, the columns displayed will be those
              specified in the select list, in the order specified. 
          *   The result of the INNER JOIN....ON SearchCondition3 
              contains the multiset of rows of the Cartesian Product of
              the tables being joined for which all predicates in
              SearchCondition3 are true.

   *   When you specify JOIN....USING (ColumnList):
          *   You must not use the keyword NATURAL or the ON
              SearchCondition3 clause.
          *   You place in the ColumnList one unqualified column name for
              each pair of common columns being used for the join.
          *   No column name may be used if it is not common to both
              tables being joined.
          *   For SELECT *, the result of the INNER JOIN....USING
              (ColumnList) contains the multiset of rows of the Cartesian
              product of the tables being joined for which the
              corresponding join columns have equal values.  The
              coalesced common columns are returned first.  (No duplicate
              columns are displayed in the case of common columns).  The
              non-join columns from both tables appear next.  If there is
              no common column, the result contains the multiset of rows
              of the Cartesian product of the tables being joined.

   *   The result of the [NATURAL] LEFT [OUTER] JOIN is the union of two
       components.  The first component is the result of the equivalent
       [NATURAL] INNER JOIN. The second component contains those rows in
       the left hand table that are not in the INNER JOIN result.  These
       rows are extended to the right with null values in the column
       positions corresponding to the columns from the right hand table.
       For a natural join, the column values in the common columns are
       taken from the left hand table.

   *   The result of the [NATURAL] RIGHT [OUTER] JOIN is the union of two
       components.  The first component is the result of the equivalent
       [NATURAL] INNER JOIN. The second component contains those rows in
       the right hand table that are not in the INNER JOIN result.  These
       rows are extended to the left with null values in the column
       positions corresponding to the columns from the left hand table.
       For a natural join, the column values in the common columns are
       taken from the right hand table.
       [REV BEG]

   *   The ON clause (which is associated with the OUTER JOIN in a join
       condition) and all predicates in a WHERE clause are filters.  At
       each OUTER JOIN block, the INNER JOIN result (which matches the
       join condition in an ON clause) will be presented.  Then all
       tuples in the preserving table (which is not in the INNER
       JOIN result) will be presented by matching columns in the
       non-preserving table with nulls.[REV END] 

   *   For three or more table joins, care must be taken when mixing
       NATURAL....JOIN, JOIN ON SearchCondition3, and JOIN USING
       (ColumnList) clauses.
          *   The JOIN ON Searchcondition3 clause produces a result table
              with the common columns appearing twice, once for each
              table participating in the join.
          *   If this result table is used as input to a NATURAL....JOIN
              clause or a JOIN USING (ColumnList) clause, and the column
              appearing twice in the result table is named as a join
              column in the JOIN USING (ColumnList) clause or is selected
              by ALLBASE/SQL as the join column in the NATURAL JOIN, an
              error will result.  This happens because it is impossible
              to specify which of the two common columns in the result
              table is to participate in the following join.
          *   When writing a three or more table join with explicit join
              syntax, make sure that for any single result table
              participating in a join, there are no duplicate column
              names which will be named as a join column.  To ensure
              this, make each join clause a NATURAL...JOIN or a
              JOIN...USING (ColumnList), except for the final join, which
              may contain these types or a JOIN...ON SearchCondition3 
              clause.  Otherwise, ensure that each join clause is a
              JOIN...ON SearchCondition3 clause.

   *   To join tables, without using explicit JOIN syntax, list the
       tables in the FROM clause, and specify a join predicate in the
       WHERE clause.
          *   If you specify SELECT * and in the WHERE clause an equal
              predicate specifies the join but there are no other
              limiting predicates, the result of this procedure is the
              same as that obtained when using the INNER JOIN described
              above.  The common column appears twice in the query
              result, once for each table from which it was obtained.
          *   If you select each column explicitly, naming each column
              only once (and appropriately fully qualify a single column
              name for each pair of column names that is common to both
              tables) the result is the same as that obtained when using
              the NATURAL INNER JOIN, above.  The common column appears
              only once in the query result, and is taken from the table
              specified in the fully qualified column name.

   *   To join a table with itself, define correlation names for the
       table in the FROM clause; use the correlation names in the select
       list and the WHERE clause to qualify columns from that table.

   *   NULLs affect joins and Cartesian products as follows:
          *   Rows are only selected for an inner join when the join
              predicate evaluates to true.  Since the value of NULL is
              undetermined, the value of the predicate NULL = NULL is
              unknown.  Thus, if the value in the common columns being
              joined is NULL, the rows involved will not be selected.
          *   Rows excluded from the inner part of an outer join because
              the common column values are NULL, are included in the
              outer part of the outer join.
          *   The existence of NULLs does not exclude rows from being
              included in a Cartesian product.  See the "SQL Queries"
              chapter for more information.

   *   When you use the GROUP BY clause, one answer is returned per
       group, in accord with the select list:
          *   The WHERE clause eliminates rows before groups are formed.
          *   The GROUP BY clause groups the resulting rows.
          *   The HAVING clause eliminates groups.
          *   The select list aggregate functions are computed for each
              group.

   *   ALLBASE/SQL allocates sort file space in /tmp, by default, or in
       the space specified using the CREATE TEMPSPACE statement.  The
       space is deallocated once the statement completes.

   *   The query block is considered updatable if, and only if, it
       satisfies the following conditions:

          *   No DISTINCT, GROUP BY, or HAVING clause is specified in the
              outermost SELECT clause, and no aggregates appear in the
              select list.

          *   No INTO clause is specified.

          *   The FROM clause specifies exactly one table or view
              (contains no inner or outer joins) and if a view is
              specified, it is an updatable view.

          *   For INSERT and UPDATE through views, the select list in the
              view definition must not contain any arithmetic
              expressions.  It must contain only column names.

          *   For DELETE WHERE CURRENT and UPDATE WHERE CURRENT
              operations, the cursor definition must not contain
              subqueries.

          *   For noncursor UPDATE, DELETE, or INSERT, the view
              definition, or the WHERE clause must not contain any
              subqueries referencing the target table in their FROM
              clause.

Authorization 

If you specify the name of a table, you must have SELECT or OWNER
authority for the table, or you must have DBA authority.

If you specify the name of a view, you must have SELECT or OWNER
authority for the view, or you must have DBA authority.  Also, the owner
of the view must have SELECT or OWNER authority with respect to the
view's definition, or the owner must have DBA authority.

Examples 

   1.  Simple queries

       One value, the average number of days you wait for a part, is
       returned.

            SELECT AVG(DeliveryDays)
              FROM PurchDB.SupplyPrice

       The part number and delivery time for all parts that take fewer
       than 20 days to deliver are returned.  Multiple rows may be
       returned for a single part.

            SELECT PartNumber, DeliveryDays
              FROM PurchDB.SupplyPrice
             WHERE DeliveryDays < 20

   2.  Grouping

       The part number and average price of each part are returned.

               SELECT PartNumber, AVG(UnitPrice)
                 FROM PurchDB.SupplyPrice
             GROUP BY PartNumber

       The query result is the same as the query result for the previous
       SELECT statement, except it contains rows only for parts that can
       be delivered in fewer than 20 days.

               SELECT PartNumber, AVG(UnitPrice)
                 FROM PurchDB.SupplyPrice
             GROUP BY PartNumber
               HAVING MAX(DeliveryDays) < 20

   3.  Joining

       This join returns names and locations of California suppliers.
       Rows are returned in ascending PartNumber order; rows containing
       duplicate PartNumbers are returned in ascending VendorName order.
       The FROM clause defines two correlation names (v and s), which are
       used in both the select list and the WHERE clause.  VendorNumber
       is the only common column between Vendors and SupplyPrice.

             SELECT PartNumber, VendorName, s.VendorNumber, VendorCity
                 FROM PurchDB.SupplyPrice s, PurchDB.Vendors v
                WHERE s.VendorNumber = v.VendorNumber
                  AND VendorState = 'CA'
             ORDER BY PartNumber, VendorName

       This query is identical to the query immediately above except that
       it uses the explicit JOIN syntax .

                  SELECT PartNumber, VendorName, VendorNumber, VendorCity
                    FROM PurchDB.SupplyPrice
            NATURAL JOIN PurchDB.Vendors
                   WHERE VendorState = 'CA'
                ORDER BY PartNumber, VendorName

       This query joins table PurchDB.Parts to itself in order to
       determine which parts have the same sales price as part 1133-P-01.

            SELECT q.PartNumber, q.SalesPrice
              FROM PurchDB.Parts p, PurchDB.Parts q
             WHERE p.SalesPrice = q.SalesPrice
               AND p.PartNumber = '1133-P-01'

       This query does a left outer join between the Vendors and
       SupplyPrice tables.  Since every part supplied by a vendor has an
       entry in the SupplyPrice table, the result first displays every
       vendor who supplies a part.  The result then displays every vendor
       who does not supply any parts.

                SELECT PartNumber, VendorName, VendorCity
                  FROM Purchdb.Vendors v
            LEFT  JOIN Purchdb.SupplyPrice s
                    ON s.VendorNumber = v.VendorNumber
            ORDER BY PartNumber, VendorName

   4.  BULK SELECT

       Programmatically, when you do not need to use the capabilities
       associated with a cursor, you can use the BULK option to retrieve
       multiple rows.

            BULK SELECT *
                   INTO :Items, :Start, :NumRow
                   FROM PurchDB.Inventory

   5.  UNION Option

       Retrieves all rows from two Parts tables into a single query
       result ordered by PartNumber.  PartNumber and PartValue are
       comparable; SalesPrice and Price are comparable.

              SELECT PartNumber, SalesPrice
                FROM P1988.Parts
               UNION
              SELECT PartValue, Price
                FROM P1989.Parts
            ORDER BY PartNumber

   6.  Nested query or subquery

       Obtain a list of customer orders whose totals are higher than the
       largest order of 1988.

              SELECT OrderNumber, SUM(PurchasePrice)
                FROM PurchDB.OrderItems
            GROUP BY OrderNumber
              HAVING SUM(PurchasePrice) > (SELECT MAX(PurchasePrice)
                                             FROM FY1988.Orders)

       Get vendor numbers for all vendors located in the same city as
       vendor number 9005.

            SELECT VendorNumber
              FROM PurchDB.Vendors
             WHERE VendorCity = (SELECT VendorCity
                                   FROM PurchDB.Vendors
                                  WHERE VendorNumber = '9005')

       Get supplier names for suppliers who provide at least one red
       part.

            SELECT SNAME
              FROM S
             WHERE SNO IN ( SELECT SNO
                              FROM SP
                             WHERE EXISTS (SELECT PNO
                                             FROM P
                                            WHERE P.PNO = SP.PNO
                                              AND COLOR = 'RED' ))

       Get supplier number for suppliers who supply the most parts.

              SELECT SNO
                FROM SP
            GROUP BY SNO
              HAVING COUNT(DISTINCT PNO) >= ALL ( SELECT COUNT(DISTINCT PNO)
                                                    FROM SP
                                                GROUP BY SNO )

       Insert into table T, supplier names of each supplier who does not
       supply any part.

            INSERT INTO T (SNO)
                 SELECT SNO
                   FROM S
                  WHERE NOT EXISTS (SELECT *
                                      FROM SP
                                     WHERE SP.SNO = S. SNO)

       Delete all suppliers from the supplier table who do not supply any
       parts.

            DELETE FROM S
             WHERE NOT EXISTS ( SELECT *
                                  FROM SP
                                 WHERE SP.SNO = S.SNO)



MPE/iX 5.5 Documentation