Агрегатные функции SQL

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

Функции, которые мы будем рассматривать предназначены для подсчетов – количества, суммы, среднего числа, минимального, максимального.

Начнем с простого – количества записей. Подсчет по-английски это count(*):

select count(*) from phone;

Результатом будет количество строк в таблице phone:

+----------+
| count(*) |
+----------+
|       12 |
+----------+

В скобках чаще всего можно увидеть звездочку, хотя в реальности там можно указать что угодно, даже цифру 1:

select count(1) from phone;
+----------+
| count(1) |
+----------+
|       12 |
+----------+

Count считает, сколько строк будет выведено в результате со значением, так что ему все равно, что считать – звездочку или какое-то поле. Но тут есть одно НО – поле должно иметь значение. Что если мы посчитаем фамилию:

select count(lastname) from phone;

Результатом будет уже не 12, а только 10, потому что только у 10 строк в моей таблице имена имеют значение и у двух строк он равен null:

+-----------------+
| count(lastname) |
+-----------------+
|              10 |
+-----------------+

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

select count(lastname) from phone;

select count(lastname) from phone where lastname IS NOT null;

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

select count(distinct firstname) from phone;
+---------------------------+
| count(distinct firstname) |
+---------------------------+
|                        10 |
+---------------------------+

Этот запрос говорит, что у нас 10 уникальных имен.

Если добавить WHERE фильтр, то можно считать что-то более интересное. Например, можно посчитать, сколько телефонных записей в нашей таблице с городом Торонто (это город с cityid = 1):

select count(*) from phone where cityid = 1;

Помимо count можно найти:

SUM – сумму чисел в какой-то колонке:

MIN – минимальное значение

MAX – максимальное значение

AVG – среднее

Следующий запрос показывает все эти функции в одном запросе:

SELECT count(*) as cnt, 
    min(phoneid) as minphoneid, 
    max(phoneid) as maxphoneid, 
    avg(phoneid) as avgphoneid, 
    sum(phoneid) as sumofponeid 
FROM phone;

Чтобы было удобнее я каждой колонке дал еще и псевдоним:

+-----+------------+------------+------------+-------------+
| cnt | minphoneid | maxphoneid | avgphoneid | sumofponeid |
+-----+------------+------------+------------+-------------+
|  12 |          1 |         13 |     6.6667 |          80 |
+-----+------------+------------+------------+-------------+

Следующая глава

Группировка

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

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

Пишите мне