Создание приложений для работы с базами данных в сети____________553

пробелом. Например, приведенный выше оператор может быть переписан следую-
щим образом:

Select P.* from Pers P, Dep D WHERE (P.Dep=D.Dep)AND(D.Proisv=true)

В этом примере таблице Pers дан псевдоним P, а таблице Dep — D. Конечно,
эти псевдонимы действуют только в данном операторе и не имеют никакого отно-
шения к псевдонимам баз данных, которые мы постоянно используем.

Возможно самообъединение таблицы. В этом случае одной таблице даются два
псевдонима. Пусть, например, мы хотим найти всех ровесников в организации.
Это можно сделать оператором

Select pi.fam, р2.fam, pl.year b FROM Pers pi, Pers p2

WHERE (pl.year_b = p2.year_b) AND (pi.fam != p2.fam)

В этом примере для таблицы Pers мы ввели два псевдонима: р1 и p2. В конст-
рукции WHERE мы ищем в этих якобы разных таблицах записи с одинаковым го-
дом рождения. Второе условие pl.fam != p2.fam нужно, чтобы сотрудник не ото-
бражался в результатах как ровесник сам себя. Правда, приведенный оператор вы-
дает в результате по две записи на каждую пару ровесников, сначала, например,
«Николаев — Андреев», а потом «Андреев — Николаев». Чтобы исключить такое
дублирование можно добавить еще одно условие — pl.Fam < p2.Fam:

Select pl.fam, p2.fam, pl.year_b FROM Pers pi, Pers p2
WHERE (pl.year_b = p2.year_b) AND

(pl.fam != p2.fam)and(pi.Fam < p2.Fam)

Дополнительное условие упорядочивает появление фамилий в р1 и p2 и иск-
лючает дублирование результатов.

До сих пор мы рассматривали объединения, основанные на однозначном соот-
ветствии записей двух таблиц, когда каждой записи в первой таблице находилась
соответствующая ей запись во второй таблице. Возможны и другие виды объедине-
ний, которые выдают записи независимо от того, есть ли соответствующее поле во
второй таблице. Это внешние объединения (outer join). Их три типа: левое, правое и
полное. Левое объединение (обозначается ключевыми словами LEFT OUTER JOIN
... ON) включает в результат все записи первой таблицы, даже те, для которых не
имеется соответствия во второй. Правое объединение (обозначается ключевыми
словами RIGHT OUTER JOIN ... ON) включает в результат все записи второй таб-
лицы, даже если им нет соответствия в записях первой. Полное объединение (обо-
значается ключевыми словами FULL OUTER JOIN ... ON) включает в результат
объединение записей обеих таблиц, независимо от их соответствия.

Пусть, например, у вас есть таблица сотрудников некоей компании Pers и есть
таблица Chef, в которой занесены данные на членов совета директоров этой компа-
нии. В число членов совета входят и сотрудники компании, и посторонние лица.
Для определенности положим, что в таблице Pers имеются записи на сотрудников
«Иванов» и «Петров», причем Петров является членом совета, а Иванов — нет. В
таблице Chef имеются записи на членов совета «Петров» и «Сидоров», причем Си-
доров — не сотрудник компании. Тогда оператор

Select * FROM Pers LEFT OUTER JOIN Chef ON Pers.Fam = Chef.Fam

выдаст результат вида:

[————————————— Поля таблицы Pers		Поля таблицы Chef
Иванов		,1
Петров		Петров 1...............