Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекций по Б/Д.doc
Скачиваний:
19
Добавлен:
25.04.2019
Размер:
389.63 Кб
Скачать

Группировка

Объединяет записи с одинаковыми значениями в указанном списке полей в одну запись. Если инструкция SELECT содержит статистическую функцию SQL, например, Sum или Count, то для каждой записи будет вычислено итоговое значение.

Синтаксис:

SELECT списокПолей

FROM таблица

WHERE условиеОтбора

[GROUP BY группируемыеПоля]

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

Значения Null, которые находятся в полях, заданных в предложении GROUP BY, группируются и не опускаются. Однако статистические функции SQL не обрабатывают значения Null.

Если поле, включенное в предложение GROUP BY, не является полем типа Memo или объекта ActiveX, оно может содержать ссылку на любое поле, перечисленное в предложении FROM, даже если это поле не включено в инструкцию SELECT, при условии, что инструкция SELECT содержит по крайней мере одну статистическую функцию SQL. Ядро базы данных Jet не поддерживает группировку полей МЕМО или объекта ActiveX.

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

SELECT Сотрудники.Отдел, Sum(Сотрудники.Зарплата) AS Sum_Зарплата

FROM Сотрудники

GROUP BY Сотрудники.Отдел;

Используйте предложение WHERE для исключения записей из группировки, а предложение HAVING для применения фильтра к записям после группировки.

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

Синтаксис:

SELECT списокПолей

FROM таблица

WHERE условиеОтбора

GROUP BY группируемыеПоля

[HAVING условиеГруппировки]

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

SELECT Сотрудники.Отдел, Sum(Сотрудники.Зарплата) AS Sum_Зарплата

FROM Сотрудники

GROUP BY Сотрудники.Отдел

HAVING (((Sum(Сотрудники.Зарплата))>3000));

Предложение HAVING может содержать до 40 выражений, связанных логическими операторами, такими как And и Or.

Объединение таблиц

Существует 2 способа объединения таблиц:

Объединение записей из двух таблиц, если связующие поля этих таблиц содержат одинаковые значения. Оно осуществляется с помощью 3 операторов: INNER JOIN, LEFT JOIN, RIGHT JOIN. Синтаксис: FROM таблица_1 INNER JOIN таблица_2 ON таблица_1.поле_1 оператор таблица_2.поле_2

ТАБЛИЦА_1, ТАБЛИЦА_2 – имена таблиц, записи которых подлежат объединению.

ПОЛЕ_1, ПОЛЕ_2 – Имена объединяемых полей. Если эти поля не являются числовыми, то должны иметь одинаковый тип данных и содержать данные одного рода, однако, поля могут иметь разные имена.

ОПЕРАТОР – любой оператор сравнения: "=," "<," ">," "<=," ">=," или "<>".

Операцию INNER JOIN можно использовать в любом предложении FROM. Это самые обычные типы связывания. Они объединяют записи двух таблиц, если связующие поля обеих таблиц содержат одинаковые значения. Операцию INNER JOIN можно использовать с таблицами "Начальники" и "Сотрудники" для отбора всех сотрудников каждого отдела.

SELECT Начальники.Фамилия, Начальники.Отдел, Сотрудники.Фамилия, Сотрудники.Отдел

FROM [Начальники] INNER JOIN Сотрудники ON Начальники.Отдел = Сотрудники.Отдел;

Попытка объединить поля Memo или объекта ActiveX приведет к возникновению ошибки. Допускается объединение двух числовых полей подобных типов, например, поле счетчика и поля с типом "Длинное целое". Однако нельзя объединить типы полей "С плавающей точкой (4 байт)" и "С плавающей точкой (8 байт)".

SELECT поля

FROM таблица_1 INNER JOIN таблица_2

ON таблица_1.поле_1 оператор таблица_2.поле_1 AND

ON таблица_1.поле_2 оператор таблица_2.поле_2) OR

ON таблица_1.поле_3 оператор таблица_2.поле_3)];

Операции JOIN могут быть вложенными; в таком случае используйте следующий синтаксис:

SELECT поля

FROM таблица_1 INNER JOIN

(таблица_2 INNER JOIN [( ]таблица_3

[INNER JOIN [( ]таблица_X [INNER JOIN ...)]

ON таблица_3.поле_3 оператор таблица_X.поле_X)]

ON таблица_2.поле_2 оператор таблица_3.поле_3)

ON таблица_1.поле_1 оператор таблица_2.поле_2;

Операции LEFT JOIN или RIGHT JOIN могут быть вложены в операцию INNER JOIN, но операция INNER JOIN не может быть вложена в LEFT JOIN или RIGHT JOIN.

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

Синтаксис:

FROM таблица_1 [ LEFT | RIGHT ] JOIN таблица_2

ON таблица_1.поле_1 оператор таблица_2.поле_2

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

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

2-й способ объединения таблиц заключается в простом последовательном присоединении к записям первой таблицы записей второй таблицы. Такое объединение осуществляется с помощью оператора UNION. Он создает запрос на объединение, который объединяет результаты нескольких независимых запросов или таблиц.

Синтаксис:

[TABLE] запрос_1 UNION [ALL] [TABLE] запрос_2 [UNION [ALL] [TABLE] запрос_n [ ... ]]

Ниже перечислены аргументы операции UNION:

ЗАПРОС_1 – инструкция SELECT, имя сохраненного запроса или имя сохраненной таблицы, перед которым стоит зарезервированное слово TABLE.

В одной операции UNION можно объединить в любом наборе результаты нескольких запросов, таблиц и инструкций SELECT. По умолчанию повторяющиеся записи не возвращаются при использовании операции UNION, однако, в нее можно добавить предикат ALL, чтобы гарантировать возврат всех записей. Кроме того, такие запросы выполняются быстрее. Все запросы, включенные в операцию UNION, должны отбирать одинаковое число полей; при этом типы данных и размеры полей не обязаны совпадать.

Используйте псевдонимы только в первом предложении SELECT, потому что в остальных они пропускаются. В предложении ORDER BY ссылайтесь на поля по их названиям в первом предложении SELECT.

В каждом аргументе запрос допускается использование предложения GROUP BY или HAVING для группировки возвращаемых данных. В конец последнего аргумента запрос можно включить предложение ORDER BY, чтобы отсортировать возвращенные данные. В Microsoft Access аргументами операции UNION (запрос1, запрос2,...запросN) могут служить инструкция SELECT, имя сохраненного запроса Microsoft Access или имя сохраненной таблицы Microsoft Access с предшествующим зарезервированным словом TABLE.