Alle Tabellennamen einer bestimmten Datenbank per SQL-Abfrage abrufen?

304

Ich arbeite an einer Anwendung, die mit mehreren Datenbankservern wie "MySQL" und "MS SQL Server" umgehen kann.

Ich möchte die Tabellennamen einer bestimmten Datenbank mithilfe einer allgemeinen Abfrage abrufen, die für alle Datenbanktypen geeignet sein sollte. Ich habe folgendes versucht:

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

Es werden jedoch Tabellennamen aller Datenbanken eines bestimmten Servers angegeben, aber ich möchte nur Tabellennamen der ausgewählten Datenbank abrufen. Wie kann ich diese Abfrage einschränken, um Tabellen einer bestimmten Datenbank abzurufen?

Awan
quelle
1
Für MySQL können Sie einfach machen. TABELLEN ANZEIGEN;
Ashish Gupta

Antworten:

500

Wahrscheinlich aufgrund der Art und Weise, wie verschiedene SQL-DBMS mit Schemas umgehen.

Versuche Folgendes

Für SQL Server:

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

Für MySQL:

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

Für Oracle wäre das Äquivalent zu verwenden DBA_TABLES.

Michael Baylon
quelle
3
Ich bevorzuge diese Lösung , wenn ich in einer Datenbank verschiedene Tabellenschemata haben (SQL Server): SELECT CONCAT (TABLE_SCHEMA, TABLE_NAME ' ') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_CATALOG =' MyDB'
Verena Haunschmid
3
Man muss diese bestimmte Datenbank verwenden , um die Informationen zu erhalten. USE dbName GOfür SQL-Server. Wenn Sie nicht die Verwendung von DB , Ergebnis wird nicht angezeigt, auch wenn es Tabellen in dieser DB.
Barnes
2
Für MySQL können Sie einfach machen. TABELLEN ANZEIGEN;
Ashish Gupta
Der SQL Server-Eintrag funktioniert gut für mich ohne das USE dbName GOPräfix auf Server 2014.
Mmm
1) Sie haben dasselbe für einen SQL Server und MySQL vorgeschlagen. 2) INFORMATION_SCHEMA.TABLES gibt es nur in MySQL. 3) Ich frage mich wirklich, warum Sie dafür so viele positive Stimmen erhalten haben ...
Apostolos
82

Von hier gestohlen :

USE YOURDBNAME
GO 
SELECT *
FROM sys.Tables
GO
bla
quelle
3
Höchstwahrscheinlich SELECT Name FROM sys.Tables wobei is_ms_shipped = 0
om471987
1
Dies ist datenbankanbieterspezifisch und nicht ANSI SQL-kompatibel.
cjb110
1
Alternativ SELECT * FROM yourdbname.sys.Tables; wenn Sie es vorziehen, prägnanter zu sein. Funktioniert zumindest in SQL Server.
Buckminst
29

Die folgende Abfrage wählt alle Tablesin der Datenbank genannten aus DBName:

USE DBName
GO 
SELECT *
FROM sys.Tables
GO
anishMarokey
quelle
NEIN es nur Teilentrenner. Sie können zu anderen wechseln. Es ist keine T-SQL-Syntax.
AnishMarokey
1
USE DatabaseSample SELECT * FROM sys.Tables
Hamzeh Soboh
17
USE DBName;
SELECT * FROM sys.Tables;

Wir können handeln, ohne dass GOSie Semikolon verwenden können ;.

Gopal00005
quelle
3
Für SQL Server unter Azure funktionierte dies für mich, die akzeptierte Antwort jedoch nicht. Vielen Dank.
Jonah
14

Stellen Sie das einfach DATABASE NAMEvor INFORMATION_SCHEMA.TABLES:

select table_name from YOUR_DATABASE.INFORMATION_SCHEMA.TABLES where TABLE_TYPE = 'BASE TABLE'
David S.
quelle
10

Verwenden Sie in MySQL:

SHOW TABLES;

Nach Auswahl der DB mit:

USE db_name
Lorenzo Lerate
quelle
Osm ,,, swt n short
Deepa MG
Dies ist MySQL, Frage ist mit MSSQL-Server markiert
Melle
@Melle Schauen Sie sich die Beschreibung der Frage
Lorenzo Lerate
Dies ist nicht die beste Antwort, siehe meinen Kommentar unter der akzeptierten (und richtigen) Antwort.
Chiwda
6

Ich habe diese Antwort nicht gesehen, aber hey, das ist was ich tue:

SELECT name FROM databaseName.sys.Tables;
Dario Cimmino
quelle
3

Für MySQL können Sie einfach machen. TABELLEN ANZEIGEN;

Ashish Gupta
quelle
2
select * from sys.tables
order by schema_id      --comments: order by 'schema_id' to get the 'tables' in 'object explorer order'
go
Amanda
quelle
Gibt es eine Chance, dass Sie etwas näher darauf eingehen, was Sie damit meinen? Vielleicht erklären?
Alex K
1
Exec sp_MSforeachtable 'Select ''?'''
Amir Keshavarz
quelle
Hallo Amirreza, ich glaube du redest darüber sp_MSforeachtable?
Bummi
@bummi: ja toll, danke für die Aufmerksamkeit und entschuldige den Tippfehler. Bearbeitet
Amir Keshavarz
1
USE dbName;

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

Wenn Sie mit mehreren Schemata auf einem MS SQL Server arbeiten, kann das SELECT-TABLE_NAME ohne gleichzeitige Auswahl von TABLE_SCHEMA von begrenztem Nutzen sein. Daher habe ich angenommen, dass wir an den Tabellen interessiert sind, die zu einem bekannten Schema gehören, wenn Sie MS SQL Server verwenden.

Ich habe die obige Abfrage mit SQL Server Management Studio unter Verwendung einer meiner SQL Server-Datenbanken und mit MySQL Workbench unter Verwendung einer MySQL-Datenbank getestet. In beiden Fällen werden die Tabellennamen angegeben.

Die Abfrage fasst die zwei verschiedenen Abfragen von Michael Baylon in eine zusammen, die dann auf beiden Datenbanktypen ausgeführt werden kann. Der erste Teil der WHERE-Klausel funktioniert für MySQL-Datenbanken und der zweite Teil (nach dem ODER) für MS SQL Server-Datenbanken. Es ist hässlich und logisch ein wenig falsch, da davon ausgegangen wird, dass es kein unerwünschtes Schema mit demselben Namen wie die Datenbank gibt. Dies kann jemandem helfen, der nach einer einzelnen Abfrage sucht, die auf beiden Datenbankservern ausgeführt werden kann.

Ivan
quelle
1

UPDATE FÜR DIE NEUESTE VERSION VON MSSQL SERVER (17.7)

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

Oder SELECT *um alle Spalten zu bekommen.

Tyler
quelle
Ich habe gerade festgestellt, dass diese Abfrage ein falsches Ergebnis für nicht englische Zeichen im Tabellennamen liefert, während Michael Baylons korrekte Ergebnisse liefert. (Zeichen war in türkischer Sprache Kleinbuchstaben "ı")
onur demir
1

So wählen Sie die folgende Datenbankabfrage aus:

use DatabaseName

Jetzt

SELECT * FROM INFORMATION_SCHEMA.TABLES

Jetzt können Sie die erstellten Tabellen unten in der Konsole sehen.

PFA.

Abfrage

Tarit Ray
quelle
0

Ja Orakel ist:

select * from user_tables

Dies ist der Fall, wenn Sie nur Objekte möchten, deren Eigentümer die angemeldeten sind, die user/schemaSie sonst verwenden können all_tablesoder dba_tablesdie Systemtabellen enthalten.

Kajakpim
quelle
Sie suchen nach anbieterübergreifenden Abfragen, die nicht anbieterspezifisch sind.
cjb110
Es gibt keine konsistente Möglichkeit, dies von SQL aus zu tun, da alle DB-Engines das Datenwörterbuch unterschiedlich implementieren. Es ist möglicherweise möglich, dies mit jdbc / odbc und einer 3GL-Sprache wie C / Java / C # zu abstrahieren, wenn dies eine programmatische Anforderung ist. Dies ist definitiv möglich, wenn Sie für jede Datenbank eine andere Implementierung haben. Die
Operation
0

Aufbauend auf Michael Baylons Antwort brauchte ich eine Liste, die auch Schemainformationen enthielt, und so änderte ich seine Abfrage.

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
Jason L.
quelle
0

In unserer folgenden Oracle-Datenbank (PL / SQL) wird Code verwendet, um die Liste aller in unserer Datenbank vorhandenen Tabellen abzurufen.

select * from tab;

und

select table_name from tabs;

beide arbeiten. Lass uns versuchen, deine zu finden.

Md. Jamal Uddin
quelle
0

Holen Sie sich einfach alle Improtanat-Informationen mit diesem unter SQL in MySQL

    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;
Patel Nikhil
quelle