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?


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.


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

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

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 ;.


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'

10

Verwenden Sie in MySQL:

SHOW TABLES;

Nach Auswahl der DB mit:

USE db_name

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;


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

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 ''?'''

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.


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.


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


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.


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

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.


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;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.