Skip to content

MySQL - 显示表

作为开发人员或数据库管理员,您经常需要列出数据库中的表。这对于理解数据库模式(schema)、调试或编写动态脚本至关重要。MySQL 提供了两种主要方法:方便的 SHOW TABLES 命令和更强大、更标准的 INFORMATION_SCHEMA。

SHOW TABLES 是 MySQL 特有的命令,提供了一种快速简便的方式来查看当前数据库中所有非临时表、视图或序列。

要使用它,首先选择一个数据库,然后运行该命令。

USE my_database;
SHOW TABLES;

假设我们有一个名为 company_db 的数据库,其中包含一些表。

USE company_db;

执行 SHOW TABLES; 将产生如下结果:

company_db 中的表
departments
employees
projects
salaries

该命令有几个有用的修饰符:

  • 从另一个数据库列出:SHOW TABLES FROM another_db; 或 SHOW TABLES IN another_db;。
  • 使用 LIKE 过滤:使用通配符(% 表示任意字符,_ 表示单个字符)来查找匹配特定模式的表。SHOW TABLES LIKE 'proj%'; 将列出以 ‘proj’ 开头的表。
  • 使用 WHERE 过滤:您可以对输出应用 WHERE 子句。SHOW TABLES WHERE Tables_in_company_db = 'employees';。
  • 使用 FULL 获取更多信息:SHOW FULL TABLES; 会添加一个 Table_type 列,显示对象是 BASE TABLE(基本表)还是 VIEW(视图)。
-- 使用 FULL 修饰符的示例
SHOW FULL TABLES;
-- 输出如下所示:
-- +-----------------------+------------+
-- | Tables_in_company_db | Table_type |
-- +-----------------------+------------+
-- | departments | BASE TABLE |
-- | employees | BASE TABLE |
-- | projects | BASE TABLE |
-- | salaries | BASE TABLE |
-- +-----------------------+------------+

INFORMATION_SCHEMA 是一个标准、只读的数据库,存在于所有现代 SQL 数据库中。它包含关于数据库系统本身的元数据(metadata),包括数据库、表、列和权限的信息。查询它是获取模式信息最灵活且符合 SQL 标准的方式。

最佳实践:对于需要检查数据库模式的应用程序代码或复杂脚本,优先使用 INFORMATION_SCHEMA。它在不同 SQL 数据库之间更具可移植性,并且比 SHOW 命令更强大。

要列出表,您需要查询 INFORMATION_SCHEMA 中的 TABLES 表。

SELECT table_name, table_type
FROM INFORMATION_SCHEMA.TABLES
WHERE table_schema = 'company_db';

这为您提供了与 SHOW FULL TABLES 相同的信息,但拥有 SELECT 语句的全部功能。您可以添加更复杂的 WHERE 子句,与其他元数据表(如 COLUMNS)进行 JOIN,并对结果进行排序。

SELECT DISTINCT T.table_name
FROM INFORMATION_SCHEMA.TABLES AS T
JOIN INFORMATION_SCHEMA.COLUMNS AS C
ON T.table_schema = C.table_schema AND T.table_name = C.table_name
WHERE T.table_schema = 'company_db' AND C.column_name = 'employee_id';

以下是使用各种编程语言从特定数据库获取和显示表列表的现代示例。

Python
Node.js
Java
PHP
此 Python 示例使用 `mysql-connector-python` 并查询 `INFORMATION_SCHEMA` 以提供一个健壮的解决方案。
```python
import mysql.connector
import os
def list_tables_in_database(db_name):
"""列出给定数据库中的所有基本表。"""
connection = None
try:
connection = mysql.connector.connect(
host=os.getenv('DB_HOST', 'localhost'),
user=os.getenv('DB_USER', 'root'),
password=os.getenv('DB_PASSWORD', 'password'),
database=db_name
)
cursor = connection.cursor()
# 使用标准的 INFORMATION_SCHEMA 是一个最佳实践。
query = "SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = %s AND table_type = 'BASE TABLE'"
cursor.execute(query, (db_name,))
print(f"数据库 '{db_name}' 中的表:")
tables = [item[0] for item in cursor.fetchall()]
if tables:
for table_name in tables:
print(f"- {table_name}")
else:
print("No tables found.")
except mysql.connector.Error as err:
print(f"Error: {err}")
finally:
if connection and connection.is_connected():
cursor.close()
connection.close()
# --- 运行示例 ---
list_tables_in_database('company_db')

Output:

Tables in database 'company_db':
- departments
- employees
- projects
- salaries

此 Node.js 示例使用 mysql2/promise 结合 async/await 和简单的 SHOW TABLES 命令。

const mysql = require('mysql2/promise');
async function listTables(dbName) {
let connection;
try {
connection = await mysql.createConnection({
host: process.env.DB_HOST || 'localhost',
user: process.env.DB_USER || 'root',
password: process.env.DB_PASSWORD || 'password',
database: dbName
});
const [rows] = await connection.execute('SHOW TABLES');
console.log(`数据库 '${dbName}' 中的表:`);
if (rows.length > 0) {
// 列名为 'Tables_in_[dbName]'
const key = Object.keys(rows[0])[0];
rows.forEach(row => {
console.log(`- ${row[key]}`);
});
} else {
console.log('No tables found.');
}
} catch (error) {
console.error(`Database error: ${error.message}`);
} finally {
if (connection) await connection.end();
}
}
// --- 运行示例 ---
listTables('company_db');

Output:

Tables in database 'company_db':
- departments
- employees
- projects
- salaries

此 Java 示例使用现代 JDBC 结合 try-with-resources。它在不执行手动查询的情况下检索表元数据。

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
public class ShowTablesExample {
private static final String DB_URL = "jdbc:mysql://localhost:3306/company_db";
private static final String DB_USER = "root";
private static final String DB_PASSWORD = "password";
public static void main(String[] args) {
// try-with-resources 确保连接和结果集被关闭
try (Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD)) {
DatabaseMetaData metaData = conn.getMetaData();
// 获取当前目录(数据库)、模式中的表,不指定特定名称模式,并且只获取 'TABLE' 类型
try (ResultSet tables = metaData.getTables(null, null, "%", new String[]{"TABLE"})) {
System.out.println("数据库 'company_db' 中的表:");
while (tables.next()) {
String tableName = tables.getString("TABLE_NAME");
System.out.println("- " + tableName);
}
}
} catch (SQLException e) {
System.err.println("SQL Error: " + e.getMessage());
e.printStackTrace();
}
}
}

Output:

Tables in database 'company_db':
- departments
- employees
- projects
- salaries

此 PHP 示例使用 mysqli 扩展,采用面向对象风格和健壮的错误处理。

<?php
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'password';
$dbname = 'company_db';
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
try {
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
$query = "SHOW TABLES";
$result = $mysqli->query($query);
echo "数据库 '$dbname' 中的表:\n";
if ($result->num_rows > 0) {
while ($row = $result->fetch_array()) {
echo "- " . $row[0] . "\n";
}
} else {
echo "No tables found.\n";
}
$result->free();
$mysqli->close();
} catch (mysqli_sql_exception $e) {
echo "Database Error: " . $e->getMessage() . "\n";
exit();
}
?>

Output:

Tables in database 'company_db':
- departments
- employees
- projects
- salaries