</para>
<para>
Also, there is no concept of a <literal>public</literal> schema in the
SQL standard. For maximum conformance to the standard, you should
not use the <literal>public</literal> schema.
</para>
<para>
Of course, some SQL database systems might not implement schemas
at all, or provide namespace support by allowing (possibly
limited) cross-database access. If you need to work with those
systems, then maximum portability would be achieved by not using
schemas at all.
</para>
</sect2>
</sect1>
<sect1 id="ddl-inherit">
<title>Inheritance</title>
<indexterm>
<primary>inheritance</primary>
</indexterm>
<indexterm>
<primary>table</primary>
<secondary>inheritance</secondary>
</indexterm>
<para>
<productname>PostgreSQL</productname> implements table inheritance,
which can be a useful tool for database designers. (SQL:1999 and
later define a type inheritance feature, which differs in many
respects from the features described here.)
</para>
<para>
Let's start with an example: suppose we are trying to build a data
model for cities. Each state has many cities, but only one
capital. We want to be able to quickly retrieve the capital city
for any particular state. This can be done by creating two tables,
one for state capitals and one for cities that are not
capitals. However, what happens when we want to ask for data about
a city, regardless of whether it is a capital or not? The
inheritance feature can help to resolve this problem. We define the
<structname>capitals</structname> table so that it inherits from
<structname>cities</structname>:
<programlisting>
CREATE TABLE cities (
name text,
population float,
elevation int -- in feet
);
CREATE TABLE capitals (
state char(2)
) INHERITS (cities);
</programlisting>
In this case, the <structname>capitals</structname> table <firstterm>inherits</firstterm>
all the columns of its parent table, <structname>cities</structname>. State
capitals also have an extra column, <structfield>state</structfield>, that shows
their state.
</para>
<para>
In <productname>PostgreSQL</productname>, a table can inherit from
zero or more other tables, and a query can reference either all
rows of a table or all rows of a table plus all of its descendant tables.
The latter behavior is the default.
For example, the following query finds the names of all cities,
including state capitals, that are located at an elevation over
500 feet:
<programlisting>
SELECT name, elevation
FROM cities
WHERE elevation > 500;
</programlisting>
Given the sample data from the <productname>PostgreSQL</productname>
tutorial (see <xref linkend="tutorial-sql-intro"/>), this returns:
<programlisting>
name | elevation
-----------+-----------
Las Vegas | 2174
Mariposa | 1953
Madison | 845
</programlisting>
</para>
<para>
On the other hand, the following query finds all the cities that
are not state capitals and are situated at an elevation over 500 feet:
<programlisting>
SELECT name, elevation
FROM ONLY cities
WHERE elevation > 500;
name | elevation
-----------+-----------
Las Vegas | 2174
Mariposa | 1953
</programlisting>
</para>
<para>
Here the <literal>ONLY</literal> keyword indicates that the query
should apply only to <structname>cities</structname>, and not any tables
below <structname>cities</structname> in the inheritance hierarchy. Many
of the commands that we have already discussed —
<command>SELECT</command>, <command>UPDATE</command> and
<command>DELETE</command> — support the
<literal>ONLY</literal> keyword.
</para>
<para>
You can also write the table name with a trailing <literal>*</literal>
to explicitly specify that descendant tables are included:
<programlisting>
SELECT