Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Белобжеский_Лекции_по_ББД.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
5.5 Mб
Скачать

Сортировка

Строки результирующего отношения могут быть отсортированы по значениям одного или нескольких столбцов с помощью оператора ORDER BY. Рассмотрим сле­дующий пример:

SELECT Имя. Специальность, Курс

FROM СТУДЕНТ

WHERE Специальность = 'БУХГАЛТЕРСКИЙ УЧЕТ'

ORDER BY Имя

Этот запрос перечислит в алфавитном порядке студентов, специализирую­щихся на бухгалтерском учете. Результат имеет следующий вид:

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

SELECT Имя, Специальность, Курс

FROM СТУДЕНТ

WHERE Курс IN ['С1', 'С2', 'С4']

ORDER BY Специальность ASC, Курс DESC

Результатом будет таблица:

Ключевые слова ORDER BY могут комбинироваться с любыми операторами SELECT.

Встроенные функции sql

В SQL предусмотрено пять встроенных функций (built-in functions): COUNT, SUM, AVG, MAX и MIN4. Функции COUNT и SUM различны, хотя обе они выполняют под­счет. Функция COUNT вычисляет количество строк в таблице, a SUM подсчитывает количество числовых столбцов. Функции AVG, МАХ и MIN также работают с число­выми столбцами: AVG вычисляет среднее значение, а МАХ и MIN находят соответст­венно максимальное и минимальное значение столбца в таблице. Выражение

SELECT COUNT(*)

FROM СТУДЕНТ

подсчитывает количество строк в таблице СТУДЕНТ и отображает его в таблице, имеющей одну строку и один столбец:

Рассмотрим выражения

SELECT COUNT (Специальность)

FROM СТУДЕНТ

и

SELECT COUNT (DISTINCT Специальность)

FROM СТУДЕНТ

Первое выражение подсчитывает общее количество специальностей в таблице, включая повторения, а второе — количество различных специальностей. Резуль­таты имеют следующий вид:

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

SELECT Имя, COUNT (*)

недопустима.

Встроенные функции можно использовать для запроса результата, как в при­веденных выше примерах. В большинстве реализаций SQL и в стандарте ANSI SQL встроенные функции не могут фигурировать в предложении WHERE.

Встроенные функции и группировка

Для большей практичности встроенные функции можно применять к группам строк внутри таблицы. Такие группы формируются путем сбора (в логическом,

а не в физическом смысле) строк, имеющих одинаковое значение заданного столбца. Например, студентов можно группировать по специальностям — то есть для каждого значения атрибута Специальность будет сформирована своя группа. На рис. 9.2 можно выделить три группы студентов: одна специализируется на истории, другая — на бухгалтерском учете, а третья — на математике.

Ключевое слово GROUP BY инструктирует СУБД группировать те строки, ко­торые имеют одинаковое значение заданного столбца. Рассмотрим выражение

SELECT Специальность, COUNT(*)

FROM СТУДЕНТ

GROUP BY Специальность

Результатом будет отношение:

Строки таблицы СТУДЕНТ логически сгруппированы по значению атрибута Специальность, а функция COUNT суммирует количество строк в каждой группе. Результат представляет собой таблицу из двух столбцов: названия специально­сти и количества студентов с этой специальностью. Для подгрупп в операторе SELECT могут быть указаны как столбцы, так и встроенные функции.

В некоторых случаях возникает потребность рассматривать не все группы. Например, мы сформировали группы студентов, имеющих одинаковую специ­альность, и теперь хотим рассматривать только те из них, количество студентов в которых больше двух. Чтобы указать нужное нам подмножество групп, мы мо­жем воспользоваться SQL-предложением HAVING.

Следующие операторы SQL выдают перечень предметов, на которых специа­лизируется более двух студентов, а также количество студентов, занимающихся по каждой из этих специализаций:

SELECT Специальность, COUNT (*)

FROM СТУДЕНТ

GROUP BY Специальность

HAVING COUNT (*) > 2

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

Для еще большей общности могут быть также добавлены предложения WHERE. Однако это может привести к неоднозначности. Рассмотрим выражение

SELECT Специальность, МАХ (ЛичныйНомер)

FROM СТУДЕНТ

WHERE Курс = 'С4'

GROUP BY Специальность

HAVING COUNT (*) > 1

Результат будет зависеть от того, когда будет применяться условие в предло­жении WHERE — до или после условия в предложении HAVING. Чтобы устранить эту неопределенность, стандарт SQL устанавливает правило, согласно которому предложения WHERE должны применяться в первую очередь. Соответственно, в приведенном операторе порядок выполнения операций таков: выбираются сту­денты че гвертого курса; формируются группы; из групп выбираются те, которые удовлетворяют условию предложения HAVING; выводятся результаты. В данном случае результат выглядит так:

(Этот запрос допустим не во всех реализациях SQL. В некоторых реализаци­ях единственные атрибуты, которые могут фигурировать во фразе SELECT запроса с предложением GROUP BY, — это атрибуты из фразы GROUP BY и встроенные функции от этих атрибутов. Таким образом, в данном запросе допустимыми будут только атрибут Специальность и встроенные функции от этого атрибута.)