Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лаборатор access.doc
Скачиваний:
39
Добавлен:
02.02.2015
Размер:
32.54 Mб
Скачать

2.5. Групповые запросы.

В инструкции SELECT могут быть заданы столбцы, используемые для формирования групп из выбранных строк. Строки в каждой группе будут содержать одно и тоже значение заданного столбца (столбцов). В SQL для формирования групповых запросов предназначено предложение GROUP BY.

Имя столбца в предложении GROUP BY может быть именем произвольного столбца или любой таблицы, описанной в предложении FROM.

Если GROUP BY стоит после предложения WHERE, создаются группы из

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

При включении предложения GROUP BY в инструкцию SELECT, список выбора должен состоять из итоговых функций SQL: AVG, SUM,MAX,MIN, COUNT, STDEV, VAR и VARP, или же из имен столбцов, указанных в предложении GROUP BY.

Создадим запрос, выводящий средний бал по предметам и количество задолженностей за определенный период времени, введя команду:

SELECT Студенты.Номер_С,

AVG(Результаты.Оценка_Т) AS Теория,

AVG(Результаты.Оценка_П) AS Практика,

AVG(Результаты.Оценка_Л) AS Лабы

FROM Студенты

INNER JOIN Результаты

ON Студенты.Номер_С = Результаты.Номер_С

WHERE ([Результаты,Дата_сдачи<=[Введите дату])

OR ([Результаты.Задолженность=0))

GROUP BY Студенты.Номер_С;

Сохраним запрос под именем "Средний бал сдавших сессию".

При необходимости произвести селекцию групп, включаемых в выходную таблицу, применяется предложение HAVING,. Это условие применяется к столбцам, указанным в предложении GROUP BY, столбцам итоговых функций и к столбцам, которые образованы выражениями, содержащими итоговые функции. Если некоторая группа не удовлетворяет условиям отбора, то она не включается в выходную логическую таблицу.

Разница между предложениями HAVING и WHERE в том, что условие выбора в WHERE применяется к отдельным записям перед, тем как они будут объединены в группы, а условие в HAVING используется в отношении уже сформированных групп строк.

2.6. Создание запроса на объединение таблиц.

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

Обновление набора записей возможно только при наличии (явно или по умолчанию) ключевого слова DISTINCTROW.

Существуют два основных типа объединения таблиц: внутреннее (INNER) и внешнее (OUTER).

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

− Внешнее объединение позволяет к внутреннему добавить еще и те строки одной из таблиц, соответствующие значения которых в другой таблице не найдены.

− Декартовым (прямым) произведением таблиц называется объединение всех строк одной таблицы со всеми строками другой. Данное объединение используется по умолчанию (при отсутствии предложения JOIN), путем перечисления объединяемых таблиц в предложении FROM.

Например,

SELECT ......

FROM TAB_1, TAB_2

......

задает областью поиска все строки TAB_1, присоединенные к каждой строке TAB_2, независимо от того, соответствуют они друг другу или нет.

Можно создавать вложенные объединения, но только объединяя

последующую таблицу с результатами объединения двух предыдущих. ACCESS не ограничивает глубину вложенности объединений таблиц.

Для указания типа объединения таблиц применяется предложение JOIN. Синтаксис предложения приведен ниже:

({ имя_таблицы [AS] псевдоним] |

имя_запроса_выборки [[AS] псевдоним] |

<таблица_объединения>

{ INNER | LEFT | RIGHT } JOIN

{имя_таблицы [[AS] псевдоним] |

имя_запроса_выборки [[AS] псевдоним] |

{таблица_объединение}

ON <условие_объединения>);

где <таблица_объединения> есть результат другой операции объединения, а <условие_объединения> − условие отбора, образованное из предикатов сравнений, сравнивающих поля первой таблицы с полями второй.

Операция INNER JOIN применяется для включения из обеих таблиц всех строк, удовлетворяющий условию объединения.

LEFT JOIN используется для вывода всех строк первой таблицы, и только тех строк второй, для которых выполняются условия объединения. Если таких значений не обнаруживается − в качестве значений соответствующих полей возвращается NULL.

RIGHT JOIN возвращает все строки второй таблицы, объединенные со строками из первой, для которых выполняются условия объединения. Если таких значений не обнаруживается − в качестве значений соответствующих полей возвращается NULL.

Если в условии объединения используется только предикат сравнения на равенство, то результат называется объединением по равенству. Бланк QBE позволяет представлять только такие объединения. Если же необходимо

определить объединения таблиц по условию неравенства ("<", ">", "< >", "<=", ">="), то запрос необходимо создавать через SQL.

Если по условию выполняется объединение таблицы с самой собой, то результат называется самообъединением.

При самообъединении (и в других случаях по желанию), используются псевдонимы. Это альтернативное имя можно использовать вместо полного имени таблицы при указании имен столбцов в списке выбора, в предложении WHERE или в подчиненных предложениях.

Если имя таблицы или запроса совпадает с зарезервированным словом SQL, то такое имя заключается в квадратные скобки.

Для определения списка всех студентов в группах с долгами и без, создадим запрос "Долги в группах", используя внешнее объединение таблиц "Студенты" и "Результаты":

SELECT Студенты.Номер_С, Студенты.Фамилия, Студенты.Группа,

Результаты.Предмет, Результаты.Задолженность

FROM Студенты

LEFT JOIN Результаты

ON Студенты.Номер_С = Результаты.Номер_С;