Сортировка и ограничение результатов

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

Пример для выборки информации о 5 первых новостях из таблицы "news" со значениями атрибута "id" больше 5:

SELECT * FROM `news` WHERE `id` > 5 LIMIT 5;

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

Пример для выборки информации о 10 первых новостях из таблицы "news" со значениями атрибута "id" больше 5, отсортированной сначала по авторам ("author") в алфавитном порядке, а затем — по идентификаторам ("id") в обратном порядке:

SELECT * FROM `news` WHERE `id` > 5 ORDER BY `author` ASC, `id` DESC LIMIT 10;

Числовые операции (агрегирующие функции)

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

SELECT AVG(`id`) FROM `news`;

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

SELECT MIN(`id`), MAX(`id`) FROM `news`;

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

SELECT SUM(`id`) FROM `news`;

4. Для подсчета количества строк выборки предусмотрена функция COUNT(). В качестве единственного аргумента ей передается название атрибута, значения которого будут учитываться. Кроме того, поскольку обычно не важно, по какому атрибуту считать число результирующих строк, вместо названия атрибута в качестве аргумента может использоваться метасимвол звездочки («*»). Пример выборки для нахождения количества строк в таблице "news":

SELECT COUNT(*) FROM `news`;

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

SELECT COUNT(DISTINCT `author`) FROM `news`;

Группировка результатов

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

Группировка производится по указываемому атрибуту (или набору атрибутов), и строки распределяются по группам в соответствии со значением атрибута в этой строке (каждую группу образует набор строк с одним значением атрибута, по которому производится группировка).

Пример выборки значений всех атрибутов таблицы "news" с группировкой по атрибуту "author":

SELECT * FROM `news` GROUP BY `author`;

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

SELECT `author`, COUNT(*) FROM `news` GROUP BY `author`;

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

Например, к прошлому запросу с помощью HAVING можно добавить условие, по которому будут выводиться только те авторы, которые добавили более 3 новостей:

SELECT `author`, COUNT(*) AS `cnt` FROM `news` GROUP BY `author` HAVING `cnt` > 3;