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

423

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

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

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

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


1
对于Mysql,您可以执行简单的命令。SHOW TABLES; - Ashish Gupta
22个回答

656

可能是因为不同的SQL数据库管理系统处理模式的方式不同。

请尝试以下操作:

对于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


3
当我在一个数据库中有不同的表结构时(SQL Server),我更喜欢使用这个解决方案: SELECT CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_CATALOG='MyDB'该语句将返回在名称为"MyDB"的数据库中,类型为“BASE TABLE”的所有表的模式和表名。 - Verena Haunschmid
7
要获取信息,必须使用特定的数据库(DB)。 对于 SQL-Server,需要使用“USE dbName GO”命令。如果不使用该数据库,则即使其中有表格,结果也不会显示出来。 - phougatv
3
对于Mysql,你可以轻松地执行以下操作:SHOW TABLES; - Ashish Gupta
在2014服务器上,对于我来说,SQL Server条目没有“USE dbName GO”前缀也可以正常工作。 - Mmm
  1. 你建议了同样的事情适用于SQL Server和MySQL
  2. INFORMATION_SCHEMA.TABLES仅存在于MySQL中
  3. 我真的很想知道为什么你会因此获得这么多赞...
- Apostolos
这是正确的答案!SHOW TABLES 只是查询实际信息模式的覆盖层。如果您想从单个数据库中选择表格,SHOW TABLES 将失败。 - Chiwda

102

以下内容摘自这里

USE YOURDBNAME
GO 
SELECT *
FROM sys.Tables
GO

5
最有可能的情况是:选择非系统自带的表的名称,可以使用以下代码:SELECT Name FROM sys.Tables where is_ms_shipped = 0。 - om471987
1
这是特定于数据库提供程序的,而不是符合ANSI SQL标准的。 - cjb110
3
或者,如果您更喜欢简洁一些,可以使用SELECT * FROM yourdbname.sys.Tables;。至少在SQL Server中有效。 - buckminst
小心使用sys.Tables,因为您没有考虑模式,可能会出现多个名称的情况。两个具有相同名称但不同模式的表将显示两次。 - Maximiliano Rios

42
以下查询将选择名为DBName的数据库中所有的
USE DBName
GO 
SELECT *
FROM sys.Tables
GO

不是T-SQL语法。请勿使用“NO it only Part seperator”。您可以更改为其他内容。 - anishMarokey
1
使用 DatabaseSample 选择 * 从 sys.Tables - Hamzeh Soboh

20

只需将DATABASE NAME放在INFORMATION_SCHEMA.TABLES之前:

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

19
USE DBName;
SELECT * FROM sys.Tables;

如果你使用分号;,我们可以不使用GO


3
对于在 Azure 上的 SQL Server,这个方法适用于我,但被接受的答案则不行。谢谢。 - Jonah

13
在MySQL中,使用:

SHOW TABLES;

选择数据库后:

USE db_name

1
Osm,,,swt n短 - Deepa MG
这是MySQL,问题标记为MSSQL服务器。 - Melle
@Melle 看一下问题的描述。 - Lorenzo Lerate
这不是最好的答案,看看我在被接受的(正确的)答案下面的评论。 - Chiwda

11

这很好用

选择 * 从 information_schema.tables;


11

如果有人想要列出特定数据库中的所有表,而又不想使用"USE"关键字,则可以按以下步骤操作:


SELECT TABLE_NAME FROM databasename.INFORMATION_SCHEMA.TABLES

通过使用上面的查询,您将获得所有表格。如果您只想获取在 public > table 中的表格,请添加以下内容: SELECT TABLE_NAME FROM postgres.INFORMATION_SCHEMA.tables WHERE table_schema = public 请记住使用 postgres 。 - Arqam Rafay

7

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

SELECT name FROM databaseName.sys.Tables;

7
为了选择下面的数据库查询语句:
use DatabaseName

现在
SELECT * FROM INFORMATION_SCHEMA.TABLES

现在你可以在控制台下面看到创建的表格。

PFA。

Query


非常感谢。 - Ritesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接