通过 SQL 查询获取特定数据库的所有表名?

Posted

技术标签:

【中文标题】通过 SQL 查询获取特定数据库的所有表名?【英文标题】:Get all table names of a particular database by SQL query? 【发布时间】:2011-04-24 05:44:30 【问题描述】:

我正在开发可以处理多个数据库服务器的应用程序,例如“mysql”和“MS SQL Server”。

我想使用适用于所有数据库类型的通用查询来获取特定数据库的表名。我试过以下:

SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE='BASE TABLE'

但它给出了特定服务器的所有数据库的表名,但我只想获取选定数据库的表名。如何限制此查询以获取特定数据库的表?

【问题讨论】:

对于Mysql,你可以做的很简单。显示表格; 【参考方案1】:

可能是由于不同的 sql dbms 处理模式的方式。

试试下面的

对于 SQL Server:

SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_CATALOG='dbName'

对于 MySQL:

SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA='dbName' 

对于 Oracle,我认为相当于使用 DBA_TABLES

【讨论】:

当我在一个数据库 (SQL Server) 中有不同的表模式时,我更喜欢这个解决方案: SELECT CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_CATALOG ='MyDB' 必须使用特定的 DB 来获取信息。 USE dbName GO 用于 SQL 服务器。如果您没有使用 DB,则不会显示结果,即使该 DB 中有表。 对于Mysql,你可以做的很简单。显示表格; 在 Server 2014 上没有 USE dbName GO 前缀的情况下,SQL Server 条目对我来说可以正常工作。 1) 你为 SQL Server 和 MySQL 提出了同样的建议 2) INFORMATION_SCHEMA.TABLES 只存在于 MySQL 3) 我真的很想知道你怎么会得到这么多的赞成...跨度> 【参考方案2】:

盗自here:

USE YOURDBNAME
GO 
SELECT *
FROM sys.Tables
GO

【讨论】:

最有可能 SELECT Name FROM sys.Tables where is_ms_shipped = 0 这是特定于数据库提供程序的,与 ANSI SQL 不兼容。 另外,SELECT * FROM yourdbname.sys.Tables;如果你喜欢更简洁。至少在 SQL Server 中工作。 小心使用 sys.Tables,因为您没有考虑架构,所以最终可能会使用多个名称。两个完全相同名称但架构不同的表将显示两次【参考方案3】:

以下查询将选择名为 DBName 的数据库中的所有 Tables

USE DBName
GO 
SELECT *
FROM sys.Tables
GO

【讨论】:

不,它只是部分分隔符。你可以改成其他的。它不是T-SQL语法。 使用 DatabaseSample SELECT * FROM sys.Tables【参考方案4】:
USE DBName;
SELECT * FROM sys.Tables;

我们可以不用GO来处理你可以使用分号;

【讨论】:

对于 Azure 上的 SQL Server,这对我有用,但接受的答案没有。谢谢。【参考方案5】:

只需将DATABASE NAME 放在INFORMATION_SCHEMA.TABLES 前面即可:

select table_name from YOUR_DATABASE.INFORMATION_SCHEMA.TABLES where TABLE_TYPE = 'BASE TABLE'

【讨论】:

【参考方案6】:

在mysql中,使用:

SHOW TABLES;

选择数据库后:

USE db_name

【讨论】:

Osm,,, swt n 短 这是 MySQL,问题标记为 MSSQL 服务器 @Melle 看问题描述 这不是最佳答案,请参阅我在接受(和正确)答案下的评论。【参考方案7】:

我没有看到这个答案,但这就是我所做的:

SELECT name FROM databaseName.sys.Tables;

【讨论】:

【参考方案8】:

如果有人想在不使用“use”关键字的情况下列出特定数据库中的所有表:

SELECT TABLE_NAME FROM databasename.INFORMATION_SCHEMA.TABLES

【讨论】:

【参考方案9】:

这很好用

选择 * 从 information_schema.tables;

【讨论】:

【参考方案10】:

选择下面的数据库查询:

use DatabaseName

现在

SELECT * FROM INFORMATION_SCHEMA.TABLES

现在您可以在控制台中看到创建的表格。

PFA。

【讨论】:

【参考方案11】:

对于Mysql,你可以做的很简单。 显示表格;

【讨论】:

【参考方案12】:
select * from sys.tables
order by schema_id      --comments: order by 'schema_id' to get the 'tables' in 'object explorer order'
go

【讨论】:

您能否详细说明一下您的意思?也许解释一下?【参考方案13】:
Exec sp_MSforeachtable 'Select ''?'''

【讨论】:

嗨 Amirreza,我相信你在谈论 sp_MSforeachtable @bummi:很好,感谢您的关注,抱歉输入错误。已编辑【参考方案14】:
USE dbName;

SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE (TABLE_SCHEMA = 'dbName' OR TABLE_SCHEMA = 'schemaName')
ORDER BY TABLE_NAME

如果您在 MS SQL 服务器上使用多个模式,那么在不同时选择 TABLE_SCHEMA 的情况下选择 TABLE_NAME 可能效果有限,因此我假设我们在使用 MS 时对属于已知模式的表感兴趣SQL 服务器。

我已经使用我自己的 SQL Server 数据库使用 SQL Server Management Studio 和使用 MySQL 数据库的 MySQL Workbench 测试了上面的查询,在这两种情况下它都给出了表名。

该查询将 Michael Baylon 的两个不同查询合并为一个,然后可以在任一数据库类型上运行。 WHERE 子句的第一部分适用于 MySQL 数据库,第二部分(在 OR 之后)适用于 MS SQL Server 数据库。它很丑陋并且在逻辑上有点不正确,因为它假设没有与数据库同名的不需要的模式。这可能对正在寻找一个可以在任一数据库服务器上运行的单个查询的人有所帮助。

【讨论】:

【参考方案15】:

最新版 MSSQL SERVER (17.7) 更新

SELECT name FROM sys.Tables WHERE type_desc = 'USER_TABLE'

SELECT * 获取所有列。

【讨论】:

我刚刚意识到这个查询对表名中的非英文字符给出了错误的结果,而 Michael Baylon 给出了正确的结果。 (字符是土耳其语小写“ı”)【参考方案16】:

在我们的 Oracle DB (PL/SQL) 中,下面的代码用于获取我们数据库中所有存在的表的列表。

select * from tab;

select table_name from tabs;

两者都在工作。让我们试着找到你的。

【讨论】:

【参考方案17】:

是的预言机是:

select * from user_tables

如果您只想要登录的user/schema 拥有的对象,否则您可以使用包含系统表的all_tablesdba_tables

【讨论】:

他们正在寻找跨提供商查询而不是特定于提供商的查询。 从 sql 中没有一致的方法可以做到这一点,因为所有 db 引擎都以不同的方式实现数据字典。如果这是编程要求,则可以使用 jdbc/odbc 和 3GL 语言(例如 C/Java/C#)来抽象它,如果您对每个数据库都有不同的实现,则绝对有可能。运营商应该澄清他们的要求......【参考方案18】:

根据 Michael Baylon 的回答,我需要一个列表,其中还包含架构信息,这就是我修改他的查询的方式。

SELECT TABLE_SCHEMA + '.' + TABLE_NAME as 'Schema.Table'
  FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_CATALOG = 'dbName'
  ORDER BY TABLE_SCHEMA, TABLE_NAME

【讨论】:

【参考方案19】:

在 Mysql 中使用以下 SQL 轻松获取所有重要信息

    SELECT t.TABLE_NAME , t.ENGINE , t.TABLE_ROWS ,t.AVG_ROW_LENGTH, 
t.INDEX_LENGTH FROM 
INFORMATION_SCHEMA.TABLES as t where t.TABLE_SCHEMA = 'YOURTABLENAMEHERE' 
order by t.TABLE_NAME ASC limit 10000;

【讨论】:

【参考方案20】:

对于 postgres,它将是:

SELECT table_name
FROM INFORMATION_SCHEMA.TABLES
WHERE table_schema  = 'your_schema' -- probably public 

【讨论】:

【参考方案21】:

显示表格列表

   SHOW TABLES FROM DBNAME        

【讨论】:

OP 明确表示 SQL Server 不是 mysql - 如果您添加解释,它将有助于改善您的答案

以上是关于通过 SQL 查询获取特定数据库的所有表名?的主要内容,如果未能解决你的问题,请参考以下文章

sql获取mysql所有数据库,表名

如何查询一个oracle数据库中所有表的所有字段哪个包含特定字符串?

SQL查询从数据库中的一个表中获取所有帖子,但来自特定用户的最多5个条目? [复制]

T-SQL数据查询基础

如何从 SQL 查询中获取表名?

oracle 语句之对数据库的表名就行模糊查询,对查询结果进行遍历,依次获取每个表名结果中的每个字段