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


304

我正在研究可以处理多个数据库服务器(如“ MySQL”和“ MS SQL Server”)的应用程序。

我想使用适合所有数据库类型的常规查询来获取特定数据库的表名。我尝试了以下方法:

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

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


1
对于Mysql,您可以做的简单。显示表;
Ashish Gupta

Answers:


500

可能由于不同的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


3
当我在一个数据库(SQL Server)中具有不同的表模式时,我更喜欢这种解决方案:从INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE ='BASE TABLE'和TABLE_CATALOG ='MyDB'中选择CONCAT(TABLE_SCHEMA,'。',TABLE_NAME)
Verena Haunschmid

3
必须使用该特定的数据库来获取信息。USE dbName GO对于SQL Server。如果您不使用数据库,即使该数据库中有表,也不会显示结果。
barnes

2
对于Mysql,您可以做的简单。显示表;
Ashish Gupta

SQL Server条目对我来说可以正常工作,而无需USE dbName GO在Server 2014上添加前缀
。– Mmm

1)对于SQL Server和MySQL,您提出了相同的建议2)仅在MySQL中存在INFORMATION_SCHEMA.TABLES 3)我真的很想知道您为什么为此获得如此多的投票...
Apostolos

82

这里被盗:

USE YOURDBNAME
GO 
SELECT *
FROM sys.Tables
GO

3
最有可能从sys.tables中选择名称,其中is_ms_shipped = 0
om471987 2013年

1
这是特定于数据库提供程序的,与ANSI SQL不兼容。
cjb110 2014年

1
或者,选择* FROM yourdbname.sys.Tables; 如果您想更简洁。至少在SQL Server中有效。
buckminst

29

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

USE DBName
GO 
SELECT *
FROM sys.Tables
GO

不,它只是部分分隔符。您可以更改为其他。它不是T-SQL语法。
anishMarokey

1
USE DatabaseSample SELECT * FROM sys.Tables
Hamzeh Soboh

17
USE DBName;
SELECT * FROM sys.Tables;

我们可以GO在没有就位的情况下处理您可以使用分号的情况;


3
对于Azure上的SQL Server,这对我有用,但是没有被接受的答案。谢谢。
乔纳2015年

14

只要把DATABASE NAME前面INFORMATION_SCHEMA.TABLES

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




2
select * from sys.tables
order by schema_id      --comments: order by 'schema_id' to get the 'tables' in 'object explorer order'
go

您是否有机会详细说明您的意思?也许可以解释一下?
2014年


1
USE dbName;

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

如果要在MS SQL Server上使用多个架构,则在不同时选择TABLE_SCHEMA的情况下选择TABLE_NAME的选择可能会带来有限的收益,因此,我假定我们对使用MS SQL Server时属于已知架构的表感兴趣。

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

该查询将Michael Baylon的两个不同查询合并为一个查询,然后可以在任何一种数据库类型上运行。WHERE子句的第一部分在MySQL数据库上工作,第二部分(在OR之后)在MS SQL Server数据库上工作。这很丑陋,并且在逻辑上有点不正确,因为它假定不存在与数据库同名的不想要的架构。这可能会帮助正在寻找可以在任一数据库服务器上运行的单个查询的人。


1

MSSQL SERVER的最新版本(17.7)的更新

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

SELECT *获取所有列。


我只是意识到,此查询为表名中的非英语字符给出了错误的结果,而迈克尔·贝隆的给出了正确的结果。(字符为土耳其语小写“ı”)
onur demir

1

要在下面选择数据库查询:

use DatabaseName

现在

SELECT * FROM INFORMATION_SCHEMA.TABLES

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

PFA。

询问


0

是的,oracle是:

select * from user_tables

也就是说,如果您只希望登录的对象拥有,user/schema否则可以使用all_tablesdba_tables包含系统表。


他们正在寻找非提供商特定的跨提供商查询。
cjb110 2014年

由于所有db引擎都以不同的方式实现数据字典,因此从sql中没有统一的方法来执行此操作。如果这是程序性要求,则可能可以使用jdbc / odbc和3GL语言(例如C / Java / C#)来抽象化,如果每个数据库都有不同的实现,则绝对可以。操作人员应阐明他们的要求...
kayakpim 2014年

0

根据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

0

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

select * from tab;

select table_name from tabs;

两者都在工作。让我们尝试找到您的。


0

只需在MySQL中的SQL下面获取所有improtanat信息

    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;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.