Замечание 2. Операции соединения таблиц посредством ссылочной целостности
Лекция 7
СОЕДИНЕНИЕ ТАБЛИЦ
Соединение таблиц используется, когда необходимо определенным образом скомбинировать данные, хранящиеся в разных таблицах, в один результирующий набор.
Соединения таблиц бывают следующими:
1. ортогональные (или перекрестные, CROSS JOIN).
2. внутренние (INNER JOIN);
3. внешние (OUTER JOIN);
Ортогональные объединения
Если в операторе SELECT после ключевого слова FROM указывается не одна, а две таблицы, то в результате выполнения запроса, в котором отсутствует предложение WHERE, каждая строка одной таблицы будет соединена с каждой строкой второй таблицы.
Пример 1.
SELECTНазвание_категории, Название_товара
FROM Категории, Товары
Такая операция называется декартовым произведением, или полным соединениемтаблиц базы данных.
Того же результата можно добиться, используя конструкцию CROSS JOIN:
SELECT К.Название_категории, Т.Название_товара
FROM Категории К CROSS JOINТовары Т
Сама по себе эта операция не имеет практического значения, более того, при ошибочном использовании она может привести к неожиданным нештатным ситуациям, так как в этом случае в ответе на запрос количество записей будет равно произведению числа записей.
Объединение таблиц имеет смысл, когда соединяются не все строки исходных таблиц, а только те, которые интересуют пользователя. Такое ограничение может быть осуществлено с помощью использования в запросе соответствующего условия в предложении WHERE.
Таким образом, SQL позволяет выводить информацию из нескольких таблиц, связывая их по значениям определенных полей.
Внутренние соединения
Рассмотрим первый вариант внутреннего соединения таблиц.
Пусть необходимо получить список категорий товаров (таблица Категории) и для каждой категории - список всех товаров, это можно сделать с помощью следующего запроса:
Пример 2.
SELECTКатегории. Название, Товары.Название
FROM Категории, Товары
WHERE Категории.ID_категории = Товары.Категория
Соединения, использующее предикаты, основанные на равенствах, называется эквисоединением.
Рассмотренный пример соединения таблиц относятся к виду так называемою внутреннего(INNER) объединения. При таком типе соединения соединяются только те строки таблиц, для которых является истинным предикат, задаваемый в предложении выполняемого запроса.
Приведем другой вариант установления связи между таблицами, предусмотренный стандартом ANSI:
SELECT <Список выборки>
FROM <Первая таблица> <тип оператора JOIN > <Вторая таблица>
ON <Условия соединения>
Теперь приведенный выше запрос может быть записан иначе, с использованием ключевого слова JOIN:
Пример 3.
SELECTКатегории. Название, Товары.Название
FROM Категории INNER JOIN Товары
ON Категории.ID_категории = Товары. Категория;
Ключевое слово INNER в запросе может быть опущено, т.к. эта опция в операторе JOIN действует по умолчанию.
Команда в примере 2 создает стандартное ортогональное объединение таблиц Категории и Товары с применением расширений T-SQL. В нем используется оператор сравнения, ограничивающий число возвращаемых записей. В результате объединяются не все записи таблиц.
Команда в примере 3 делает то же самое, но в стандарте ANSI.
внимание!
При разработке баз данных используйте объединения в стандарте ANSI.
И тот и другой подход будут работать, но компания Microsoft объявила, что в будущем поддержка расширений T-SQL будет прекращена.
Внутреннее объединение является самым распространенным видом объединений. Для установления связи используются общие ключи таблиц -первичные и внешние.
Пример 4.
SELECT *
FROM Товары AS Т INNER JOIN Продажи AS P
ON Т. ID_товара = P. Товар;
После ключевого слова ON идет выражение с условием объединения. Это условие может содержать несколько частей, объединенных операторами AND и OR.
Замечание 1. Относительно применения символа * в запросах с установлением связи
В конструкциях JOIN не рекомендуется использовать символ * вместо списка столбцов. Может оказаться, что в связанных таблицах имена столбцов совпадают, это может привести к ошибкам при проверке согласованности значений столбцов.
Замечание 2. Операции соединения таблиц посредством ссылочной целостности
Информация в таблицах Категории и Товары уже связана посредством двух ключей. В таблице Категории поле ID_категории является первичным ключом, а в таблице Товары - ссылающимся на него внешним ключом.