Смекни!
smekni.com

Методические указания для студентов специальности 2205, 0755 «Проектирование и технология эвс», «Комплексная информационная безопасность автоматизированных систем» (стр. 12 из 21)

Ключевые слова ASC, DESC определяют направление сортировки: по возрастанию, по убыванию соответственно и действует только на один столбец.

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

SELECT PUB_ID, PRICE, TITLE_ID,

FROM TITLE

ORDER BY PRICE DESC, PUB_ID

При выводе возможна сортировка выражений. Допустим, необходимо результаты отсортировать по издателям, затем по продажам. В этом случае в предложении ORDER BY ставится номер позиции (натуральное число без знака), соответствующий выражению в списке выбора. В результате запрос будет выглядеть следующим образом:

SELECT PUB_ID, PRICE * YTD_SALES, PRICE, TITLE_ID

FROM TITLE

ORDER BY PUB_ID, 2

pub_id price title_id

В список сортировки можно добавить предложение DESC, тогда поле продаж будет отсортировано по убыванию.

5.1.3. Агрегирующие функции

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

SUM([DISTINCT] выражение) - сумма (различных) выражений.

AVG([DISTINCT] выражение) - средняя величина (различных) значений.

COUNT ( [DISTINCT] выражение) - количество (различных) ненулевых значений.

COUNT (*) - полное количество выбранных строк, включая пустые строки и дубликаты.

МАХ (выражение) - максимальное значение.

MIN (выражение) - минимальные значение.

При использовании агрегирующих функций необходимо учитывать следующее:

их можно записывать в списке выбора или в предложении HAWING;

нельзя применять в предложении WHERE;

перед вычислением значения функции все неопределенные значения аргумента исключаются;

если определено предложение DISTINCT, то повторяющиеся значения аргумента в подсчете значения функции не участвуют;

если аргумент пуст, т.е. содержит неопределенные значения, то функция COUNT всегда возвращает значение 0, а другие агрегирующие функции - неопределенное значение;

функции SUM и AVG работают только с аргументами числовых типов;

функции COUNT, MAX, MIN могут использоваться с аргументами любых типов.

Приведем несколько примеров использования функций.

1. SELECT YTD_SALES

FROM TITLE

2. SELECT SUM (YTD_SALES)

FROM TITLE

В первом случае соответствующие значения выдаются виде таблицы, т.е. выдается столько строк, сколько их есть в таблице TITLE. Если использовать агрегирующую функцию SUM, то в результате получим общую сумму, и это будет одно значение.

Одно выдаваемое значение можно пояснить, например, при записи следующего запроса:

SELECT 'ИТОГ ', SUM (YTD_SALES)

FROM TITLE

на экране можно увидеть:

Итог: 97445

Приведем примеры использования функции COUNT.

Допустим, необходимо узнать количество авторов, сотрудничающих с издательством. Запрос будет выглядеть так:

SELECT COUNT (AU_FNAME)

FROM AUTORS

В том случае, когда необходимо узнать количество разных фамилий авторов, сотрудничающих с издательством, запрос запишется с использованием предложения DISTINCT:

SELECT COUNT (DISTINCT AU_FNAME)

FROM AUTORS

5.1.4. Группировка данных и построение отчетов

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

Пример.

SELECT AVG (PRICE)

FROM TITLE

SELECT TYPE, AVG (PRICE)

FROM TITLE

GROUP BY TYPE

В результате первого запроса получим среднюю стоимость книг. Это будет единственное значение. Во втором запросе книги группируются по типу. Строки помещаются в одну группу тогда и только тогда, когда у них совпадает поле TYPE. Затем фраза SELECT применяется к каждой группе, т.е. внутри каждой группы считается средняя цена. Для каждой группы SELECT выводит TYPE и среднее значение по типу.

TYPE
спорт 86.78
Домашнее хозяйство 190.43

Как правило, в большинстве реализаций SQL элемент из списка GROUP BY должен присутствовать в списке выбора SELECT.

Путем сортировки одновременно по нескольким элементам можно создавать группы внутри других групп.

Пусть необходимо подсчитать количество книг по каждому типу, выпущенному каждым издательством. Здесь группировка производится сначала по издательству, затем по типу.

SELECT PUB_ID, TYPE, COUNT (TYPE)

FROM TITLE

GROUP BY PUB_ID, TYPE

Результат:

Pub_id type

0732 спорт 5

0732 бизнес 4

0877 бизнес 2

0877 спорт 6

0877 искусство 4

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

Допустим, необходимо найти средние затраты и сумму доходов от продаж по каждому типу книг:

SELECT TYRE, AVG(ADVANCE), SUM(YTD_SALES*PRICE)

FROM TITLE

GROUP BY TYPE

Type
Бизнес 62.81 307587
Компьютеры 75.000 242784
Спорт 42.00 99398

GROUP BY возможно применять вместе с предложением WHERE. В этом случае сначала находятся все строки, удовлетворяющие предложению WHERE, затем оставшиеся строки группируются в соответствии с предложением GROUP BY. GROUP BY разделяет строки на наборы, но при этом не упорядочивает их. Для упорядочивания результатов нужно использовать предложение ORDER BY.

Например. Найти среднюю стоимость книг по каждому типу, затраты на которые превысили 50000, и упорядочить результаты по цене. Запрос выглядит следующим образом:

SELECT TYPE, AVG (PRICE)

FROM TITLE

WHERE ADVANCE > 50000

GROUP BY TYPE

ORDER BY 2

Type
Бизнес 2.9.9
Спорт 30.1
Анатомия 42.3

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

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

SELECT TYPE, COUNT(*)

FROM TITLE

GROUP BY TYPE

HAVING COUNT(*) > 1

Условия в предложении HAWING могут объединяться с помощью операторов AND, OR, NOT.

Приведем в качестве примера запрос, содержащий выражения WHERE, GROUP BY, ORDER BY, HAWING. Пусть необходимо сгруппировать строки из таблицы TITLES по издателям, при этом включить в конечный результат только группы издателей с идентификационными номерами большими 0800, суммарными затратами большими 750 000 рублей, средней ценой книг меньше 300 рублей и без учета книг стоимостью меньше 50 рублей.

SELECT PUB_ID, SUM(ADVANCE), AVG(PRICE)

FROM TITLE

WHERE PRICE >= 50

GROUP BY PUB_ID

HAVING SUM(ADVANCE) > 750000

AND AVG(PRICE) < 300

AND PUB_ID > ‘0800’

ORDER BY PUB_ID

Использование нулевых значений.

При рассмотрении основных предложений оператора SELECT не рассматривался вопрос, связанный с использованием нулевых значений.

В том случае, когда информация неполна, неизвестна на настоящий момент времени, приходится иметь дело с так называемыми нулевыми (NULL) значениями. Нулевые значения появляются в том случае, если пользователь вводит данные и не знает, какую информацию нужно вводить в некоторых полях. В этом случае система автоматически вводит нулевые значения. При появлении нулевых значений не действуют стандартные правила сравнения: одно неопределенное значение не равно другому неопределенному значению. Нулевые значения приводят к появлению трехзначной логики в логических выражениях.

Таблица истинностей для трехзначной логики приведена ниже.

a

b

not a

a and b

a or b

1

1

0

1

1

1

0

0

0

1

1

-

0

-

1

0

1

1

0

1

0

0

1

0

0

0

-

1

0

-

-

1

-

-

1

-

0

-

0

-

-

-

-

-

-

Здесь неопределенное значение показано прочерком (-).

При группировке все нулевые значения, как правило, помещаются в одну группу. При вычислениях строки с нулевым значением столбца можно извлекать из таблицы с помощью специального условия IS [NOT] NULL. Например, чтобы найти все книги с ненулевыми затратами, можно использовать запрос:

SELECT TITLE_ID, ADVANCE

FROM TITLE

WHERE ADVANCE IS NOT NULL

5.1.5. Объединение таблиц и сложный анализ данных

В большинстве систем объединение таблиц осуществляется в предложении WHERE оператора SELECT. В одном операторе SELECT может объединяться несколько таблиц. Объединение, как правило, проводится по ключевым столбцам,

Например. Необходимо узнать имена редакторов книги с идентификационным номером "СW97".