random();
</programlisting>
</para>
</sect1>
<sect1 id="queries-table-expressions">
<title>Table Expressions</title>
<indexterm zone="queries-table-expressions">
<primary>table expression</primary>
</indexterm>
<para>
A <firstterm>table expression</firstterm> computes a table. The
table expression contains a <literal>FROM</literal> clause that is
optionally followed by <literal>WHERE</literal>, <literal>GROUP BY</literal>, and
<literal>HAVING</literal> clauses. Trivial table expressions simply refer
to a table on disk, a so-called base table, but more complex
expressions can be used to modify or combine base tables in various
ways.
</para>
<para>
The optional <literal>WHERE</literal>, <literal>GROUP BY</literal>, and
<literal>HAVING</literal> clauses in the table expression specify a
pipeline of successive transformations performed on the table
derived in the <literal>FROM</literal> clause. All these transformations
produce a virtual table that provides the rows that are passed to
the select list to compute the output rows of the query.
</para>
<sect2 id="queries-from">
<title>The <literal>FROM</literal> Clause</title>
<para>
The <link linkend="sql-from"><literal>FROM</literal></link> clause derives a
table from one or more other tables given in a comma-separated
table reference list.
<synopsis>
FROM <replaceable>table_reference</replaceable> <optional>, <replaceable>table_reference</replaceable> <optional>, ...</optional></optional>
</synopsis>
A table reference can be a table name (possibly schema-qualified),
or a derived table such as a subquery, a <literal>JOIN</literal> construct, or
complex combinations of these. If more than one table reference is
listed in the <literal>FROM</literal> clause, the tables are cross-joined
(that is, the Cartesian product of their rows is formed; see below).
The result of the <literal>FROM</literal> list is an intermediate virtual
table that can then be subject to
transformations by the <literal>WHERE</literal>, <literal>GROUP BY</literal>,
and <literal>HAVING</literal> clauses and is finally the result of the
overall table expression.
</para>
<indexterm>
<primary>ONLY</primary>
</indexterm>
<para>
When a table reference names a table that is the parent of a
table inheritance hierarchy, the table reference produces rows of
not only that table but all of its descendant tables, unless the
key word <literal>ONLY</literal> precedes the table name. However, the
reference produces only the columns that appear in the named table
— any columns added in subtables are ignored.
</para>
<para>
Instead of writing <literal>ONLY</literal> before the table name, you can write
<literal>*</literal> after the table name to explicitly specify that descendant
tables are included. There is no real reason to use this syntax any more,
because searching descendant tables is now always the default behavior.
However, it is supported for compatibility with older releases.
</para>
<sect3 id="queries-join">
<title>Joined Tables</title>
<indexterm zone="queries-join">
<primary>join</primary>
</indexterm>
<para>
A joined table is a table derived from two other (real or
derived) tables according to the rules of the particular join
type. Inner, outer, and cross-joins are available.
The general syntax of a joined table is
<synopsis>
<replaceable>T1</replaceable> <replaceable>join_type</replaceable> <replaceable>T2</replaceable> <optional> <replaceable>join_condition</replaceable> </optional>
</synopsis>
Joins of all types can be chained together, or nested: either or
both <replaceable>T1</replaceable> and
<replaceable>T2</replaceable> can be joined tables. Parentheses
can be used around <literal>JOIN</literal> clauses to control the join
order.