Глиф Учебники

Как посчитать количество строк в SQL

Справочник · SQL · 2 минуты чтения

Число строк в таблице:

SQL
SELECT COUNT(*) FROM people;

Запрос одинаков в SQLite, MySQL, PostgreSQL и других СУБД. Ниже примеры на такой таблице:

SQL
CREATE TABLE people (
    id    INTEGER PRIMARY KEY,
    name  TEXT,
    phone TEXT,
    city  TEXT
);

INSERT INTO people (name, phone, city) VALUES
    ('Анна', '+375291112233', 'Минск'),
    ('Борис', NULL, 'Гомель'),
    ('Вера', '+375447778899', 'Минск'),
    ('Глеб', NULL, 'Минск');

Три вида COUNT

SQL
SELECT COUNT(*)             AS all_rows,
       COUNT(phone)         AS with_phone,
       COUNT(DISTINCT city) AS cities
FROM people;
all_rowswith_phonecities
422

COUNT(1) работает так же, как COUNT(*), и не быстрее его.

По условию и по группам

Строки, подходящие под условие, — WHERE:

SQL
SELECT COUNT(*) FROM people WHERE city = 'Минск';

Ответ — 3. Число строк в каждой группе — GROUP BY:

SQL
SELECT city, COUNT(*) AS total
FROM people
GROUP BY city
ORDER BY total DESC;
citytotal
Минск3
Гомель1

Отобрать группы по числу строк (например, города, где больше двух человек) — HAVING COUNT(*) > 2, см. справку Чем WHERE отличается от HAVING.

Несколько условий одним запросом

Всего людей и сколько из них без телефона — без двух отдельных запросов:

SQL
SELECT COUNT(*) AS total,
       SUM(CASE WHEN phone IS NULL THEN 1 ELSE 0 END) AS no_phone
FROM people;
totalno_phone
42

CASE даёт 1 для подходящих строк и 0 для остальных, SUM складывает единицы. Такая запись работает везде. В PostgreSQL и SQLite 3.30 и новее есть и короче: COUNT(*) FILTER (WHERE phone IS NULL).

Число строк сложного запроса

Посчитать строки результата с DISTINCT, JOIN или GROUP BY проще всего, обернув его в подзапрос:

SQL
SELECT COUNT(*) FROM (
    SELECT DISTINCT name, city FROM people
) AS t;

Подводные камни