ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

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

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

I
Ian Kemp

可能是由于不同的 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) 我真的很想知道你怎么会得到这么多的支持...
b
bla

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,您可能会得到多个名称,因为您没有考虑架构。两个具有不同架构的完全相同名称的表将显示两次
C
Cody Gray

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

USE DBName
GO 
SELECT *
FROM sys.Tables
GO

不,它只是部分分隔符。您可以更改为其他。它不是 T-SQL 语法。
使用 DatabaseSample SELECT * FROM sys.Tables
A
Arman H

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

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

C
Community
USE DBName;
SELECT * FROM sys.Tables;

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


对于 Azure 上的 SQL Server,这对我有用,但接受的答案没有。谢谢。
L
Lorenzo Lerate

在 mysql 中,使用:

SHOW TABLES;

选择数据库后:

USE db_name

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

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

SELECT name FROM databaseName.sys.Tables;

A
AGR

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

SELECT TABLE_NAME FROM databasename.INFORMATION_SCHEMA.TABLES

D
Dhiren Biren

这很好用

SELECT * FROM information_schema.tables;


T
Tarit Ray

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

use DatabaseName

现在

SELECT * FROM INFORMATION_SCHEMA.TABLES

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

粉煤灰。

https://i.stack.imgur.com/Sp26S.png


非常感谢。
A
Ashish Gupta

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


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

你有没有机会详细说明你的意思?也许解释一下?
A
Amir Keshavarz
Exec sp_MSforeachtable 'Select ''?'''

嗨 Amirreza,我相信您在谈论 sp_MSforeachtable
@bummi:是的,非常感谢您的关注,很抱歉输入错误。已编辑
I
Ivan
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 Server 时对属于已知模式的表感兴趣。

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

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


T
Tyler

最新版 MSSQL SERVER (17.7) 的更新

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

SELECT * 获取所有列。


我刚刚意识到这个查询对表名中的非英文字符给出了错误的结果,而 Michael Baylon 给出了正确的结果。 (字符为土耳其语小写“ı”)
M
Md. Jamal Uddin

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

select * from tab;

select table_name from tabs;

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


s
serenesat

是的甲骨文是:

select * from user_tables

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


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

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

P
Patel Nikhil

只需在 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;

J
James Graham
SELECT TABLE_NAME
FROM your_database_name.INFORMATION_SCHEMA.TABLES
ORDER BY TABLE_NAME;

נ
ניר

对于 postgres,它将是:

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