One of the tenets of the relational model is that the attributes
of a relation are atomic. Postgres
does not have this restriction; attributes can themselves contain
sub-values that can be accessed from the query language. For
example, you can create attributes that are arrays of base
types.

Postgres allows attributes of
an instance to be defined as fixed-length or variable-length
multi-dimensional arrays. Arrays of any base type or user-defined
type can be created. To illustrate their use, we first create a
class with arrays of base types.

The above query will create a class named SAL_EMP with a
text string (name), a one-dimensional
array of int4 (pay_by_quarter), which
represents the employee's salary by quarter and a two-dimensional
array of text (schedule), which represents
the employee's weekly schedule. Now we do some INSERTSs; note that when appending to an array, we
enclose the values within braces and separate them by commas. If
you know C, this is not unlike the syntax
for initializing structures.

By default, Postgres uses
the "one-based" numbering convention for arrays -- that is, an
array of n elements starts with array[1] and ends with array[n].
Now, we can run some queries on SAL_EMP. First, we show how to
access a single element of an array at a time. This query retrieves
the names of the employees whose pay changed in the second quarter: