BNF Grammar for ISO/IEC 9075:1992 - Database Language SQL (SQL-92)

 
Cross-Reference: rules
Cross-Reference: keywords

Derived from file sql-92.bnf version 2.3 dated 2004/03/31 19:34:09
Generated on 2005-07-13 18:32:46+00:00 by file bnf2html.pl version 3.7 dated 2005/07/13 18:32:35

Using Appendix G of "Understanding the New SQL: A Complete Guide" by J Melton and A R Simon (Morgan Kaufmann, 1993, ISBN 0-55860-245-3) as the source of the syntax, here is (most of) the BNF syntax for SQL-92. The missing parts are the Cobol, Fortran, MUMPS, Pascal and PL/I variable definition rules.

The plain text version of this grammar is sql-92.bnf .


Key SQL Statements and Fragments

  • ALLOCATE CURSOR <allocate cursor statement>
  • ALTER DOMAIN <alter domain statement>
  • ALTER TABLE <alter table statement>
  • CLOSE cursor <close statement> <dynamic close statement>
  • Column definition <column definition>
  • COMMIT WORK <commit statement>
  • CONNECT <connect statement>
  • CREATE ASSERTION <assertion definition>
  • CREATE CHARACTER SET <character set definition>
  • CREATE COLLATION <collation definition>
  • CREATE DOMAIN <domain definition>
  • CREATE SCHEMA <schema definition>
  • CREATE TABLE <table definition>
  • CREATE TRANSLATION <translation definition>
  • CREATE VIEW <view definition>
  • Data type <data type>
  • DEALLOCATE PREPARE <deallocate prepared statement>
  • DECLARE cursor <declare cursor> <dynamic declare cursor>
  • DECLARE LOCAL TEMPORARY TABLE <temporary table declaration>
  • DELETE <delete statement: positioned> <delete statement: searched> <dynamic delete statement: positioned>
  • DESCRIBE <describe statement>
  • DESCRIPTOR statements <system descriptor statement>
  • DISCONNECT <disconnect statement>
  • EXECUTE <execute statement>
  • EXECUTE IMMEDIATE <execute immediate statement>
  • FETCH cursor <fetch statement> <dynamic fetch statement>
  • GET DIAGNOSTICS <get diagnostics statement>
  • GRANT <grant statement>
  • INSERT <insert statement>
  • Literal <literal>
  • MODULE <module>
  • OPEN cursor <open statement> <dynamic open statement>
  • PREPARE <prepare statement>
  • Preparable statement <preparable statement>
  • REVOKE <revoke statement>
  • ROLLBACK WORK <rollback statement>
  • Search condition <search condition>
  • SELECT <query specification>
  • SET CATALOG <set catalog statement>
  • SET CONNECTION <set connection statement>
  • SET CONSTRAINTS <set constraints mode statement>
  • SET NAMES <set names statement>
  • SET SCHEMA <set schema statement>
  • SET SESSION AUTHORIZATION <set session authorization identifier statement>
  • SET TIME ZONE <set local time zone statement>
  • SET TRANSACTION <set transaction statement>
  • UPDATE <update statement: positioned> <update statement: searched> <dynamic update statement: positioned>
  • Value expression <value expression>

    Top


    Basic Definitions of Characters Used, Tokens, Symbols, Etc.

      <SQL terminal character>    ::=
             <SQL language character>
         |     <SQL embedded language character>

      <SQL language character>    ::=
             <simple Latin letter>
         |     <digit>
         |     <SQL special character>

      <simple Latin letter>    ::=
             <simple Latin upper case letter>
         |     <simple Latin lower case letter>

      <simple Latin upper case letter>    ::=
         A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

      <simple Latin lower case letter>    ::=
         a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z

      <digit>    ::=
         0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

      <SQL special character>    ::=
             <space>
         |     <double quote>
         |     <percent>
         |     <ampersand>
         |     <quote>
         |     <left paren>
         |     <right paren>
         |     <asterisk>
         |     <plus sign>
         |     <comma>
         |     <minus sign>
         |     <period>
         |     <solidus>
         |     <colon>
         |     <semicolon>
         |     <less than operator>
         |     <greater than operator>
         |     <equals operator>
         |     <question mark>
         |     <underscore>
         |     <vertical bar>

      <space>    ::=   !! space character in character set in use

      <double quote>    ::=   "

      <percent>    ::=   %

      <ampersand>    ::=   &

      <quote>    ::=   '

      <left paren>    ::=   (

      <right paren>    ::=   )

      <asterisk>    ::=   *

      <plus sign>    ::=   +

      <comma>    ::=   ,

      <minus sign>    ::=   -

      <period>    ::=   .

      <solidus>    ::=   /

      <colon>    ::=   :

      <semicolon>    ::=   ;

      <less than operator>    ::=   <

      <equals operator>    ::=   =

      <greater than operator>    ::=   >

      <question mark>    ::=   ?

      <underscore>    ::=   _

      <vertical bar>    ::=  /* Nothing */ |

      <SQL embedded language character>    ::=   <left bracket> | <right bracket>

      <left bracket>    ::=   [

      <right bracket>    ::=   ]

      <token>    ::=
             <nondelimiter token>
         |     <delimiter token>

      <nondelimiter token>    ::=
             <regular identifier>
         |     <key word>
         |     <unsigned numeric literal>
         |     <national character string literal>
         |     <bit string literal>
         |     <hex string literal>

      <regular identifier>    ::=   <identifier body>

      <identifier body>    ::=   <identifier start> [ { <underscore> | <identifier part> } ... ]

      <identifier start>    ::=   !! See the Syntax rules

      <identifier part>    ::=   <identifier start> | <digit>

      <key word>    ::=   <reserved word> | <non-reserved word>

      <reserved word>    ::=
             ABSOLUTE | ACTION | ADD | ALL | ALLOCATE | ALTER | AND | ANY | ARE
         |     AS | ASC | ASSERTION | AT | AUTHORIZATION | AVG
         |     BEGIN | BETWEEN | BIT | BIT_LENGTH | BOTH | BY
         |     CASCADE | CASCADED | CASE | CAST | CATALOG | CHAR | CHARACTER | CHARACTER_LENGTH
         |     CHAR_LENGTH | CHECK | CLOSE | COALESCE | COLLATE | COLLATION | COLUMN | COMMIT
         |     CONNECT | CONNECTION | CONSTRAINT | CONSTRAINTS | CONTINUE | CONVERT | CORRESPONDING
         |     CREATE | CROSS | CURRENT | CURRENT_DATE | CURRENT_TIME | CURRENT_TIMESTAMP | CURRENT_USER | CURSOR
         |     DATE | DAY | DEALLOCATE | DEC | DECIMAL | DECLARE | DEFAULT
         |     DEFERRABLE | DEFERRED | DELETE | DESC | DESCRIBE | DESCRIPTOR | DIAGNOSTICS
         |     DISCONNECT | DISTINCT | DOMAIN | DOUBLE | DROP
         |     ELSE | END | END -EXEC | ESCAPE | EXCEPT | EXCEPTION | EXEC | EXECUTE | EXISTS | EXTERNAL | EXTRACT
         |     FALSE | FETCH | FIRST | FLOAT | FOR | FOREIGN | FOUND | FROM | FULL
         |     GET | GLOBAL | GO | GOTO | GRANT | GROUP
         |     HAVING | HOUR
         |     IDENTITY | IMMEDIATE | IN | INDICATOR | INITIALLY | INNER | INPUT | INSENSITIVE
         |     INSERT | INT | INTEGER | INTERSECT | INTERVAL | INTO | IS | ISOLATION
         |     JOIN
         |     KEY
         |     LANGUAGE | LAST | LEADING | LEFT | LEVEL | LIKE | LOCAL | LOWER
         |     MATCH | MAX | MIN | MINUTE | MODULE | MONTH
         |     NAMES | NATIONAL | NATURAL | NCHAR | NEXT | NO | NOT | NULL | NULLIF | NUMERIC
         |     OCTET_LENGTH | OF | ON | ONLY | OPEN | OPTION | OR | ORDER | OUTER | OUTPUT | OVERLAPS
         |     PAD | PARTIAL | POSITION | PRECISION | PREPARE | PRESERVE | PRIMARY | PRIOR | PRIVILEGES | PROCEDURE | PUBLIC
         |     READ | REAL | REFERENCES | RELATIVE | RESTRICT | REVOKE | RIGHT | ROLLBACK | ROWS
         |     SCHEMA | SCROLL | SECOND | SECTION | SELECT | SESSION | SESSION_USER | SET
         |     SIZE | SMALLINT | SOME | SPACE | SQL | SQLCODE | SQLERROR | SQLSTATE | SUBSTRING | SUM | SYSTEM_USER
         |     TABLE | TEMPORARY | THEN | TIME | TIMESTAMP | TIMEZONE_HOUR | TIMEZONE_MINUTE
         |     TO | TRAILING | TRANSACTION | TRANSLATE | TRANSLATION | TRIM | TRUE
         |     UNION | UNIQUE | UNKNOWN | UPDATE | UPPER | USAGE | USER | USING
         |     VALUE | VALUES | VARCHAR | VARYING | VIEW
         |     WHEN | WHENEVER | WHERE | WITH | WORK | WRITE
         |     YEAR
         |     ZONE

      <non-reserved word>    ::=
             ADA
         |     C | CATALOG_NAME | CHARACTER_SET_CATALOG | CHARACTER_SET_NAME | CHARACTER_SET_SCHEMA
         |     CLASS_ORIGIN | COBOL | COLLATION_CATALOG | COLLATION_NAME | COLLATION_SCHEMA
         |     COLUMN_NAME | COMMAND_FUNCTION | COMMITTED | CONDITION_NUMBER | CONNECTION_NAME
         |     CONSTRAINT_CATALOG | CONSTRAINT_NAME | CONSTRAINT_SCHEMA | CURSOR_NAME
         |     DATA | DATETIME_INTERVAL_CODE | DATETIME_INTERVAL_PRECISION | DYNAMIC_FUNCTION
         |     FORTRAN
         |     LENGTH
         |     MESSAGE_LENGTH | MESSAGE_OCTET_LENGTH | MESSAGE_TEXT | MORE | MUMPS
         |     NAME | NULLABLE | NUMBER
         |     PASCAL | PLI
         |     REPEATABLE | RETURNED_LENGTH | RETURNED_OCTET_LENGTH | RETURNED_SQLSTATE | ROW_COUNT
         |     SCALE | SCHEMA_NAME | SERIALIZABLE | SERVER_NAME | SUBCLASS_ORIGIN
         |     TABLE_NAME | TYPE
         |     UNCOMMITTED | UNNAMED

    Top


    Literal Numbers, Strings, Dates and Times

      <unsigned numeric literal>    ::=
             <exact numeric literal>
         |     <approximate numeric literal>

      <exact numeric literal>    ::=
             <unsigned integer> [ <period> [ <unsigned integer> ] ]
         |     <period> <unsigned integer>

      <unsigned integer>    ::=   <digit> ...

      <approximate numeric literal>    ::=
             <mantissa> E <exponent>

      <mantissa>    ::=   <exact numeric literal>

      <exponent>    ::=   <signed integer>

      <signed integer>    ::=   [ <sign> ] <unsigned integer>

      <sign>    ::=   <plus sign> | <minus sign>

      <national character string literal>    ::=
             N <quote> [ <character representation> ... ] <quote> [ { <separator> ... <quote> [ <character representation> ... ] <quote> }... ]

      <character representation>    ::=   <nonquote character> | <quote symbol>

      <nonquote character>    ::=   !! See the Syntax rules

      <quote symbol>    ::=   <quote> <quote>

      <separator>    ::=   { <comment> | <space> | <newline> }...

      <comment>    ::=   <comment introducer> [ <comment character> ... ] <newline>

      <comment introducer>    ::=   <minus sign> <minus sign> [<minus sign >...]

      <comment character>    ::=   <nonquote character> | <quote>

      <newline>    ::=   !! implementation defined end of line indicator

      <bit string literal>    ::=
             B <quote> [ <bit> ... ] <quote> [ { <separator> ... <quote> [ <bit> ... ] <quote> }... ]

      <bit>    ::=   0 | 1

      <hex string literal>    ::=
             X <quote> [ <hexit> ... ] <quote> [ { <separator> ... <quote> [ <hexit> ... ] <quote> }... ]

      <hexit>    ::=   <digit> | A | B | C | D | E | F | a | b | c | d | e | f

      <delimiter token>    ::=
             <character string literal>
         |     <date string>
         |     <time string>
         |     <timestamp string>
         |     <delimited identifier>
         |     <SQL special character>
         |     <not equals operator>
         |     <greater than or equals operator>
         |     <less than or equals operator>
         |     <concatenation operator>
         |     <double period>
         |     <left bracket>
         |     <right bracket>

      <character string literal>    ::=
         [ <introducer> <character set specification> ] <quote> [ <character representation> ... ] <quote> [ { <separator> ... <quote> [ <character representation> ... ] <quote> }... ]

      <introducer>    ::=   <underscore>

      <character set specification>    ::=
             <standard character repertoire name>
         |     <implementation-defined character repertoire name>
         |     <user-defined character repertoire name>
         |     <standard universal character form-of-use name>
         |     <implementation-defined universal character form-of-use name>

      <standard character repertoire name>    ::=   <character set name>

      <character set name>    ::=   [ <schema name> <period> ] <SQL language identifier>

      <schema name>    ::=   [ <catalog name> <period> ] <unqualified schema name>

      <catalog name>    ::=   <identifier>

      <identifier>    ::=   [ <introducer> <character set specification> ] <actual identifier>

      <actual identifier>    ::=   <regular identifier> | <delimited identifier>

      <delimited identifier>    ::=   <double quote> <delimited identifier body> <double quote>

      <delimited identifier body>    ::=   <delimited identifier part> ...

      <delimited identifier part>    ::=   <nondoublequote character> | <doublequote symbol>

      <nondoublequote character>    ::=   !! See the syntax rules

      <doublequote symbol>    ::=   <double quote> <double quote>

      <unqualified schema name>    ::=   <identifier>

      <SQL language identifier>    ::=
             <SQL language identifier start> [ { <underscore> | <SQL language identifier part> }... ]

      <SQL language identifier start>    ::=   <simple Latin letter>

      <SQL language identifier part>    ::=   <simple Latin letter> | <digit>

      <implementation-defined character repertoire name>    ::=   <character set name>

      <user-defined character repertoire name>    ::=   <character set name>

      <standard universal character form-of-use name>    ::=   <character set name>

      <implementation-defined universal character form-of-use name>    ::=   <character set name>

      <date string>    ::=   <quote> <date value> <quote>

      <date value>    ::=   <years value> <minus sign> <months value> <minus sign> <days value>

      <years value>    ::=   <datetime value>

      <datetime value>    ::=   <unsigned integer>

      <months value>    ::=   <datetime value>

      <days value>    ::=   <datetime value>

      <time string>    ::=   <quote> <time value> [ <time zone interval> ] <quote>

      <time value>    ::=   <hours value> <colon> <minutes value> <colon> <seconds value>

      <hours value>    ::=   <datetime value>

      <minutes value>    ::=   <datetime value>

      <seconds value>    ::=   <seconds integer value> [ <period> [ <seconds fraction> ] ]

      <seconds integer value>    ::=   <unsigned integer>

      <seconds fraction>    ::=   <unsigned integer>

      <time zone interval>    ::=   <sign> <hours value> <colon> <minutes value>

      <timestamp string>    ::=   <quote> <date value> <space> <time value> [ <time zone interval> ] <quote>

      <interval string>    ::=   <quote> { <year-month literal> | <day-time literal> } <quote>

      <year-month literal>    ::=
             <years value>
         |     [ <years value> <minus sign> ] <months value>

      <day-time literal>    ::=   <day-time interval> | <time interval>

      <day-time interval>    ::=
             <days value> [ <space> <hours value> [ <colon> <minutes value> [ <colon> <seconds value> ] ] ]

      <time-interval>    ::=
             <hours value> [ <colon> <minutes value> [ <colon> <seconds value> ] ]
         |     <minutes value> [ <colon> <seconds value> ]
         |     <seconds value>

      <not equals operator>    ::=   <>

      <greater than or equals operator>    ::=   >=

      <less than or equals operator>    ::=   <=

      <concatenation operator>    ::=   ||

      <double period>    ::=   ..

    Top


    SQL Module

      <module>    ::=
             <module name clause> <language clause> <module authorization clause>
             [ <temporary table declaration> ... ]
             <module contents> ...

      <module name clause>    ::=
             MODULE [ <module name> ] [ <module character set specification> ]

      <module name>    ::=   <identifier>

      <module character set specification>    ::=   NAMES ARE <character set specification>

      <language clause>    ::=   LANGUAGE <language name>

      <language name>    ::=   ADA | C | COBOL | FORTRAN | MUMPS | PASCAL | PLI

      <module authorization clause>    ::=
             SCHEMA <schema name>
         |     AUTHORIZATION <module authorization identifier>
         |     SCHEMA <schema name> AUTHORIZATION <module authorization identifier>

      <module authorization identifier>    ::=   <authorization identifier>

      <authorization identifier>    ::=   <identifier>

      <temporary table declaration>    ::=
         DECLARE LOCAL TEMPORARY TABLE <qualified local table name> <table element list> [ ON COMMIT { PRESERVE | DELETE } ROWS ]

      <qualified local table name>    ::=   MODULE <period> <local table name>

      <local table name>    ::=   <qualified identifier>

      <qualified identifier>    ::=   <identifier>

      <table element list>    ::=   <left paren> <table element> [ { <comma> <table element> }... ] <right paren>

      <table element>    ::=   <column definition> | <table constraint definition>

      <column definition>    ::=
             <column name> { <data type> | <domain name> } [ <default clause> ] [ <column constraint definition> ... ] [ <collate clause> ]

      <column name>    ::=   <identifier>

    Top


    Data Types

      <data type>    ::=
             <character string type> [ CHARACTER SET <character set specification> ]
         |     <national character string type>
         |     <bit string type>
         |     <numeric type>
         |     <datetime type>
         |     <interval type>

      <character string type>    ::=
             CHARACTER [ <left paren> <length> <right paren> ]
         |     CHAR [ <left paren> <length> <right paren> ]
         |     CHARACTER VARYING [ <left paren> <length> <right paren> ]
         |     CHAR VARYING [ <left paren> <length> <right paren> ]
         |     VARCHAR [ <left paren> <length> <right paren> ]

      <length>    ::=   <unsigned integer>

      <national character string type>    ::=
             NATIONAL CHARACTER [ <left paren> <length> <right paren> ]
         |     NATIONAL CHAR [ <left paren> <length> <right paren> ]
         |     NCHAR [ <left paren> <length> <right paren> ]
         |     NATIONAL CHARACTER VARYING [ <left paren> <length> <right paren> ]
         |     NATIONAL CHAR VARYING [ <left paren> <length> <right paren> ]
         |     NCHAR VARYING [ <left paren> <length> <right paren> ]

      <bit string type>    ::=
             BIT [ <left paren> <length> <right paren> ]
         |     BIT VARYING [ <left paren> <length> <right paren> ]

      <numeric type>    ::=
             <exact numeric type>
         |     <approximate numeric type>

      <exact numeric type>    ::=
             NUMERIC [ <left paren> <precision> [ <comma> <scale> ] <right paren> ]
         |     DECIMAL [ <left paren> <precision> [ <comma> <scale> ] <right paren> ]
         |     DEC [ <left paren> <precision> [ <comma> <scale> ] <right paren> ]
         |     INTEGER
         |     INT
         |     SMALLINT

      <precision>    ::=   <unsigned integer>

      <scale>    ::=   <unsigned integer>

      <approximate numeric type>    ::=
             FLOAT [ <left paren> <precision <right paren> ]
         |     REAL
         |     DOUBLE PRECISION

      <datetime type>    ::=
             DATE
         | TIME [ <left paren> <time precision> <right paren> ] [ WITH TIME ZONE ]
         | TIMESTAMP [ <left paren> <timestamp precision> <right paren> ] [ WITH TIME ZONE ]

      <time precision>    ::=   <time fractional seconds precision>

      <time fractional seconds precision>    ::=   <unsigned integer>

      <timestamp precision>    ::=   <time fractional seconds precision>

      <interval type>    ::=   INTERVAL <interval qualifier>

      <interval qualifier>    ::=
             <start field> TO <end field>
         | <single datetime field>

      <start field>    ::=
             <non-second datetime field> [ <left paren> <interval leading field precision> <right paren> ]

      <non-second datetime field>    ::=   YEAR | MONTH | DAY | HOUR | MINUTE

      <interval leading field precision>    ::=   <unsigned integer>

      <end field>    ::=
             <non-second datetime field>
         | SECOND [ <left paren> <interval fractional seconds precision> <right paren> ]

      <interval fractional seconds precision>    ::=   <unsigned integer>

      <single datetime field>    ::=
             <non-second datetime field> [ <left paren> <interval leading field precision> <right paren> ]
         | SECOND [ <left paren> <interval leading field precision> [ <comma> <left paren> <interval fractional seconds precision> ] <right paren> ]

      <domain name>    ::=   <qualified name>

      <qualified name>    ::=   [ <schema name> <period> ] <qualified identifier>

      <default clause>    ::=   DEFAULT <default option>

      <default option>    ::=
             <literal>
         |     <datetime value function>
         |     USER
         |     CURRENT_USER
         |     SESSION_USER
         |     SYSTEM_USER
         |     NULL

    Top


    Literals

      <literal>    ::=   <signed numeric literal> | <general literal>

      <signed numeric literal>    ::=   [ <sign> ] <unsigned numeric literal>

      <general literal>    ::=
             <character string literal>
         |     <national character string literal>
         |     <bit string literal>
         |     <hex string literal>
         |     <datetime literal>
         |     <interval literal>

      <datetime literal>    ::=
             <date literal>
         |     <time literal>
         |     <timestamp literal>

      <date literal>    ::=   DATE <date string>

      <time literal>    ::=   TIME <time string>

      <timestamp literal>    ::=   TIMESTAMP <timestamp string>

      <interval literal>    ::=   INTERVAL [ <sign> ] <interval string> <interval qualifier>

      <datetime value function>    ::=
             <current date value function>
         |     <current time value function>
         |     <current timestamp value function>

      <current date value function>    ::=   CURRENT_DATE

      <current time value function>    ::=   CURRENT_TIME [ <left paren> <time precision> <right paren> ]

      <current timestamp value function>    ::=   CURRENT_TIMESTAMP [ <left paren> <timestamp precision> <right paren> ]

    Top


    Constraints

      <column constraint definition>    ::=
             [ <constraint name definition> ] <column constraint> [ <constraint attributes> ]

      <constraint name definition>    ::=   CONSTRAINT <constraint name>

      <constraint name>    ::=   <qualified name>

      <column constraint>    ::=
             NOT NULL
         |     <unique specification>
         |     <references specification>
         |     <check constraint definition>

      <unique specification>    ::=   UNIQUE | PRIMARY KEY

      <references specification>    ::=
             REFERENCES <referenced table and columns> [ MATCH <match type> ] [ <referential triggered action> ]

      <referenced table and columns>    ::=   <table name> [ <left paren> <reference column list> <right paren> ]

      <table name>    ::=   <qualified name> | <qualified local table name>

      <reference column list>    ::=   <column name list>

      <column name list>    ::=   <column name> [ { <comma> <column name> }... ]

      <match type>    ::=   FULL | PARTIAL

      <referential triggered action>    ::=
             <update rule> [ <delete rule> ]
         |     <delete rule> [ <update rule> ]

      <update rule>    ::=   ON UPDATE <referential action>

      <referential action>    ::=   CASCADE | SET NULL | SET DEFAULT | NO ACTION

      <delete rule>    ::=   ON DELETE <referential action>

      <check constraint definition>    ::=   CHECK <left paren> <search condition> <right paren>

    Top


    Search Condition

      <search condition>    ::=
             <boolean term>
         | <search condition> OR <boolean term>

      <boolean term>    ::=
             <boolean factor>
         | <boolean term> AND <boolean factor>

      <boolean factor>    ::=   [ NOT ] <boolean test>

      <boolean test>    ::=   <boolean primary> [ IS [ NOT ] <truth value> ]

      <boolean primary>    ::=   <predicate> | <left paren> <search condition> <right paren>

      <predicate>    ::=
             <comparison predicate>
         | <between predicate>
         | <in predicate>
         | <like predicate>
         | <null predicate>
         | <quantified comparison predicate>
         | <exists predicate>
         | <match predicate>
         | <overlaps predicate>

      <comparison predicate>    ::=   <row value constructor> <comp op> <row value constructor>

      <row value constructor>    ::=
             <row value constructor element>
         | <left paren> <row value constructor list> <right paren>
         | <row subquery>

      <row value constructor element>    ::=
             <value expression>
         | <null specification>
         | <default specification>

      <value expression>    ::=
             <numeric value expression>
         | <string value expression>
         | <datetime value expression>
         | <interval value expression>

      <numeric value expression>    ::=
             <term>
         | <numeric value expression> <plus sign> <term>
         | <numeric value expression> <minus sign> <term>

      <term>    ::=
             <factor>
         | <term> <asterisk> <factor>
         | <term> <solidus> <factor>

      <factor>    ::=   [ <sign> ] <numeric primary>

      <numeric primary>    ::=   <value expression primary> | <numeric value function>

      <value expression primary>    ::=
             <unsigned value specification>
         | <column reference>
         | <set function specification>
         | <scalar subquery>
         | <case expression>
         | <left paren> <value expression> <right paren>
         | <cast specification>

      <unsigned value specification>    ::=   <unsigned literal> | <general value specification>

      <unsigned literal>    ::=   <unsigned numeric literal> | <general literal>

      <general value specification>    ::=
             <parameter specification>
         | <dynamic parameter specification>
         | <variable specification>
         | USER
         | CURRENT_USER
         | SESSION_USER
         | SYSTEM_USER
         | VALUE

      <parameter specification>    ::=   <parameter name> [ <indicator parameter> ]

      <parameter name>    ::=   <colon> <identifier>

      <indicator parameter>    ::=   [ INDICATOR ] <parameter name>

      <dynamic parameter specification>    ::=   <question mark>

      <variable specification>    ::=   <embedded variable name> [ <indicator variable> ]

      <embedded variable name>    ::=   <colon> <host identifier>

      <host identifier>    ::=
             <Ada host identifier>
         |     <C host identifier>
         |     <Cobol host identifier>
         |     <Fortran host identifier>
         |     <MUMPS host identifier>
         |     <Pascal host identifier>
         |     <PL/I host identifier>

      <Ada host identifier>    ::=   !! See syntax rules

      <C host identifier>    ::=   !! See syntax rules

      <Cobol host identifier>    ::=   !! See syntax rules

      <Fortran host identifier>    ::=   !! See syntax rules

      <MUMPS host identifier>    ::=   !! See syntax rules

      <Pascal host identifier>    ::=   !! See syntax rules

      <PL/I host identifier>    ::=   !! See syntax rules

      <indicator variable>    ::=   [ INDICATOR ] <embedded variable name>

      <column reference>    ::=   [ <qualifier> <period> ] <column name>

      <qualifier>    ::=   <table name> | <correlation name>

      <correlation name>    ::=   <identifier>

      <set function specification>    ::=
             COUNT <left paren> <asterisk> <right paren>
         | <general set function>

      <general set function>    ::=
             <set function type> <left paren> [ <set quantifier> ] <value expression> <right paren>

      <set function type>    ::=   AVG | MAX | MIN | SUM | COUNT

      <set quantifier>    ::=   DISTINCT | ALL

    Top


    Queries

      <scalar subquery>    ::=   <subquery>

      <subquery>    ::=   <left paren> <query expression> <right paren>

      <query expression>    ::=   <non-join query expression> | <joined table>

      <non-join query expression>    ::=
             <non-join query term>
         |     <query expression> UNION [ ALL ] [ <corresponding spec> ] <query term>
         |     <query expression> EXCEPT [ ALL ] [ <corresponding spec> ] <query term>

      <non-join query term>    ::=
             <non-join query primary>
         |     <query term> INTERSECT [ ALL ] [ <corresponding spec> ] <query primary>

      <non-join query primary>    ::=   <simple table> | <left paren> <non-join query expression> <right paren>

      <simple table>    ::=
             <query specification>
         |     <table value constructor>
         |     <explicit table>

      <query specification>    ::=
             SELECT [ <set quantifier> ] <select list> <table expression>

      <select list>    ::=
             <asterisk>
         |     <select sublist> [ { <comma> <select sublist> }... ]

      <select sublist>    ::=   <derived column> | <qualifier> <period> <asterisk>

      <derived column>    ::=   <value expression> [ <as clause> ]

      <as clause>    ::=   [ AS ] <column name>

      <table expression>    ::=
             <from clause>
             [ <where clause> ]
             [ <group by clause> ]
             [ <having clause> ]

      <from clause>    ::=   FROM <table reference> [ { <comma> <table reference> }... ] Note that <correlation specification> does not appear in the ISO/IEC grammar. The notation is written out longhand several times, instead.

      <table reference>    ::=
             <table name> [ <correlation specification> ]
         | <derived table> <correlation specification>
         | <joined table>

      <correlation specification>    ::=
             [ AS ] <correlation name> [ <left paren> <derived column list> <right paren> ]

      <derived column list>    ::=   <column name list>

      <derived table>    ::=   <table subquery>

      <table subquery>    ::=   <subquery>

      <joined table>    ::=
             <cross join>
         | <qualified join>
         | <left paren> <joined table> <right paren>

      <cross join>    ::=
             <table reference> CROSS JOIN <table reference>

      <qualified join>    ::=
             <table reference> [ NATURAL ] [ <join type> ] JOIN <table reference> [ <join specification> ]

      <join type>    ::=
             INNER
         | <outer join type> [ OUTER ]
         | UNION

      <outer join type>    ::=   LEFT | RIGHT | FULL

      <join specification>    ::=   <join condition> | <named columns join>

      <join condition>    ::=   ON <search condition>

      <named columns join>    ::=   USING <left paren> <join column list> <right paren>

      <join column list>    ::=   <column name list>

      <where clause>    ::=   WHERE <search condition>

      <group by clause>    ::=   GROUP BY <grouping column reference list>

      <grouping column reference list>    ::=
             <grouping column reference> [ { <comma> <grouping column reference> }... ]

      <grouping column reference>    ::=   <column reference> [ <collate clause> ]

      <collate clause>    ::=   COLLATE <collation name>

      <collation name>    ::=   <qualified name>

      <having clause>    ::=   HAVING <search condition>

      <table value constructor>    ::=   VALUES <table value constructor list>

      <table value constructor list>    ::=   <row value constructor> [ { <comma> <row value constructor> }... ]

      <explicit table>    ::=   TABLE <table name>

      <query term>    ::=   <non-join query term> | <joined table>

      <corresponding spec>    ::=   CORRESPONDING [ BY <left paren> <corresponding column list> <right paren> ]

      <corresponding column list>    ::=   <column name list>

      <query primary>    ::=   <non-join query primary> | <joined table>

    Top


    Query expression components

      <case expresssion>    ::=   <case abbreviation> | <case specification>

      <case abbreviation>    ::=
             NULLIF <left paren> <value expression> <comma> <value expression> <right paren>
         |     COALESCE <left paren> <value expression> { <comma> <value expression> }... <right paren>

      <case specification>    ::=   <simple case> | <searched case>

      <simple case>    ::=
             CASE <case operand>
                 <simple when clause> ...
                 [ <else clause> ]
             END

      <case operand>    ::=   <value expression>

      <simple when clause>    ::=   WHEN <when operand> THEN <result>

      <when operand>    ::=   <value expression>

      <result>    ::=   <result expression> | NULL

      <result expression>    ::=   <value expression>

      <else clause>    ::=   ELSE <result>

      <searched case>    ::=
             CASE
             <searched when clause> ...
             [ <else clause> ]
             END

      <searched when clause>    ::=   WHEN <search condition> THEN <result>

      <cast specification>    ::=   CAST <left paren> <cast operand> AS <cast target> <right paren>

      <cast operand>    ::=   <value expression> | NULL

      <cast target>    ::=   <domain name> | <type name>

      <numeric value function>    ::=   <position expression> | <extract expression> |     <length expression>

      <position expression>    ::=
         POSITION <left paren> <character value expression> IN <character value expression> <right paren>

      <character value expression>    ::=   <concatenation> | <character factor>

      <concatenation>    ::=   <character value expression> <concatenation operator> <character factor>

      <character factor>    ::=   <character primary> [ <collate clause> ]

      <character primary>    ::=   <value expression primary> | <string value function>

      <string value function>    ::=   <character value function> | <bit value function>

      <character value function>    ::=
             <character substring function>
         | <fold>
         | <form-of-use conversion>
         | <character translation>
         | <trim function>

      <character substring function>    ::=
             SUBSTRING <left paren> <character value expression> FROM <start position> [ FOR <string length> ] <right paren>

      <start position>    ::=   <numeric value expression>

      <string length>    ::=   <numeric value expression>

      <fold>    ::=   { UPPER | LOWER } <left paren> <character value expression> <right paren>

      <form-of-use conversion>    ::=
             CONVERT <left paren> <character value expression> USING <form-of-use conversion name> <right paren>

      <form-of-use conversion name>    ::=   <qualified name>

      <character translation>    ::=
             TRANSLATE <left paren> <character value expression> USING <translation name> <right paren>

      <translation name>    ::=   <qualified name>

      <trim function>    ::=   TRIM <left paren> <trim operands> <right paren>

      <trim operands>    ::=   [ [ <trim specification> ] [ <trim character> ] FROM ] <trim source>

      <trim specification>    ::=   LEADING | TRAILING | BOTH

      <trim character>    ::=   <character value expression>

      <trim source>    ::=   <character value expression>

      <bit value function>    ::=   <bit substring function>

      <bit substring function>    ::=
             SUBSTRING <left paren> <bit value expression> FROM <start position> [ FOR <string length> ] <right paren>

      <bit value expression>    ::=   <bit concatenation> | <bit factor>

      <bit concatenation>    ::=   <bit value expression> <concatenation operator> <bit factor>

      <bit factor>    ::=   <bit primary>

      <bit primary>    ::=   <value expression primary> | <string value function>

      <extract expression>    ::=   EXTRACT <left paren> <extract field> FROM <extract source> <right paren>

      <extract field>    ::=   <datetime field> | <time zone field>

      <datetime field>    ::=   <non-second datetime field> | SECOND

      <time zone field>    ::=   TIMEZONE_HOUR | TIMEZONE_MINUTE

      <extract source>    ::=   <datetime value expression> | <interval value expression>

      <datetime value expression>    ::=
             <datetime term>
         |     <interval value expression> <plus sign> <datetime term>
         |     <datetime value expression> <plus sign> <interval term>
         |     <datetime value expression> <minus sign> <interval term>

      <interval term>    ::=
             <interval factor>
         |     <interval term 2> <aste