Когда необходимо вычислить общее количество строк в таблице, найти запись с максимальным значением или подсчитать общую сумму значений в столбце, на помощь приходят функции агрегации в SQL. Наиболее часто используемые из них – count(), sum(), avr(), min() и max(). Эти функции обычно применяются вместе с оператором SELECT.

Для подсчета количества строк в таблице можно использовать следующий запрос:

sqlite> SELECT count() FROM pages;

Чтобы найти запись с самым большим значением ID:

sqlite> SELECT max(_id) FROM pages;

Если необходимо узнать количество уникальных значений в столбце, используйте:

sqlite> SELECT count(DISTINCT theme) FROM pages;

Использование функций агрегирования в SQL

Иллюстрация демонстрирует, как команда с DISTINCT возвращает значение 3, указывая на три уникальных значения в столбце theme – это 1, 2 и 3. Хотя тема 1 встречается дважды, благодаря агрегированию она учитывается как одно значение.

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

sqlite> SELECT DISTINCT theme FROM pages;
1
2
3

Когда функция count() принимает имя столбца, например, count(theme), она возвращает число записей с ненулевыми значениями. Если в столбце отсутствуют значения NULL, результат будет равен общему количеству записей.

Передача аргументов в функцию count()

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

sqlite> SELECT count() FROM pages WHERE theme = 1;
2

Следует помнить, что в SQL фильтрация производится перед агрегацией, т.е. сначала выполняется оператор WHERE. К примеру, сначала отбираются записи с темой 1, после чего подсчитывается их количество с помощью функции count(). Обратный порядок привел бы к подсчету всех строк таблицы без дальнейшей фильтрации.

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

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

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

sqlite> SELECT theme FROM pages GROUP BY theme;
1
2
3

Результаты будут представлены двумя столбцами, где первый – это номер темы, а второй – это количество страниц в этой теме. После группировки по темам сработает функция count() для определения числа записей в каждой группе.

Примеры группировки и агрегирования в SQLite

На изображении столбец count() переименован в столбец num с использованием ключевого слова AS.

Вот пример объединения группировки и функции max():

sqlite> SELECT theme, max(num) FROM pages GROUP BY theme;
theme       max(num)
----------  ----------
1           10
2           100
3           100 

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

Вы также можете задать вывод столбца, по которому не выполняется группировка:

sqlite> SELECT title,theme,max(num) FROM pages GROUP BY theme;
Amount of Information|1|10
Binary System|2|100
Boolean Lows|3|100

В данном примере таковым является столбец title. Однако, такой подход не всегда целесообразен:

sqlite> SELECT title, theme, count() FROM pages GROUP BY theme;
What is Information|1|2
Binary System|2|1
Boolean Lows|3|1

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

Вопросы для самопроверки:

  1. Какой SQL-запрос используется для подсчета общего количества строк в таблице?
  2. Какая функция используется для нахождения записи с максимальным значением ID?
  3. Какой запрос следует использовать, чтобы найти количество уникальных значений в столбце?
  4. В каком порядке выполняются фильтрация и агрегация, и почему это важно?
  5. Какая SQL-команда позволяет группировать записи по значениям определенного поля?