Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL:Podsumuj wszystkie liczby wierszy w tabeli w jednym zapytaniu

Pierwszy przykładowy kod tutaj jest procedurą składowaną, która wykonuje cały proces w jednym kroku, o ile dotyczy to użytkownika.

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

Uwagi:

  • SELECT..INTO @sql tworzy niezbędne zapytanie, a PREPARE... EXECUTE uruchamia je.

  • Ustawia zmienną group_concat_max_len, aby umożliwić wystarczająco długi ciąg wynikowy z GROUP_CONCAT.

Powyższa procedura jest przydatna do szybkiego przeglądania w środowisku administratora, takim jak Navicat, lub w wierszu poleceń. Jednak pomimo zwracania zestawu wyników, o ile wiem, nie można się do niego odwoływać w innym widoku lub zapytaniu, prawdopodobnie dlatego, że MySQL nie jest w stanie określić, przed uruchomieniem go, jakie zestawy wyników generuje, nie mówiąc już o tym, jakie kolumny mają .

Dlatego nadal przydatna jest możliwość szybkiego tworzenia, bez ręcznej edycji, oddzielnej instrukcji SELECT...UNION, której można użyć jako widoku. Jest to przydatne, jeśli chcesz połączyć liczbę wierszy z innymi informacjami na tabelę z innej tabeli. Z inną procedurą składowaną:

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

Notatki

  • Bardzo podobny do pierwszej procedury w koncepcji. Dodałem łamanie linii (CHAR(10)) do każdej instrukcji pomocniczej „SELECT...UNION”, aby ułatwić przeglądanie lub edycję instrukcji.

  • Możesz utworzyć to jako funkcję i zwrócić SelectStatement, jeśli jest to wygodniejsze dla twojego środowiska.

Mam nadzieję, że to pomoże.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP:zaktualizuj wiele pól MySQL w jednym zapytaniu

  2. MySQL NET Connect 6.7.2 w Visual Studio 2012

  3. Symulacja polecenia ORDER BY FIELD() MySQL w Postgresql

  4. Jak mogę postawić dwa warunki w posiadaniu klauzuli?

  5. Korzystanie z MySQL C API - sprawdź powodzenie wstawiania wierszy za pomocą przygotowanych instrukcji