SQL-объединения
Объединения определяют, как связываются несколько таблиц в запросе. Существует три типа объединений.
• Left Outer (Левое внешнее)
• Right Outer (Правое внешнее)
• Inner (Внутреннее)
Операция объединения соединяет все строки одной таблицы со строками другой таблицы. Объединения обычно сопровождаются условием, которое определяет какая запись на каждой стороне объединения появится в RecordSet.
Left Outer (Левое внешнее объединение). Это объединение отображает все записи из левой таблицы и только те записи правой таблицы, которые удовлетворяют задаваемым пользователем критериям. Это объединение имеет следующий синтаксис.
FROM (первичная таблица) LEFT JOIN (вторичная таблица) ON
(первичная таблица).(поле) (сравнение) (вторичная таблица).(поле)
В левом внешнем объединении всем записям в первичной таблице поставлены в соответствие записи из вторичной таблицы, отвечающие заданным критериям. Записи из левой таблицы (имя которой указано слева от ключевого слова LEFT JOIN) включаются даже тогда, если для них нет соответствующих записей во вторичной таблице.
Right Outer (Правое внешнее объединение). Это объединение подобно левому внешнему объединению, но в данном случае отображаются все записи правой таблицы и соответствующие критерию записи левой таблицы. Это объединение имеет следующий синтаксис.
FROM (вторичная таблица) RIGHT JOIN (первичная таблица) ON
(вторичная таблица).(поле) (сравнение) (первичная таблица).(поле)
В правом внешнем объединении всем записям в первичной таблице поставлены в соответствие отвечающие заданным критериям записи вторичной таблицы. Записи первичной таблицы включаются даже тогда, если для них нет соответствующих записей во вторичной таблице.
Внешние объединения возвращают огромные наборы записей. Поэтому необходимо избегать их использования без особой необходимости. С другой стороны, внутренние объединения просты и с ними строят большинство команд SQL.
Inner (Внутреннее объединение). Это объединение возвращает строки обеих таблиц включаемых в операцию, которые соответствуют заданным критериям. Внутреннее объединение имеет следующий синтаксис.
FROM (первичная таблица) INNER JOIN (вторичная таблица) ON
(первичная таблица).(поле) (сравнение) (вторичная таблица).(поле)
Рассмотрим подробнее несколько примеров. В простейшем виде внутренние объединения похожи на предложения WHERE. Следующий SQL-оператор объединяет записи из таблиц Titles и Publishers базы данных BIBLIO, если у них совпадают поля PubID. Она возвращает набор записей с именами всех книг и их издателей.
SELECT Titles.Title, Publishers.Name FROM Titles, Publishers
WHERE Titles.PubID = Publishers.PubID
Можно получить такой же RecordSet, используя внутреннее объединение.
SELECT Titles.Title, Publishers.Name FROM Titles, Publishers,
INNER JOIN Titles ON Titles.PubID = Publishers.PubID
Результаты работы этой команды показаны ниже.
Рассмотрим более сложную операцию объединения. На этот раз необходимо получить из базы данных BIBLIO все названия изданий наряду с их авторами и издателями. Следующее утверждение действительно сложно и отражает реальную ситуацию.
SELECT Titles.Title, Titles.ISBN, Authors.Author,
Titles.[Year.Published], Publishers.[Company Name] FROM
(([title author] INNER JOIN Titles ON
[title author].ISBN = Titles.ISBN) INNER JOIN Authors ON
[title author].Au ID = Authors.Au ID) INNER JOIN Publishers ON
Titles.PubID = Publishers.PubID ORDER BY Titles.Title
Результаты работы команды показаны ниже.
В предыдущей команде в квадратные скобки заключены имена полей, которые содержат пробелы. Все имена полей предваряются соответствующим именем таблицы (хотя большинство имен полей уникально), чтобы сделать команду более легкой для чтения.
В списке полей устанавливаются следующие поля:
• Titles.TitIe - название книги;
• Titles.ISBN - ISBN код книги;
• Authors.Author — автор книги;
• Titles.[Year Published] — год публикации книги;
• Publishers. [Company Name] — издатель книги.
Вы, возможно, помните, что база данных BIBLIO содержит четыре таблицы, а наш запрос требует данных из всех таблиц Фактически, никакие данные из таблицы Title Author в результатах запроса не отображаются, но эта таблица связывает названия и имена авторов (через ISBN код книги), поэтому ее необходимо использовать в SQL-запросе.
Поля не выбираются из каждой конкретной таблицы непосредственно. Их получают из ряда внутренних объединений. Первое внутреннее объединение следующее.
[title author] INNER JOIN Titles ON [title author].ISBN =
Titles.ISBN
Это выражение извлекает (и соединяет) каждое название издания с иден тификатором его автора, если ISBN код в обеих таблицах совпадает. В сущности, будет получен идентификатор автора для каждого издания. Назовем это выражение (которое является объектом RecordSet) Title-AuthorIDs. Этот RecordSet помещен в круглые скобки и соединен с другим RecordSet.
(Title-AuthorIDs) INNER JOIN Authors ON [title author].Au_ID =
Authors Au ID
Этот RecordSet соединяет идентификаторы авторов предыдущего RecordSet с фактическими именами авторов. Мы создали RecordSet с именами авторов и названиями изданий. Назовем его Titles-Author. Последняя операция объединения соединяет RecordSet, который содержит имена авторов и изданий, с таблицей Publishers следующим образом.
(Titles-Author) INNER JOIN Publishers ON Titles.PubID =
Publishers.PubID
На этот раз идентификаторы издателей должны совпадать. Результирующий RecordSet содержит названия изданий, авторов и издателей и является источником данных. Последнее ключевое слово в этой SQL-команде — ORDER BY — задает порядок отображения заказов.