sql >> Databáze >  >> RDS >> Mysql

MySQL:Shrňte všechny počty řádků v tabulce do jediného dotazu

Prvním příkladem kódu je zde uložená procedura, která provede celý proces v jednom kroku, pokud jde o uživatele.

BEGIN

# zgwp_tables_rowcounts
# TableName RowCount
# Outputs a result set listing all tables and their row counts 
# for the current database

SET SESSION group_concat_max_len = 1000000;

SET @sql = NULL;
SET @dbname = DATABASE();

SELECT
  GROUP_CONCAT( 
    CONCAT (
      'SELECT ''',table_name,''' as TableName, COUNT(*) as RowCount FROM ', 
       table_name, ' '
    ) 
    SEPARATOR 'UNION '  
  ) AS Qry
FROM
  information_schema.`TABLES` AS t
WHERE
  t.TABLE_SCHEMA = @dbname AND
  t.TABLE_TYPE = "BASE TABLE"
ORDER BY
  t.TABLE_NAME ASC

INTO @sql
;

PREPARE stmt FROM @sql;

EXECUTE stmt;

END

Poznámky:

  • SELECT..INTO @sql vytvoří potřebný dotaz a PREPARE... EXECUTE jej spustí.

  • Nastaví proměnnou group_concat_max_len, aby umožnil dostatečně dlouhý řetězec výsledků z GROUP_CONCAT.

Výše uvedený postup je užitečný pro rychlý pohled v prostředí správce, jako je Navicat, nebo na příkazovém řádku. Navzdory tomu, že vrací sadu výsledků, pokud je mi známo, nelze na ni odkazovat v jiném pohledu nebo dotazu, pravděpodobně proto, že MySQL není schopno před spuštěním určit, jaké sady výsledků vytváří, natož jaké sloupce mají .

Stále je tedy užitečné mít možnost rychle vytvořit, bez ručních úprav, samostatný příkaz SELECT...UNION, který lze použít jako pohled. To je užitečné, pokud chcete připojit počty řádků k jiným informacím o tabulce z jiné tabulky. Zde další uložená procedura:

BEGIN

# zgwp_tables_rowcounts_view_statement
# Output: SelectStatement
# Outputs a single row and column, containing a (possibly lengthy)
# SELECT...UNION statement that, if used as a View, will output
# TableName RowCount for all tables in the current database.

SET SESSION group_concat_max_len = 1000000;
SET @dbname = DATABASE();

SELECT
  GROUP_CONCAT( 
    CONCAT (
      'SELECT ''',table_name,''' as TableName, COUNT(*) as RowCount FROM ', 
      table_name, ' ', CHAR(10)) 
    SEPARATOR 'UNION '  
  ) AS SelectStatement
FROM
  information_schema.`TABLES` AS t
WHERE
  t.TABLE_SCHEMA = @dbname AND
  t.TABLE_TYPE = "BASE TABLE"
ORDER BY
  t.TABLE_NAME ASC
;
END

Poznámky

  • Velmi podobný prvnímu postupu v konceptu. Přidal jsem zalomení řádku (CHAR(10)) do každého příkazu „SELECT...UNION“ dceřiné společnosti pro usnadnění prohlížení nebo úpravy příkazu.

  • Můžete to vytvořit jako funkci a vrátit SelectStatement, pokud je to pro vaše prostředí výhodnější.

Doufám, že to pomůže.




  1. SQLAlchemy Reflection:Jak mohu dotazovat data z konkrétních sloupců?

  2. Jak vygenerovat stromové zobrazení z této sady výsledků založené na algoritmu Tree Traversal Algorithm?

  3. Vložte data a nastavte cizí klíče pomocí Postgres

  4. Jak exportovat výsledek dotazu do Excelu v Oracle SQL Developer?