Truy vấn INFORMATION_SCHEMA
Sử dụng INFORMATION_SCHEMA.SCHEMATA (danh sách database) JOIN INFORMATION_SCHEMA.TABLES (danh sách bảng).
Truy vấn
SELECT
my_schema.SCHEMA_NAME,
GROUP_CONCAT(tbl.TABLE_NAME) AS tables
FROM INFORMATION_SCHEMA.SCHEMATA my_schema
LEFT JOIN INFORMATION_SCHEMA.TABLES tbl
ON my_schema.SCHEMA_NAME = tbl.TABLE_SCHEMA
GROUP BY my_schema.SCHEMA_NAME;
Kết quả mẫu (rút gọn)
+---------------------------+--------------------------------------------------+
| SCHEMA_NAME | tables |
+---------------------------+--------------------------------------------------+
| business | addconstraintdemo, employeetable, student... |
| information_schema | COLUMNS, TABLES, STATISTICS, ROUTINES... |
| mysql | db, user, tables_priv, columns_priv, help_topic |
| performance_schema | events_waits_current, file_summary_by_instance...|
| sys | host_summary, io_global_by_file, ... |
| web | demotable492, demotable500, DemoTable... |
+---------------------------+--------------------------------------------------+
Giải thích
LEFT JOIN: Giữ cả database không có bảng (tables = NULL).GROUP_CONCAT: Gom tên bảng thành 1 chuỗi.TABLE_SCHEMAtrong TABLES khớp vớiSCHEMA_NAMEtrong SCHEMATA.
Các truy vấn hữu ích khác
-- Chỉ database do user tạo (loại system db)
SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME NOT IN ('information_schema','mysql','performance_schema','sys');
-- Đếm số bảng mỗi database
SELECT TABLE_SCHEMA, COUNT(*) AS table_count
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
GROUP BY TABLE_SCHEMA;
-- Tìm bảng theo pattern tên
SELECT TABLE_SCHEMA, TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE '%user%';
Lưu ý
GROUP_CONCATcó giới hạn độ dài (mặc định 1024) → kết quả có thể bị cắt. DùngSET SESSION group_concat_max_len = 1000000;trước khi chạy.- Quyền truy cập: Cần quyền
SELECTtrênINFORMATION_SCHEMA(thường user thường có). - MySQL 8.0: Có thể dùng
SHOW DATABASES+SHOW TABLES FROM dbtrong script, nhưng INFORMATION_SCHEMA linh hoạt hơn cho reporting.