Объединение результатов count(*) из разных таблиц в SQL

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для слияния количества записей из различных таблиц в SQL используйте оператор UNION ALL в подзапросах. Не забывайте присваивать каждому результату подзапроса псевдоним для удобства чтения:

SQL
Скопировать код
SELECT 'Table1' AS TableName, COUNT(*) AS Count FROM Table1
UNION ALL
SELECT 'Table2', COUNT(*) FROM Table2
UNION ALL
SELECT 'Table3', COUNT(*) FROM Table3;

Этот запрос возвращает объединённый список количества записей из указанных таблиц в единую выдачу.

Кинга Идем в IT: пошаговый план для смены профессии

Вычисление общего итогового количества

Если вам требуется подсчитать общее количество записей по всем таблицам, оберните выражения COUNT(*) в один подзапрос и вычислите общую сумму:

SQL
Скопировать код
SELECT SUM(Count) AS TotalCount FROM (
  SELECT COUNT(*) AS Count FROM Table1
  UNION ALL
  SELECT COUNT(*) FROM Table2
  UNION ALL
  SELECT COUNT(*) FROM Table3
) AS SubQuery;

Данный запрос покажет одно число, отображающее общее количество записей в выбранных таблицах.

Применение фильтров перед подсчётом

Если нужно учесть определённые фильтры при подсчёте строк, добавьте в каждый подзапрос соответствующий фильтр WHERE:

SQL
Скопировать код
SELECT SUM(Count) AS TotalCountFiltered FROM (
  SELECT COUNT(*) AS Count FROM Table1 WHERE Condition1
  UNION ALL
  SELECT COUNT(*) FROM Table2 WHERE Condition2
  UNION ALL
  SELECT COUNT(*) FROM Table3 WHERE Condition3
) AS SubQuery;

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

Визуализация

Приставьте, что каждая таблица представляет собой отдельный склад в логистическом центре. Наша цель – подсчитать количество товаров на каждом складе:

Markdown
Скопировать код
Логистический центр:
📦 Таблица 1 (Коробки)
🗄️ Таблица 2 (Шкафы)
💼 Таблица 3 (Портфели)

Инвентаризация:
🔢📦 **Количество** коробок: SELECT COUNT(*) FROM Table1;
🔢🗄️ **Количество** шкафов: SELECT COUNT(*) FROM Table2;
🔢💼 **Количество** портфелей: SELECT COUNT(*) FROM Table3;

Общий объём на складе:
📈 Итого: 📦 + 🗄️ + 💼 = **Общий инвентарь** на всех складах

Общее количество товаров определяем при помощи UNION ALL:

SQL
Скопировать код
SELECT 'Boxes' AS ItemType, COUNT(*) AS Quantity FROM Table1
UNION ALL
SELECT 'Cabinets', COUNT(*) FROM Table2
UNION ALL
SELECT 'Briefcases', COUNT(*) FROM Table3;

Таким образом, мы подсчитываем количество каждого вида товаров, организуя всё в одном SQL-запросе.

Освоение особенностей

Мгновенный ответ для больших баз данных

При работе с большими массивами данных возможно значительное снижение производительности, особенно при использовании оператора UNION ALL. Для оптимизации можно использовать промежуточные подсчёты через индексированные представления или временные таблицы:

SQL
Скопировать код
-- Создание временной таблицы для результатов из Table1
SELECT COUNT(*) as Count INTO #Temp FROM Table1;

-- Оптимизация за счет индексации
CREATE CLUSTERED INDEX idx_temp ON #Temp (Count);

-- Аналогичное действие для Table2
INSERT INTO #Temp SELECT COUNT(*) FROM Table2;

-- Подсчет общего количества
SELECT SUM(Count) FROM #Temp;

Обеспечение согласованности схем

При работе с таблицами разных схем важно использовать псевдонимы AS для обеспечения корректной обработки столбцов COUNT(*) при использовании UNION ALL. Единообразие наименований колонок крайне важно:

SQL
Скопировать код
SELECT COUNT(*) AS UniversalCount FROM TableWithDifferentSchema WHERE Condition1
UNION ALL
SELECT COUNT(DifferentColumn) FROM AnotherTable WHERE Condition2;

Управление сложными фильтрами с помощью CTE

Сложные фильтры могут усложнить SQL-запросы, превращая их в "спагетти-код". Используйте Общие Табличные Выражения (CTE) для структурирования логики фильтрации до подсчета. Это повысит читаемость и производительность запроса.

SQL
Скопировать код
WITH CTE_Table1 AS (
  SELECT * FROM Table1 WHERE ComplexCondition1
),
CTE_Table2 AS (
  SELECT * FROM Table2 WHERE ComplexCondition2
)
SELECT SUM(Count) AS TotalCount FROM (
  SELECT COUNT(*) AS Count FROM CTE_Table1
  UNION ALL
  SELECT COUNT(*) FROM CTE_Table2
) AS SubQuery;

Полезные материалы

  1. Использование подзапросов в инструкциях SELECT – Документация MySQL – Подробно об использовании подзапросов в SQL.
  2. Общие Табличные Выражения (CTE) – Руководство по SQL Server – Глубокое погружение в CTE.
  3. Агрегатные функции в SQL – Учебный курс w3schools – Подробное объяснение функций COUNT, AVG, SUM.
  4. Особенности использования подзапросов для объединения результатов – DBA Stack Exchange – Обсуждение с примерами, полезное при изучении темы объединения результатов из подзапросов.
  5. Оптимизация SQL-запросов с использованием UNION – Essential SQL – Статья о том, как эффективно использовать UNION в запросах.