Соединение таблиц

Одна из наиболее важных черт запросов SQL состоит в их способности определять связи между множеством таблиц и отображать содержащуюся в них информацию в терминах этих связей в рамках единственной команды. Операция такого рода называется соединением. Фактически, наличие операции соединения является едва ли не самым главным, что отличает реляционные системы от систем других типов.

При операции соединения таблицы перечисляются в предложении запроса FROM; имена таблиц разделяются запятыми. Предикат запроса может ссылаться на любой столбец любой из соединяемых таблиц и, следовательно, может использоваться для установления связей между ними. Обычно предикат сравнивает значения в столбцах различных таблиц для того, чтобы определить, удовлетворяется ли условие WHERE. Во избежание двусмысленности в выборке ссылки на поля во фразе WHERE должны уточняться именами содержащих их таблиц.

Пример 35. Предположим, у нас имеется таблица aspirant, в которой содержится информация об аспирантах, в том числе место проживания.

Будем считать, что в таблице student также имеются данные о месте проживания студентов.

Необходимо установить связь между аспирантами и студентами в соответствии с местом их проживания, чтобы получить все возможные комбинации аспирантов и студентов из одного города. Для этого необходимо взять студента из таблицы student и выполнить по таблице aspirant поиск всех аспирантов, имеющих то же значение в столбце gorod:

SELECT aspirant.fam, student.fam, student.gorod FROM student, aspirant WHERE student.gorod = aspirant.gorod;

Пример 36. Операция соединения таблиц посредством ссылочной целостности применяется для использования связей, встроенных в базу данных.

Отобразим названия специальностей, на которых учатся студенты:

SELECT spec.nazv_s, student.fam FROM spec,student WHERE spec.kod_s = student.kod_s;

Пример 37. Можно конструировать запросы путем соединения более чем двух таблиц. Отобразим названия факультетов и специальностей для каждого студента:

SELECT fakultet.nazv_f, spec.nazv_s, student.fam FROM fakultet, spec,student WHERE fakultet.kod_f=spec.kod_f AND spec.kod_s = student.kod_s;

Соединение, использующее предикаты, основанные на равенствах, называется эквисоединением. Рассмотренные выше примеры относятся именно к этой категории, покольку все условия в предложении WHERE базируются на математических выражениях, использующих символ равенства. Эквисоединение является наиболее распространенным типом соединения., но существуют и другие. Фактически в соединении можно использовать любой оператор сравнения.

В некоторых, довольно часто встречающихся на практике случаях, необходимо выбрать данные из таблицы, основываясь на результатах дополнительных выборок из этой же таблицы. Такие выборки называются коррелированными. Для их выполнения используются псевдонимы таблиц (алиасные имена), которые следуют непосредственно за именем таблицы в выборке. В приведенном ниже примере используются псевдонимы таблицы student: first и second.

Пример 38. Выбрать все пары студентов, имеющих одинаковый балл:

SELECT first.fam, second.fam, first.ball FROM student first, student second WHERE first.ball = second.ball AND first.kod_stud<second.kod_stud;

В приведенном примере команда SQL ведет себя так, как будто в операции соединения участвуют две таблицы, называемые «first» и «second». Обе они в действительности являются таблицей student, но алиасы позволяют рассматривать ее как две независимые таблицы. Алиасы first и second были определены в предложении запроса FROM непосредственно за именем таблицы. Алиасы применяются также в предложении SELECT, несмотря на то, что они не определены вплоть до предложения FROM. Это совершенно оправдано. SQL сначала примет какой-либо из таких алиасов на веру, но затем отвергнет команду, если в предложении FROM запроса алиасы не определены. Время жизни алиаса зависит от времени выполнения команды. После выполнения запроса используемые в нем алиасы теряют свои значения. Получив две копии таблицы student для работы, SQL выполняет операцию JOIN, как для двух разных таблиц: выбирает очередную строку из одного алиаса и соединяет ее с каждой строкой другого алиаса. Для исключения повторений необходимо задать порядок для двух значений так, чтобы одно значение было меньше, чем другое, или предшествовало в алфавитном порядке.

Чтобы соединение возвращало данные одной таблицы даже при отсутствии соответствующей записи в другой таблице, можно создать внешнее соединение с помощью строки символов (+) в сравнении, формирующем соединение таблиц.

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

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

SELECT nazv_s,student.fam FROM student, spec WHERE student.kod_s (+)=spec.kod_s ORDER BY nazv_s;

Результат:

Nazv_s fam
Ветеринария  
Вычислительные машины, комплексы, системы и сети Канарейкин
Вычислительные машины, комплексы, системы и сети Соколов
Информационные системы и технологии Андреева
Информационные системы и технологии Асанов
Информационные системы и технологии Иванов
Информационные системы и технологии Шумаков
История Морозов
История Яковлева
Управление качеством  

Как мы видим, в выборку попали специальности 'Ветеринария' и ' Управление качеством ', на которые нет ссылки ни на одного студента в таблице student.

В начало


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: