SQLクエリで特定のデータベースのすべてのテーブル名を取得しますか?


304

"MySQL"や "MS SQL Server"のような複数のデータベースサーバーに対応できるアプリケーションに取り組んでいます。

すべてのデータベースタイプに適した一般的なクエリを使用して、特定のデータベースのテーブル名を取得したい。私は以下を試しました:

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

しかし、特定のサーバーのすべてのデータベースのテーブル名を指定していますが、選択したデータベースのテーブル名のみを取得したいと考えています。このクエリを制限して特定のデータベースのテーブルを取得するにはどうすればよいですか?


1
Mysqlの場合、簡単に行うことができます。表を表示;
Ashish Gupta

回答:


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
1つのデータベース(SQL Server)内に異なるテーブルスキーマがある場合、このソリューションを選択します。SELECTCONCAT(TABLE_SCHEMA、 '。'、TABLE_NAME)FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_CATALOG = 'MyDB'
Verena Haunschmid

3
その特定のDBを使用して情報を取得する必要があります。USE dbName GOSQL-Serverの場合。DBを使用していない場合、そのDBにテーブルがあっても、結果は表示されません。
Barnes

2
Mysqlの場合、簡単に行うことができます。表を表示;
Ashish Gupta

SQL Serverのエントリがなくて私のために罰金を作品USE dbName GOサーバー2014年に接頭辞
うーん

1)あなたは、私が本当に...どのようにあなたは、このために非常に多くのupvotesを持ってくるだろう)INFORMATION_SCHEMA.TABLESが唯一のMySQL 3に存在する)SQL ServerとMySQLの2のために同じことを示唆している
アポストロス

82

ここから盗まれ

USE YOURDBNAME
GO 
SELECT *
FROM sys.Tables
GO

3
おそらくSELECT_NAME FROM sys.Tables where is_ms_shipped = 0
om471987

1
これはデータベースプロバイダー固有であり、ANSI SQL互換ではありません。
cjb110 14

1
または、SELECT * FROM yourdbname.sys.Tables; より簡潔にしたい場合。少なくともSQL Serverで動作します。
buckminst 2017

29

次のクエリはTables、という名前のデータベース内のすべてを選択しますDBName

USE DBName
GO 
SELECT *
FROM sys.Tables
GO

いいえ、パーツセパレータのみです。T-SQL構文ではありません。
anishMarokey

1
DatabaseSample SELECT * FROM sys.Tablesを使用する
Hamzeh Soboh 2013年

17
USE DBName;
SELECT * FROM sys.Tables;

我々はなくて扱うことができるGOインプレースあなたはセミコロンを使用することができますの;


3
Azure上のSQL Serverでは、これはうまくいきましたが、受け入れられた答えはうまくいきませんでした。ありがとう。
ジョナ

14

DATABASE NAME前に置くだけですINFORMATION_SCHEMA.TABLES

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

10

mysqlでは、次を使用します。

SHOW TABLES;

DBを選択した後:

USE db_name

Osm ,,, swt n short
Deepa MG

これはMySQLで、質問はタグ付きのMSSQLサーバー
Melle

@Melle質問の説明を見てください
Lorenzo Lerate 2018年

これは最良の回答ではありません。承認された(および正しい)回答の下にある私のコメントを参照してください。
Chiwda

6

私はこの答えを見ませんでしたが、ちょっとこれは私がすることです:

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

これが何を意味するのか少し詳しく説明できますか?多分それを説明しますか?
Alex K


1
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をSELECTすることのメリットは限られている可能性があるため、MS SQL Serverを使用するときに既知のスキーマに属するテーブルに関心があると想定しています。

私のSQL Serverデータベースを使用するSQL Server Management StudioとMySQLデータベースを使用するMySQL Workbenchで上記のクエリをテストしましたが、どちらの場合もテーブル名が表示されます。

このクエリは、Michael Baylonの2つの異なるクエリを1つのクエリにまとめ、どちらのデータベースタイプでも実行できるようにします。WHERE句の最初の部分はMySQLデータベースで機能し、2番目の部分(ORの後)はMS SQL Serverデータベースで機能します。データベースと同じ名前の不要なスキーマがないと想定されているため、醜く、論理的には少し不正確です。これは、いずれかのデータベースサーバーで実行できる単一のクエリを探している人を助けるかもしれません。


1

MSSQLサーバー(17.7)の最新バージョンの更新

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

またはSELECT *、すべての列を取得します。


このクエリは、Michael Baylonが正しい結果を返すのに対して、テーブル名の英語以外の文字に対して誤った結果を返すことに気づきました。(文字はトルコ語の小文字 "ı"
でした

1

以下のデータベースクエリを選択するには:

use DatabaseName

SELECT * FROM INFORMATION_SCHEMA.TABLES

これで、作成したテーブルがコンソールに表示されます。

PFA。

クエリ


0

はい、オラクルは:

select * from user_tables

これは、ログインによって所有されているオブジェクトのみが必要な場合、user/schemaそれ以外の場合は使用できる、all_tablesまたはdba_tablesシステムテーブルが含まれている場合です。


彼らはプロバイダー固有ではなく、クロスプロバイダークエリを探しています。
cjb110 14

すべてのdbエンジンがデータディクショナリを異なる方法で実装するため、sqlからこれを行う一貫した方法はありません。これがプログラム上の要件である場合、jdbc / odbcとC / Java / C#などの3GL言語を使用してこれを抽象化することは可能かもしれません。データベースごとに異なる実装がある場合は間違いなく可能です。opは要件を明確にする必要があります...
カヤックピム14

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)では、DBに存在するすべてのテーブルのリストを取得するコードが機能しています。

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;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.