ресурс для начинающих веб-разработчиков
комплексные веб-услуги по созданию сайтов

Справочный материал по основным языкам программирования и верстки сайтов.

Готовая методика создания простых и сложных динамичных сайтов, с использованием PHP и MySQL.

Использование веб-редактора Adobe Dreamweaver в разработке сайтов.

Использование графических редакторов Adobe Flash, Adobe Photoshop, Adobe Fireworks в подготовке веб-графики.

Разработка веб-сайтов под "ключ".

Разработка отдельных фрагментов сайтов, консультации по вопросам верстки веб-страниц и веб-программирования.

Извлечение данных в определенном порядке. Группировка и агрегатирование данных. Выбор возвращаемых строк

Группировка и агрегатирование данных

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

Конструкция ORDER BY применяется для сортировки строк в столбцах, указанных в операторе SELECT. Например:

mysql> select name, address
-> from customers
-> order by name;

Такой запрос выведет имена и адреса клиентов в алфавитном порядке по именам:

Вывод с помощью конструкции ORDER BY

Обратите внимание, что в данном случае, поскольку имена состоят из собственно имени и фамилии, они будут упорядочены по имени. Если требуется выполнять сортировку по фамилии (которая стоит второй), нужно, чтобы имя и фамилия хранились в двух разных полях.

По умолчанию используется порядок сортировки по возростанию (от а до z или в порядке возростания числовых значений). При желании этот порядок сортировки можно указать ключевым словом ASC:

mysql> select name, address
-> from customers
-> order by name asc;

Изменить порядок сортировки на обратный можно с помощью другого ключевого слова —DESC:

mysql> select name, address
-> from customers
-> order by name DESC;

Вот так выглядит результат запроса:

Результат запроса

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

Группировка и агрегатирование данных

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

Эти функции агрегатирования можно применять как к таблице в целом, так и группам данных внутри таблицы.

Таблица. Наиболее часто используемые функции агрегатирования в MySQL
Название Описание
AVG (столбец) Средняя величина значений в определенном столбце.
COUNT (элементы) При указании столбца выдается количество числовых (ненулевых) значений в этом столбце. Если перед названием столбца вставить слово DISTINCT, выдается только количество конкретных значений в столбце. Если указать COUNT (*) — подсчет строк будет производиться независимо от нулевых значений.
MIN (столбец) Минимальное значение в столбце.
MAX (столбец) Максимальное значение в столбце.
STD (столбец) Стандартное отклонение значений в столбце.
STDDEV (столбец) Аналогично предыдущему.
SUM (столбец) Сумма значений в столбце.

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

mysql> select AVG (amount)
-> from orders;

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

Вывод результата

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

mysql> select customerid, AVG (amount)
-> from orders
-> GROUP BY customerid;

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

Результат запроса

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

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

Вдобавок к группировке и агрегированию данных есть все шансы проверить результат агрегирования с использованием конструкции HAVING. Она следует сразу после конструкции GROUP BY и похожа на WHERE, но только применяется к группам и множествам.

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

mysql> select customerid, AVG (amount)
-> from orders
-> GROUP BY customerid
-> HAVING AVG (amount) > 150;

Обратите внимание, что конструкция HAVING применяется к группам. Такой запрос приводит к получению следующего результата:

Результат запроса

Выбор возвращаемых строк

Конструкцией оператора SELECT, которая может оказаться особенно полезной в веб-приложениях, является LIMIT. Ее испоьзуют для указания строк результата, которые должны быть возвращены. Она требует указания двух параметров: номера начальной строки и количества возвращаемых строк.

Следующий запрос неплохо иллюстрирует применение LIMIT:

mysql> select name
-> from customers
-> LIMIT 2,3;

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

Результат запроса

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

Это очень удобная конструкция для Web-приложений. Ее принцип точно такой же, как и в случае, когда покупатель листает каталог и хочет видеть на одной странице только 10 пунктов. Обратите внимание, что LIMIT в стандарте ANSI SQL отсутствует. Это расширение MySQL, поэтому использование LIMIT приводит к несовместимости кода со многими СУРБД.