Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информационное обеспечение систем управления. Построение запросов пр.pdf
Скачиваний:
4
Добавлен:
15.11.2022
Размер:
3.76 Mб
Скачать

ваться и числовые или символьные поля. Когда они используются с символьными полями, МАХ и MIN будут транслировать их в эквивалент ASCII, который должен сообщать, что MIN будет означать первое, а МАХ последнее значение в алфавитном порядке. Выполним, например, следующий оператор, который отыскивает человека с «максимальной» фамилией, т.е. с фамилией, являющейся последней в упорядоченном по алфавиту списке фамилий:24

SELECT МАХ( PR_NAME) AS "Фамилия" FROM PERSON

Мы получим фамилию «Янышева».

Аналогичным образом работает и функция MIN, но с точно­ стью до наоборот. Можете это также проверить.

Применим MIN к числовому полю, найдем минимальный та­ риф на билеты:25

SELECT MIN(TR_COST) FROM TARIFF

Получим минимальную стоимость билета.

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

4.1. Использование DISTINCT с COUNT

Функция COUNT несколько отличается от всех. Она считает число значений в данном столбце или число строк в таблице. Когда она считает значения столбца, она используется с DISTINCT, чтобы производить счет чисел различных значений в данном поле. Мы могли бы использовать ее, например, чтобы сосчитать количе­ ство всех имен в таблице PERSON.26

SELECT

COUNT ( DISTINCT PR_NAME2) FROM PERSON

В результате получаем:

COUNT

63

 

если бы мы не использовали DISTINCT, а ввели

SELECT

COUNT (PR_NAME2) FROM PERSON.

мы бы получили количество всех имен с учетом повторов

COUNT 248

COUNT, примененная к значениям столбца, не может подсчи­ тать значения NULL; если мы пожелаем подсчитать количество

дней рождения

в таблице PERSON, то получим количество значе­

ний только с ненулевыми значениями. Введем27

SELECT

COUNT ( PR__BIRTHDA У) FROM PERSON

В результате получаем COUNT 1

104 количество людей, у которых известна дата рождения.

Теперь применим COUNT для подсчета числа строк, в этом

случае DISTINCT не используется. Найдем количество всех Татьян28 :

SELECT COUNTC) FROM PERSON

WHERE PR_NAME2 = ’Татьяна’,

получаем_____

COUNT 16

4.2 ..........................

GROUPBY

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

Существует два основных правила группировки:

1.Каждый столбец, включенный в неагрегатный список опера­ тора SELECT, должен появиться в предложении GROUP BY.

2.Оператор SELECT может содержать только одно предложе­ ние GROUP BY.

Это важнейшие правила группировки. Мы должны их помнить и использовать в любом нашем операторе, выполняющем группи­

ровку. Иначе получим ошибку, которой может занять слишком много времени.

ш НД 1? ДЛ0Же™е ? R° UP BY Располагается после предложения WHERE и перед предложением ORDER BY.

Например, предположим, что вы хотите найти, сколько каких имен содержится в нашем списке, при этом упорядочивая вывод по найденному количеству (по направлению от большего к меньшему), если количество будет повторяться, отсортируем список по имени 2’

SELECT COUNT Г), PRJNAME2

FROM PERSON GROUP BY PRJNAME2

ORDER BY 1 DESC, PR_NAME2

Получим следующий список, упорядоченный по результатам расчета функции COUNT:

Листинг 14

Количество каждого имени в списке людей

COUNT

PRJ4AME2

23

Елена

20

Наталья

16

Татьяна

15

Светлана

12

Марина

11

Ирина

11

Оксана

ИОльга

10

Екатерина

9

Юлия

7

Сергей

6

Александр

6

Анна

COUNT

PRJ4AME2

5

Алексей

5

Дмитрий

5

Надежда

5

Олег

4

Вера

4

Людмила

4

Мария

3

Владимир

3

Ксения

3

Лариса

3

Максим

2

Анастасия

2

Вячеслав

2

Евгений

2

Илья

2

Любовь

2

Михаил

2

Семен

2

Станислав

2

Эдуард

1

Алевтина

1

Алмаз

1

Альбина

1

Амина

1

Ангелина

1

Антонина

1

Валентина

1

Валерий

1

Василий