Внутреннее соединение
Внутреннее соединение двух таблиц в реляционной базе данных строится на основе отношения "один-ко-многим". Примером может служить демонстрационная база данных "Борей" (Northwind), в которой все соединения являются внутренними и осуществляются по одному полю.
Основные правила при проектировании соединений
Если в вашей базе данных предполагается использование внутренних соединений, следуйте следующим рекомендациям:
- Каждая таблица на стороне "один" должна иметь первичный ключ с уникальными значениями. В Microsoft Access повторения значений первичного ключа автоматически запрещены.
- Отношение "многие-ко-многим" реализуйте через промежуточную таблицу, которая будет связана с двумя основными таблицами отношениями "многие-к-одному". В этой схеме промежуточная таблица будет находиться со стороны "многие" в обеих связях.
- Если в одной таблице есть повторяющиеся данные, перенесите их в отдельную таблицу и свяжите с исходной отношением "многие-к-одному". Это позволит однозначно идентифицировать данные. Часто в таких случаях используется составной первичный ключ. Для упрощения процесса можно воспользоваться Мастером по анализу таблиц (Table Analyzer), который запускается через команду меню Сервис → Анализ → Таблица (Tools, Analysis, Table).
Пример использования внутреннего соединения
Рассмотрим создание запроса, который выводит информацию о товарах, их поставщиках, единицах измерения и ценах в базе данных "Борей" (Northwind).
- Закройте все окна, кроме окна База данных (Database). Если база данных не загружена, откройте её.
- Щёлкните по вкладке Запросы (Queries) и нажмите кнопку Создать (New).
- В появившемся диалоговом окне Новый запрос (New Query) выберите Конструктор (Design View) и нажмите ОК. Откроется окно Добавление таблицы (Show Table).
- Добавьте таблицу "Поставщики" (Suppliers). Access покажет список её полей в верхней панели окна запроса.
- Добавьте таблицу "Товары" (Products) и закройте окно Добавление таблицы.
Access автоматически создаст соединение по полю "КодПоставщика" (SupplierID) (рис. 4.20). Это соединение является внутренним и основано на том, что в таблице "Поставщики" это поле является первичным ключом, а в таблице "Товары" — внешним ключом.
Рис. 4.20. Окно Конструктора запроса с соединением таблиц
Заполнение бланка запроса
После добавления таблиц в запрос выберите нужные поля:
- Выберите поле "Марка" (ProductName) из таблицы "Товары" (Products) и перетащите его в строку Поле (Field) первого столбца бланка запроса.
- Выберите поле "Название" (CompanyName) из таблицы "Поставщики" (Suppliers) и перетащите его во второй столбец.
- Перетащите поле "ЕдиницаИзмерения" (QuantityPerUnit) из таблицы "Товары" в третий столбец.
- Перетащите поле "Цена" (UnitPrice) из таблицы "Товары" в четвёртый столбец бланка запроса (рис. 4.21).
Рис. 4.21. Бланк запроса с заполненными полями
Запуск запроса и просмотр результатов
Чтобы выполнить запрос, нажмите кнопку Запуск (Run) или выберите Режим таблицы (Datasheet View) на панели инструментов. В результате появится таблица с выбранными полями (рис. 4.22).
Рис. 4.22. Результат выполнения запроса
Изменение порядка сортировки
По умолчанию записи в результирующем множестве сортируются по значению первичного ключа. Чтобы отсортировать данные, например, по убывающей цене товара, выполните следующие действия:
- Переключитесь в Конструктор запросов.
- Установите курсор в поле Сортировка (Sort) столбца "Цена".
- Нажмите клавишу <F4> или щёлкните на стрелке справа, чтобы отобразить список.
- Выберите по убыванию (Descending).
- Нажмите кнопку Запуск (Run) для отображения результата запроса (рис. 4.23).
Рис. 4.23. Запрос с сортировкой по убывающей цене товара
Соединение косвенно связанных таблиц
Запросы могут объединять несколько таблиц, образующих цепочку соединений. В этом случае можно выбрать поля как из всех таблиц, так и только из тех, что находятся на концах цепочки. Например, можно создать запрос, выводящий названия стран, из которых поставляются товары клиентам.
В данном случае косвенно связанными оказываются таблицы:
- "Клиенты" (Customers)
- "Поставщики" (Suppliers)
А промежуточными являются:
- "Заказы" (Orders)
- "Заказано" (Order Details)
- "Товары" (Products)
Microsoft Access автоматически показывает связи, в том числе и промежуточные, между таблицами.
Рис. 4.24. Соединение косвенно связанных таблиц
Просмотр SQL-запроса
После добавления полей "Название" (CompanyName) из таблицы "Клиенты" и "Страна" (Country) из таблицы "Поставщики" выполните следующие шаги:
- Откройте меню Вид (View).
- Выберите пункт Режим SQL (SQL View).
Вы увидите инструкцию SQL, соответствующую данному запросу (рис. 4.25). Соединения таблиц задаются операцией:
INNER JOIN ... ON ... ON ...
Рис. 4.25. Эквивалентная SQL-инструкция
Такие запросы широко используются при анализе данных с применением статистических функций SQL или перекрёстных запросов Access.
Подробнее о языке SQL и создании сложных запросов см. в разделе "Создание запросов SQL" в главе 8.