Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

MySQL:Ringkas semua jumlah baris tabel dalam satu kueri

Contoh kode pertama di sini adalah prosedur tersimpan yang melakukan seluruh proses dalam satu langkah, sejauh menyangkut pengguna.

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

Catatan:

  • SELECT..INTO @sql membuat kueri yang diperlukan, dan PREPARE... EXECUTE menjalankannya.

  • Menyetel variabel group_concat_max_len untuk memungkinkan string hasil yang cukup panjang dari GROUP_CONCAT.

Prosedur di atas berguna untuk melihat sekilas di lingkungan admin seperti Navicat, atau di baris perintah. Namun, meskipun mengembalikan set hasil, sejauh yang saya tahu itu tidak dapat direferensikan di Tampilan atau Kueri lain, mungkin karena MySQL tidak dapat menentukan, sebelum menjalankannya, set hasil apa yang dihasilkannya, apalagi kolom apa yang mereka miliki .

Jadi, masih berguna untuk dapat dengan cepat menghasilkan, tanpa pengeditan manual, pernyataan SELECT...UNION terpisah yang dapat digunakan sebagai Tampilan. Itu berguna jika Anda ingin menggabungkan jumlah baris ke beberapa info per tabel lainnya dari tabel lain. Dengan ini prosedur tersimpan lainnya:

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

Catatan

  • Sangat mirip dengan prosedur pertama dalam konsep. Saya menambahkan linebreak (CHAR(10)) ke setiap pernyataan anak perusahaan "SELECT...UNION", untuk kemudahan dalam melihat atau mengedit pernyataan.

  • Anda dapat membuat ini sebagai fungsi dan mengembalikan SelectStatement, jika itu lebih nyaman untuk lingkungan Anda.

Semoga membantu.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kolom dihitung dari kolom lain?

  2. Memegang banyak item dalam kolom di mysql

  3. mysql pilih tanggal tanpa tabel

  4. Memperbarui tabel di pemicu setelah memperbarui di tabel yang sama

  5. Dalam SQL, bolehkah dua tabel saling merujuk?