Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы к экзамену по БД (ВФ) / !Все ответы по БД v0.2.13.docx
Скачиваний:
189
Добавлен:
10.05.2014
Размер:
3.32 Mб
Скачать

28. Агрегирующие функции. Группировка кортежей. Примеры.

Агрегирующие функции: работают с набором строк и предоставляют один результат в группе. Примеры функций: AVG, COUNT, MAX, MIN, SUM. AVG и SUM используются только для числовых значений. MIN и MAX для числовых значений и дат. COUNT(*) возвращает количество строк в таблице, COUNT(выражение) возвращает количество строк с не пустым (не NULL) значением выражения. COUNT(DISTINCT выражение) возвращает количество уникальных не null значений выражения.

Синтаксис:

SELECT [column,]Групповая_функция(column), ...

FROM таблица

[WHERE условие]

[GROUP BY column]

[ORDER BY column];

Есть возможность применять агрегирующие функции к группам данных. Для этого используется GROUP BY столбец (пример на рисунке, группировка идёт по номеру отдела). Группировку можно делать по нескольким колонкам.

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

Использование HAVING. Выражение нужно для: накладывания дополнительных условий на результаты агрегирующих функций.

Пример:

SELECT отдел.номер_отдела, AVG(отдел.зарплата)

FROM отдел

GROUP BY номер_отдела

HAVING MAX(зарплата)>150; - будут выведены только те результаты, у которых значения соответствуют условию.

29. Представления. Особенности использования. Примеры.

Представление это объект БД на основе одной или нескольких таблиц и/или других представлений.( виртуальная (логическая) таблица, результат запроса из базы данных.)

Преимущества представлений:

+ Ограниченный доступ к данным

+ Независимость от данных

+ Упрощение создания сложных запросов

+ Представление по разному одних и тех же данных

Создание представлений

CREATE VIEW имя_представления [(имя_колонки, …)] AS запрос

Имя_представления – именует представление. Имя_колонки – именует колонку представления.

AS – указывает начало определения представления. Запрос – определяет представление.

Причины использования View:

Использование представлений не даёт каких-то совершенно новых возможностей в работе с БД, но может быть очень удобно.

1) Представления скрывают от прикладной программы сложность запросов и саму структуру таблиц БД. Когда прикладной программе требуется таблица с определённым набором данных, она делает простейший запрос из подготовленного представления. При этом даже если для получения этих данных требуется чрезвычайно сложный запрос, сама программа этого запроса не содержит.

2) Использование представлений позволяет отделить прикладную схему представления данных от схемы хранения. С точки зрения прикладной программы структура данных соответствует тем представлениям, из которых программа эти данные извлекает. В действительности данные могут храниться совершенно иным образом, достаточно лишь создать представления, отвечающие потребностям программы. Разделение позволяет независимо модифицировать прикладную программу и схему хранения данных: как при изменении структуры физических таблиц, так и при изменении программы достаточно изменить представления соответствующим образом. Изменение программы не затрагивает физические таблицы, а изменение физической структуры таблиц не требует корректировки программы.

3) С помощью представлений обеспечивается ещё один уровень защиты данных. Пользователю могут предоставляться права только на представление, благодаря чему он не будет иметь доступа к данным, находящимся в тех же таблицах, но не предназначенных для него.

4) Поскольку SQL-запрос, выбирающий данные представления, зафиксирован на момент его создания, СУБД получает возможность применить к этому запросу оптимизацию или предварительную компиляцию, что положительно сказывается на скорости обращения к представлению, по сравнению с прямым выполнением того же запроса из прикладной программы.

Пример 1. CREATE VIEW sum_zakaz AS

SELECT SUM (WorkTable.WorkPrice) AS Summa, SalesID

FROM WorkSalesTable

INNER JOIN WorkTable On WorkTable.WorkId=WorkSalesTable.WorkId

GROUP By WorkSalesTable.SalesId

Пример 2. CREATE VIEW dept_sum_v (name, minsal, maxsal, avgsal)

AS

SELECT d.department_name, MIN(e.salary),MAX(e.salary),

AVG(e.salary)

FROM employees e JOIN departments d

ON (e.department_id = d.department_id)

GROUP BY d.department_name