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

Вопросы для самоконтроля

  1. Для чего предназначено предложение GROUP BY оператора SELECT?

  2. Для чего предназначено предложение HAVING оператора SELECT?

  3. Для чего предназначено предложение ORDER BY оператора SELECT?

  4. В каком предложении оператора SELECT задаются псевдонимы таблиц?

  5. Приведите пример использования псевдонимов таблиц в операторе SELECT (для учебной БД).

  6. Для учебной БД приведите пример использования самосоединения в запросе на языке SQL.

  7. Для чего предназначена агрегатная функция AVG( )? Приведите правила записи аргумента.

  8. Для чего предназначена агрегатная функция SUM( )? Приведите правила записи аргумента.

  9. Для чего предназначена агрегатная функция MIN( )? Приведите правила записи аргумента.

  10. Для чего предназначена агрегатная функция MAX( )? Приведите правила записи аргумента.

  11. Для чего предназначена агрегатная функция COUNT( )? Приведите правила записи аргумента.

  12. Для чего предназначена агрегатная функция COUNT(*)?

  13. Для учебной БД напишите запрос, вычисляющий среднедушевой налог.

Тема 14. Запросы с группировкой

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

SELECT nom, SUM(money) FROM Have_D GROUP BY nom

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

Фраза GROUP BY означает логическую группировку таблицы по указанному столбцу или столбцам. Физически строки в таблице не перекомпоновываются.

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

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

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

SELECT nom FROM Have_D GROUP BY nom HAVING COUNT(*)>1

Выражение во фразе HAVING должно принимать единственное значение для группы. Функция COUNT(*) означает подсчет числа строк в группе (или таблице).

Тема 15. Вложенные запросы

Условие отбора в фразе WHERE может формулироваться с помощью подзапроса, т.е. оператора SELECT, вложенного в другой оператор SELECT. Например, если надо получить сведения о жителях, имеющих телефон с номером 532-98-54, то это можно сделать, задав такой запрос:

SELECT * FROM person WHERE Adr=

(SELECT Adr FROM tphone WHERE Ntel=‘5329854’)

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

Если подзапрос выдает множество значений, то в фразе WHERE можно использовать предикат IN, предназначенный для выяснения принадлежности элемента множеству. Например, запрос на выдачу фамилий жителей, имеющих источник дохода “РАБОТА1”, может быть записан с подзапросом:

SELECT Fio FROM person WHERE nom IN

(SELECT nom FROM Have_D WHERE source=‘РАБОТА1’)

Во многих случаях можно избежать использования вложенных запросов, заменяя их на запросы, в которых задано условие соединения таблиц. Так, два последних запроса можно представить иначе:

SELECT person.* FROM tphone,person WHERE

person.Adr= tphone.Adr AND Ntel=‘5329854’

SELECT Fio FROM Have_D,person WHERE

person.nom= Have_D.nom AND source=‘РАБОТА1’

Такие запросы выглядят более простыми и менее “процедурными”, так как при задании запроса не надо определять порядок, в котором просматриваются таблицы.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]