До сих пор мы работали с внутренними связями – в выборку включались только те записи из главной таблицы и связанные с ними записи из подчиненных таблиц, значения в связующих полях которых совпадали. Такие запросы устанавливают между таблицами исключающую связь и называется внутренним соединением.
Кроме такого вида соединений существуют запросы, которые устанавливают включающую связь, а соединения между таблицами называется внешним.
При использовании внешних соединений MS Access включает все записи из таблицы, образующей одну сторону отношений, но только совпадающие таблицы, образующие вторую сторону отношений.
Например, нам нужно получить информацию по всем клиентам, не имеющим заказы. Для этого необходимо обеспечить вывод всех клиентов из таблицы Клиенты и соответственно поля Заказано из таблицы Заказы, в том числе и для тех, у кого в данном поле ничего нет, т.к. нет записей в таблице Заказы. Потом можно задать условие в поле Заказано "is Null" определив тем самым, что в запросе нужно отобрать только клиентов не сделавших заказы.
При наличии внутреннего соединения данную операцию выполнить невозможно. Поэтому, необходимо выполнить следующую последовательность действий:
вызвать бланк Запроса и добавить таблицы Заказы и Клиенты
изменить внутреннюю связь на внешнюю, для чего дважды щелкнуть мышью по линии, отражающей связь между двумя списками. При этом появится окно Параметры объединения, содержащие три опции:
объединение только тех записей, в которых связанные поля обеих таблиц совпадают (данный режим устанавливается по умолчанию)
объединение всех записей из "Клиенты" и только тех записей из Заказы, в которых связанные поля совпадают
объединение всех записей из "Заказы" и только тех записей из "Клиенты", в которых связанные поля совпадают.
Если выбранный второй режим, то Линия связи между таблицами изменит свой вид:
|
1 |
Заказы |
Код клиента |
|
Код клиента |
Стрелка указывает на таблицу, из которой будут выбранные только совпадающие поля.
Заказы Клиенты |
|||
Поля |
Код клиента |
Фамилия |
Заказано |
Табл |
Клиенты |
Клиенты |
Заказы |
Усл.отб. |
|
|
|
Если просмотреть данный запрос без условия в поле Заказано is Null, то он будет иметь следующий вид:
Код клиента |
Фамилия |
Заказано |
126 127 128 129 |
Иванов Петров Сидоров Печкин |
40 60 80 |
При вводе условия is Null из запроса исключается все строки с не нулевыми полями Заказано (его можно не выводить на экран).
Важно отметить, что поля связь была внутренней, не было разницы, поместить ли в запрос Код клиента из таблицы Клиенты или из таблицы Заказы, т.к. они бы совпадали.
При установлении внешней связи, вытащив поля Код клиента из таблицы Клиенты, вы получите полный список клиентов с их кодами, а вытащив его из таблицы Заказы, получим следующий вид:
Код клиента |
Фамилия |
Заказано |
126 127 128 |
Иванов Петров Сидоров Печкин |
40 60 80 |
Такую же связь можно установить между таблицами Предприятие и Заказы. При этом можно поставить условие показать предприятия, сотрудники которых не делали заказы.
Запросы, выполняющие вычисления в группах записей, называются итоговыми запросами.
Для создания итогового запроса, находясь в Конструкторе запросов необходимо выбрать команду Вид/Групповые операции ли кнопку _____ на панели инструментов. В бланке запроса появится новая строка с наименованием Групповая операция. В данной строке необходимо указать тип выполняемого вычисления:
SUM – суммирование
AVG – среднее значение
min, max – минимум, максимум
count –количество записей, содержащих значения
Например, если нам нужно определить сумму заработной платы по всем сотрудникам предприятия.
Информация
|
|
|
Поле |
Зарплата |
|
Имя таблицы |
Сотрудники |
|
Сортировка |
|
|
Группировка |
Sum |
|
Вывод на экран |
|
|
|
|
|
Тогда результатом запроса будет
Sum-Затраты |
19890 |
Если в бланк запроса добавить еще два ряда заработной платы и выбрать в качестве групповой операции max и min, то запрос будет иметь вид:
Sum-Зарплата |
Max-Зарплата |
Min-Зарплата |
19890 |
2000 |
300 |
Например, нас интересует информация о суммарной, максимальной и минимальной заработной плате только по программистам.
Для этого нужно добавить в бланк запроса поле Должность, а затем в строке Групповая операция данного поля установить значение Условие. При выборе данного значения автоматически снимается флажок Вывод на экран и поле не выводится на экран при выполнении запроса. После этого в троке Условие отбора можно ввести Программист.
Группировка позволяет получить вычисляемую информацию о подгруппах записей в таблице Заказы по полю Код товара. Можно получить сведения о продажах товаров каждого вида.
Тогда нужно создать следующий запрос:
Поля |
Код товара |
Продано |
Имя таблицы |
Заказы |
Заказы |
Груп. операция |
Группировка |
Sum |
Сортировка |
|
|
Вывод на экран |
|
|
Условие отбора |
|
|
Результатом будет запрос такого вида:
Код товара |
Sum_Продано |
1 |
400 |
2 |
200 |
3 |
350 |
Если создать запрос, формирующий информацию о сумме, на которую продано товаров каждому клиенту, получим результат:
Код Клиента |
Sum_Продано |
22 |
500 |
33 |
320 |
44 |
130 |
Группировку можно выполнять по нескольким полям, образуя тем самым группы внутри групп.
Например, нужно получить информацию о том, какое количество товара каждого вида купил каждый клиент. Тогда в запросе будет присутствовать сразу три поля, причем и поле Код товара и Код клиента будет стоять значение Группировка. Результатом будет таблица:
Код клиента |
Код товара |
Sum_продано |
22 |
1 |
200 |
22 |
2 |
100 |
33 |
2 |
150 |
33 |
3 |
140 |
44 |
1 |
200 |
Для изменения имен и готовых полей необходимо в строке Поле вызвать Свойства и во вкладке Общие в строке Подпись ввести имя поля.