diff --git a/doc/src/sgml/query.sgml b/doc/src/sgml/query.sgml
index e73e805ec4..413763691e 100644
--- a/doc/src/sgml/query.sgml
+++ b/doc/src/sgml/query.sgml
@@ -441,11 +441,11 @@ SELECT DISTINCT city
Thus far, our queries have only accessed one table at a time.
Queries can access multiple tables at once, or access the same
- table in such a way that multiple rows of the table are being
- processed at the same time. A query that accesses multiple rows
- of the same or different tables at one time is called a
- join query. As an example, say you wish to
- list all the weather records together with the location of the
+ table several times. Such queries — they are called
+ join queries — combine
+ rows of one table in some way with rows of the other table
+ and return a single row per combination. An example may be a
+ list of all the weather records together with the location of the
associated city. To do that, we need to compare the city
column of each row of the weather table with the
name column of all rows in the cities
@@ -461,10 +461,17 @@ SELECT DISTINCT city
SELECT *
- FROM weather, cities
- WHERE city = name;
+FROM weather
+JOIN cities ON (city = name);
+ The keyword JOIN connects the two tables.
+ Behind the keyword ON follows the
+ definition how to compare their rows. In this case, the
+ column city of table weather
+ must be equal to the column name
+ of table cities.
+
city | temp_lo | temp_hi | prcp | date | name | location
---------------+---------+---------+------+------------+---------------+-----------
@@ -476,8 +483,14 @@ SELECT *
- Observe two things about the result set:
+ Observe some things about the result set:
+
+
+ The resulting rows contain values from both tables.
+
+
+
There is no result row for the city of Hayward. This is
@@ -499,23 +512,14 @@ SELECT *
*:
SELECT city, temp_lo, temp_hi, prcp, date, location
- FROM weather, cities
- WHERE city = name;
+FROM weather
+JOIN cities ON (city = name);
-
- Exercise:
-
-
- Attempt to determine the semantics of this query when the
- WHERE clause is omitted.
-
-
-
Since the columns all had different names, the parser
automatically found which table they belong to. If there
@@ -526,8 +530,8 @@ SELECT city, temp_lo, temp_hi, prcp, date, location
SELECT weather.city, weather.temp_lo, weather.temp_hi,
weather.prcp, weather.date, cities.location
- FROM weather, cities
- WHERE cities.name = weather.city;
+FROM weather
+JOIN cities ON (cities.name = weather.city);
It is widely considered good style to qualify all column names
@@ -537,15 +541,18 @@ SELECT weather.city, weather.temp_lo, weather.temp_hi,
Join queries of the kind seen thus far can also be written in this
- alternative form:
+ form:
SELECT *
- FROM weather INNER JOIN cities ON (weather.city = cities.name);
+FROM weather, cities
+WHERE weather.city = cities.name;
- This syntax is not as commonly used as the one above, but we show
- it here to help you understand the following topics.
+ This syntax is mainly used in legacy applications. It dates back
+ to the first days of SQL, avoids the JOIN
+ keyword, and uses the WHERE clause instead of the
+ ON clause.
joinouter
@@ -558,7 +565,7 @@ SELECT *
found we want some empty values
to be substituted
for the cities table's columns. This kind
of query is called an outer join. (The
- joins we have seen so far are inner joins.) The command looks
+ joins we have seen so far are inner joins.) The command looks
like this:
@@ -593,10 +600,9 @@ SELECT *
+ joinself
+ aliasfor table name in query
- joinself
- aliasfor table name in query
-
We can also join a table against itself. This is called a
self join. As an example, suppose we wish
to find all the weather records that are in the temperature range
@@ -610,10 +616,10 @@ SELECT *
SELECT w1.city, w1.temp_lo AS low, w1.temp_hi AS high,
- w2.city, w2.temp_lo AS low, w2.temp_hi AS high
- FROM weather w1, weather w2
- WHERE w1.temp_lo < w2.temp_lo
- AND w1.temp_hi > w2.temp_hi;
+ w2.city, w2.temp_lo AS low, w2.temp_hi AS high
+FROM weather w1
+JOIN weather w2 ON (w1.temp_lo < w2.temp_lo AND
+ w1.temp_hi > w2.temp_hi);
@@ -630,8 +636,8 @@ SELECT w1.city, w1.temp_lo AS low, w1.temp_hi AS high,
queries to save some typing, e.g.:
SELECT *
- FROM weather w, cities c
- WHERE w.city = c.name;
+FROM weather w
+JOIN cities c ON (w.city = c.name);
You will encounter this style of abbreviating quite frequently.