← Назад к вопросам

Как посчитать количество строк в таблице?

1.3 Junior🔥 251 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Подсчёт количества строк в таблице

Подсчёт строк в таблице - частая операция. Существует несколько способов в зависимости от требований.

1. COUNT(*) - базовый метод

Самый простой способ:

SELECT COUNT(*) FROM users;

Результат: вернёт одно число, например 1000

С алиасом для читаемости:

SELECT COUNT(*) as total_count FROM users;

COUNT(*) считает все строки, включая NULL значения.

2. COUNT(column_name) - считаем не-NULL значения

Различие между COUNT(*) и COUNT(column):

-- Считает все строки (1000)
SELECT COUNT(*) FROM users;

-- Считает только строки где phone не NULL (950)
SELECT COUNT(phone) FROM users;

Пример:

-- Сколько пользователей указали телефон
SELECT COUNT(phone) FROM users;

-- Сколько пользователей не указали телефон
SELECT COUNT(*) - COUNT(phone) FROM users;

3. С условиями WHERE

Подсчёт строк с фильтром:

-- Сколько активных пользователей
SELECT COUNT(*) FROM users WHERE status = active;

-- Сколько заказов, совершённых в 2024 году
SELECT COUNT(*) FROM orders WHERE YEAR(created_at) = 2024;

-- Сколько пользователей из Москвы
SELECT COUNT(*) FROM users WHERE city = Moscow;

4. COUNT с GROUP BY

Количество строк по группам:

-- Количество пользователей в каждом городе
SELECT city, COUNT(*) as user_count 
FROM users 
GROUP BY city;

Результат:

Moscow      450
SPB         320
Yekaterinburg 230

С сортировкой:

SELECT city, COUNT(*) as user_count 
FROM users 
GROUP BY city 
ORDER BY user_count DESC;

5. COUNT(DISTINCT) - уникальные значения

Считаем уникальные значения:

-- Сколько уникальных городов
SELECT COUNT(DISTINCT city) FROM users;

-- Сколько уникальных пользователей сделали заказы
SELECT COUNT(DISTINCT user_id) FROM orders;

6. Сложные условия с CASE

Подсчёт по разным условиям:

SELECT 
    COUNT(*) as total_users,
    COUNT(CASE WHEN status = active THEN 1 END) as active_users,
    COUNT(CASE WHEN status = inactive THEN 1 END) as inactive_users
FROM users;

Результат:

total_users  active_users  inactive_users
1000         750           250

7. Производительность

COUNT(*) оптимизация в СУБД:

  • В PostgreSQL COUNT(*) может использовать индекс
  • В MySQL COUNT(*) очень быстр для всей таблицы
  • Но с WHERE может быть медленным на больших таблицах

Оптимизация с индексами:

-- Добавить индекс на status для быстрого подсчёта
CREATE INDEX idx_status ON users(status);

-- Теперь этот запрос будет быстрым
SELECT COUNT(*) FROM users WHERE status = active;

8. Альтернатива - таблица статистики

Для больших таблиц можно хранить кэш:

CREATE TABLE table_statistics (
    table_name VARCHAR(100),
    row_count INT,
    last_updated TIMESTAMP
);

-- Вместо подсчёта каждый раз
SELECT row_count FROM table_statistics WHERE table_name = users;

Обновление при изменении данных:

  • Триггеры при INSERT/DELETE
  • Периодический пересчёт для точности

9. Информационные схемы БД

Для быстрого получения приблизительного количества:

PostgreSQL:

SELECT n_live_tup FROM pg_stat_user_tables WHERE relname = users;

MySQL:

SELECT TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = users;

Это быстро, но может быть неточно.

10. Практические примеры

Пример 1: Статистика по заказам

SELECT 
    COUNT(*) as total_orders,
    COUNT(DISTINCT user_id) as unique_customers,
    COUNT(CASE WHEN status = completed THEN 1 END) as completed_orders
FROM orders;

Пример 2: Детальный анализ по статусам

SELECT 
    status,
    COUNT(*) as count,
    ROUND(100.0 * COUNT(*) / SUM(COUNT(*)) OVER(), 2) as percentage
FROM orders
GROUP BY status;

Пример 3: Подсчёт с несколькими условиями

SELECT 
    COUNT(*) as total,
    COUNT(CASE WHEN created_at > 2024-01-01 THEN 1 END) as new_users
FROM users;

Пример 4: Временное распределение

SELECT 
    DATE(created_at) as date,
    COUNT(*) as daily_count
FROM orders
GROUP BY DATE(created_at)
ORDER BY date DESC
LIMIT 30;

11. Важные моменты

COUNT(*) vs COUNT(1) vs COUNT(column):

  • COUNT(*) - считает все строки (предпочтительно)
  • COUNT(1) - тоже считает все строки (скорость одинакова)
  • COUNT(column) - считает только не-NULL значения

Для точности:

  • Всегда используй COUNT(*) для общего подсчёта
  • Используй COUNT(column) если нужно исключить NULL
  • Используй COUNT(DISTINCT) для уникальных значений

Производительность на больших таблицах:

  • Без WHERE работает быстро
  • С WHERE может быть медленным
  • Используй индексы на колонках в WHERE
  • Рассмотри кэширование результатов

Правильный выбор метода подсчёта критичен для производительности приложения.