- •Язык запросов sql
- •Общие сведения
- •Insert - запрос на добавление;
- •Инструкция select
- •Синтаксис select
- •Расширения инструкции select в access
- •Порядок выполнения выборки
- •Управление списком выбора
- •Указание источника данных
- •Применение реляционных операторов
- •Применение булевых операторов
- •Обработка неопределенных значений
- •Сортировка данных
- •Вычисление агрегатных функций
- •Группировка данных
- •Ограничение для групп данных
- •Выборка из нескольких таблиц
- •Соединение отношений
- •Выборка из нескольких таблиц
- •Соединение отношений
- •Запрос с соединением, использующий from и where
- •Запрос с соединением join
- •Запрос с соединением, использующий from и where
- •Запрос с соединением join
- •Операции с таблицами
- •Изменение структуры таблицы
- •Удаление таблицы
- •Действия со строками
- •Вставка строк в таблицу
- •Изменение данных в таблице
- •Удаление данных из таблицы
- •Инструкция transform
- •In ("Физика", "Математика");
- •Глава 5 Работа с формами
Запрос с соединением join
Чтобы написать в Access SQL-запрос, объединяющий несколько связанных таблиц, можно воспользоваться следующим синтаксисом оператора SELECT:
SELECT selectionjist
FROM tablel
{INNER | LEFT | RIGHT) JOIN table2
ON (tablel.columnl_name = table2.column2_name)];
Здесь имеется основное ключевое слово JOIN (соединение) и вспомогательные ключевые слова, задающие способ объединения таблиц: INNER (внутреннее), LEFT (левое внешнее) или RIGHT (правое внешнее). Таким образом, возможны три варианта объединения связанных таблиц в Access: INNER JOIN, LEFT JOIN и RIGHT JOIN (при описании синтаксиса перечень возможных вариантов заключается в фигурные скобки).
При выполнении операции INNER JOIN из обеих объединяемых таблиц выбираются все строки, которые удовлетворяют заданному условию объединения. Обычно в качестве такого условия задается равенство значений ключевых полей (первичного ключа - для одной таблицы и внешнего ключа - для второй).
Результатом операции LEFT JOIN будут все строки из первой таблицы, объединенные только с теми строками из второй таблицы, которые соответствуют заданному условию. Если для какой- то записи первой таблицы нет соответствующей записи во второй таблице, такая запись будет объединена с записью, содержащей значения NULL.
Операция RIGHT JOIN, по аналогии с LEFT JOIN, возвращает выборку всех строк второй таблицы и только тех строк первой таблицы, которые соответствуют указанному условию. Если такие строки отсутствуют, они замещаются записями со значениями NULL.
Заметим, что в качестве условия объединения можно указывать как равенство, так и неравенство значений. При создании запроса Access в режиме конструктора можно задать только условие равенства, а условие неравенства задается только в режиме SQL.
Проиллюстрируем применение операции JOIN. Например, выведем список всех студентов с указанием групп, в которых они учатся. Для этого в качестве источника записей выберем таблицу tbIGroups и укажем условие объединения с таблицей tbIStudents - равенство значений полей flDGroup. Этот запрос с внутренним объединением INNER JOIN будет выглядеть так:
SELECT tbIGroups.fGroup, tbIStudents.fLastName, tbIStudents.fFiietName, tbIStudents.fMiddleName FROM tbIGroups
INNER JOIN tbIStudents ON tbIGroups.flDGroup = tbIStudents.flDGroup;
Заметим, что конструкцию с объединением INNER JOIN можно заменить на эквивалентную, с условием WHERE:
SELECT tbIGroups.fGroup, tbIStudents.fLastName, tbIStudents.fFirstName, tbIStudents.fMiddleName FROM tbIGroups, tbIStudents WHERE tbIGroups.flDGroup = tbIStudents.flDGroup;
В отличие от INNER JOIN, операции LEFT JOIN и RIGHT JOIN применяются в том случае, если из одной таблицы (для LEFT - из первой, для RIGHT - из второй) нужно выбрать все записи, независимо от того, содержатся ли в объединяемой таблице соответствующие связанные записи.
Например, если в рассмотренном выше запросе заменить INNER на LEFT, то в столбец tbIGroups.fGroup попадут все группы, даже те, в которых нет ни одного студента (соответствующие ячейки для остальных полей в таких записях будут пустыми):
SELECT tbIGroups.fGroup, tbIStudents.fLastName, tbIStudents.fFirstName, tbIStudents.fMiddleName FROM tbIGroups
LEFT JOIN tbIStudents ON tbIGroups.flDGroup = tbIStudents.flDGroup;