Dapatkan semua nama tabel database tertentu dengan query SQL?

304

Saya sedang mengerjakan aplikasi yang dapat menangani beberapa server basis data seperti "MySQL" dan "MS SQL Server".

Saya ingin mendapatkan nama tabel dari database tertentu menggunakan kueri umum yang cocok untuk semua jenis database. Saya sudah mencoba yang berikut:

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

Tapi itu memberikan nama tabel dari semua database dari server tertentu, tetapi saya ingin mendapatkan nama tabel dari database yang dipilih saja. Bagaimana saya bisa membatasi kueri ini untuk mendapatkan tabel dari database tertentu?

Awan
sumber
1
Untuk Mysql Anda dapat melakukan yang sederhana. TAMPILKAN TABEL;
Ashish Gupta

Jawaban:

500

Mungkin karena cara yang berbeda menangani sql dbms dengan skema.

Coba yang berikut ini

Untuk SQL Server:

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

Untuk MySQL:

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

Untuk Oracle saya pikir yang setara akan digunakan DBA_TABLES.

Michael Baylon
sumber
3
Saya lebih suka solusi ini ketika saya memiliki tabel yang berbeda schemata dalam satu database (SQL Server): SELECT CONCAT (table_schema,, TABLE_NAME ' ') FROM INFORMATION_SCHEMA.TABLES MANA TABLE_TYPE = 'BASIS TABLE' DAN TABLE_CATALOG =' MyDB'
Verena Haunschmid
3
Seseorang harus menggunakan DB tertentu untuk mendapatkan informasi. USE dbName GOuntuk SQL-Server. Jika Anda tidak menggunakan DB , hasilnya tidak akan ditampilkan, bahkan jika ada tabel dalam DB itu.
barnes
2
Untuk Mysql Anda dapat melakukan yang sederhana. TAMPILKAN TABEL;
Ashish Gupta
Entri SQL Server berfungsi dengan baik bagi saya tanpa USE dbName GOawalan pada Server 2014.
Mmm
1) Anda telah menyarankan hal yang sama untuk SQL Server dan MySQL 2) INFORMATION_SCHEMA.TABLES hanya ada di MySQL 3) Saya benar-benar bertanya-tanya bagaimana Anda mendapat begitu banyak upvotes untuk ini ...
Apostolos
82

Dicuri dari sini :

USE YOURDBNAME
GO 
SELECT *
FROM sys.Tables
GO
bla
sumber
3
Kemungkinan besar SELECT Name FROM sys.Tabel di mana is_ms_shipped = 0
om471987
1
ini adalah penyedia basis data khusus, dan tidak kompatibel dengan ANSI SQL.
cjb110
1
Atau, PILIH * DARI yourdbname.sys.Tables; jika Anda lebih suka untuk lebih ringkas. Paling tidak bekerja di SQL Server.
buckminst
29

Kueri berikut akan memilih semua dari Tablesdalam database bernama DBName:

USE DBName
GO 
SELECT *
FROM sys.Tables
GO
anishMarokey
sumber
TIDAK hanya Bagian pemisah. Anda dapat mengubah ke yang lain. Ini bukan sintaks T-SQL.
anishMarokey
1
GUNAKAN DatabaseSample SELECT * FROM sys.Tables
Hamzeh Soboh
17
USE DBName;
SELECT * FROM sys.Tables;

Kami dapat menangani tanpa GOdi tempat Anda dapat menggunakan titik koma ;.

Gopal00005
sumber
3
Untuk SQL Server pada Azure, ini bekerja untuk saya, tetapi jawaban yang diterima tidak. Terima kasih.
Jonah
14

Cukup letakkan DATABASE NAMEdi depan INFORMATION_SCHEMA.TABLES:

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

Di mysql, gunakan:

SHOW TABLES;

Setelah memilih DB dengan:

USE db_name
Lorenzo Lerate
sumber
Osm ,,, swt n short
Deepa MG
Ini adalah MySQL, pertanyaan ditandai dengan server MSSQL
Melle
@Melle Lihat uraian pertanyaannya
Lorenzo Lerate
Ini bukan jawaban terbaik, lihat komentar saya di bawah jawaban yang diterima (dan benar).
Chiwda
6

Saya tidak melihat jawaban ini tetapi hei inilah yang saya lakukan:

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

Untuk Mysql Anda dapat melakukan yang sederhana. TAMPILKAN TABEL;

Ashish Gupta
sumber
2
select * from sys.tables
order by schema_id      --comments: order by 'schema_id' to get the 'tables' in 'object explorer order'
go
amanda
sumber
Apakah Anda bisa sedikit menjelaskan apa yang Anda maksudkan dengan ini? Mungkin menjelaskannya?
Alex K
1
Exec sp_MSforeachtable 'Select ''?'''
Amir Keshavarz
sumber
Hai Amirreza, saya yakin Anda bicarakan sp_MSforeachtable?
bummi
@bummi: ya bagus, Terima kasih atas perhatian dan maaf karena mengetik kesalahan. Diedit
Amir Keshavarz
1
USE dbName;

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

Jika Anda bekerja dengan beberapa skema pada server MS SQL, maka SELECT-TABLE_NAME-ing tanpa juga secara bersamaan memilih TABLE_SCHEMA mungkin manfaat terbatas, jadi saya berasumsi kami tertarik pada tabel milik skema yang dikenal saat menggunakan MS SQL Server.

Saya telah menguji permintaan di atas dengan SQL Server Management Studio menggunakan database SQL Server milik saya dan dengan MySQL Workbench menggunakan database MySQL, dan dalam kedua kasus itu memberikan nama tabel.

Query menggabungkan dua pertanyaan yang berbeda dari Michael Baylon menjadi satu yang kemudian dapat dijalankan pada kedua tipe database. Bagian pertama klausa WHERE berfungsi pada basis data MySQL dan bagian kedua (setelah OR) berfungsi pada basis data MS SQL Server. Itu jelek dan logis sedikit salah karena mengandaikan bahwa tidak ada skema yang tidak diinginkan dengan nama yang sama dengan database. Ini mungkin membantu seseorang yang mencari satu permintaan tunggal yang dapat berjalan di server database mana pun.

Ivan
sumber
1

PEMBARUAN UNTUK VERSI TERBARU MSSQL SERVER (17.7)

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

Atau SELECT *untuk mendapatkan semua kolom.

Tyler
sumber
Saya baru menyadari bahwa kueri ini memberikan hasil yang salah untuk karakter non-Inggris dalam nama tabel sementara Michael Baylon's memberikan hasil yang benar. (karakter dalam huruf kecil bahasa Turki "ı")
onur demir
1

Untuk memilih kueri basis data di bawah ini:

use DatabaseName

Sekarang

SELECT * FROM INFORMATION_SCHEMA.TABLES

Sekarang Anda dapat melihat tabel yang dibuat di bawah ini di konsol.

PFA.

Pertanyaan

Tarit Ray
sumber
0

Ya oracle adalah:

select * from user_tables

Itu jika Anda hanya ingin objek yang dimiliki oleh login user/schemajika tidak, Anda dapat menggunakan all_tablesatau dba_tablesyang termasuk tabel sistem.

kayakpim
sumber
mereka mencari kueri penyedia silang bukan penyedia tertentu.
cjb110
Tidak ada cara yang konsisten untuk melakukan ini dari sql karena semua mesin db mengimplementasikan kamus data secara berbeda. Dimungkinkan untuk abstrak ini menggunakan jdbc / odbc dan bahasa 3GL seperti C / Java / C # jika ini merupakan persyaratan program, pasti mungkin jika Anda memiliki implementasi yang berbeda untuk setiap database. Op harus menjelaskan persyaratan mereka ...
kayakpim
0

Membangun dari jawaban Michael Baylon, saya membutuhkan daftar yang juga menyertakan informasi skema dan ini adalah bagaimana saya memodifikasi kueri-nya.

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.
sumber
0

Dalam Oracle DB (PL / SQL) kami, kode di bawah ini berfungsi untuk mendapatkan daftar semua tabel yang ada di DB kami.

select * from tab;

dan

select table_name from tabs;

keduanya bekerja. mari kita coba dan temukan milikmu.

Md. Jamal Uddin
sumber
0

Cukup dapatkan semua informasi improtanat dengan SQL di bawah ini di 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
sumber