SQL sorgusu ile belirli bir veritabanının tüm tablo adlarını al?


304

"MySQL" ve "MS SQL Server" gibi birden çok veritabanı sunucusu ile başa çıkabilirim uygulama üzerinde çalışıyorum.

Tüm veritabanı türleri için uygun genel bir sorgu kullanarak belirli bir veritabanının tablo adlarını almak istiyorum. Aşağıdaki denedim:

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

Ancak belirli bir sunucunun tüm veritabanlarının tablo adlarını veriyor, ancak yalnızca seçilen veritabanının tablo adlarını almak istiyorum. Belirli bir veritabanının tablolarını almak için bu sorguyu nasıl kısıtlayabilirim?


1
Mysql için basit yapabilirsiniz. TABLOLARI GÖSTER;
Ashish Gupta

Yanıtlar:


500

Muhtemelen farklı sql dbms şemaları ile anlaşma yolu nedeniyle.

Takip etmeyi dene

SQL Server için:

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

MySQL için:

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

Oracle için buna eşdeğer bir kullanım olacağını düşünüyorum DBA_TABLES.


3
Bir veritabanı içinde farklı tablo şemaları (SQL Server) olduğunda bu çözümü tercih ederim: SELECT CONCAT (TABLE_SCHEMA, '.', TABLE_NAME) FOTOĞRAF_SCHEMA.TABLES NEREDE TABLE_TYPE = 'BASE TABLE' VE TABLE_CATALOG = 'MyDB'
Verena Haunschmid

3
Bilgi almak için o DB'yi kullanmak gerekir . USE dbName GOSQL Server için. DB'yi kullanmıyorsanız, o DB'de tablolar olsa bile sonuç görüntülenmez.
barnes

2
Mysql için basit yapabilirsiniz. TABLOLARI GÖSTER;
Ashish Gupta

SQL Server girişi USE dbName GOServer 2014 öneki olmadan benim için iyi çalışıyor .
Mmm

1) Bir SQL Server ve MySQL için aynı şeyi önerdiniz 2) BİLGİ_SCHEMA.TABLES sadece MySQL'de var 3) Gerçekten bunun için nasıl çok sayıda oy aldığını merak ediyorum ...
Apostolos

82

Buradan çalındı :

USE YOURDBNAME
GO 
SELECT *
FROM sys.Tables
GO

3
Büyük olasılıkla SELECT Name FROM sys.Tables nerede is_ms_shipped = 0
om471987

1
bu veritabanı sağlayıcısına özeldir ve ANSI SQL uyumlu değildir.
cjb110

1
Alternatif olarak, SELECT * FROM yourdbname.sys.Tables; daha özlü olmayı tercih ederseniz. En azından SQL Server'da çalışır.
buckminst

29

Aşağıdaki sorgu Tables, veritabanındaki tüm adları seçecektir DBName:

USE DBName
GO 
SELECT *
FROM sys.Tables
GO

NO sadece Parça ayırıcı. T-SQL sözdizimi değildir.
anishMarokey

1
KULLANIM VeritabanıSample SELECT * Sys.Tables
Hamzeh Soboh

17
USE DBName;
SELECT * FROM sys.Tables;

Biz GOyerinde olmadan başa çıkabilirim noktalı virgül kullanabilirsiniz ;.


3
Azure'daki SQL Server için bu benim için çalıştı, ancak kabul edilen cevap işe yaramadı. Teşekkürler.
Jonah

14

Sadece DATABASE NAMEönüne koyun INFORMATION_SCHEMA.TABLES:

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

10

MySQL'de şunu kullanın:

SHOW TABLES;

DB'yi seçtikten sonra:

USE db_name

Osm ,,, swt n short
Deepa MG

Bu MySQL, soru MSSQL sunucusu ile etiketlendi
Melle

@Melle Sorunun açıklamasına bakın
Lorenzo Lerate

Bu en iyi cevap değil, kabul edilen (ve doğru) cevabın altındaki yorumuma bakın.
Chiwda

6

Bu cevabı görmedim ama hey bu benim yaptığım şey:

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

Bununla ne demek istediğini biraz detaylandırma şansın var mı? Belki açıklayabilir mi?
Alex K

1
Exec sp_MSforeachtable 'Select ''?'''

Merhaba Amirreza, bahsettiğine inanıyorum sp_MSforeachtable?
bummi

@bummi: evet harika, İlginiz için teşekkürler ve hata yazdığınız için üzgünüm. Düzenlendi
Amir Keshavarz

1
USE dbName;

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

Bir MS SQL sunucusunda birden çok şema ile çalışıyorsanız, aynı zamanda TABLE_SCHEMA'yı seçmeden TABLE_NAME öğesini SELECT-ing sınırlı fayda sağlayabilir, bu nedenle MS SQL Server kullanırken bilinen bir şemaya ait tablolarla ilgilendiğimizi varsaydım.

Yukarıdaki sorguyu SQL Server veritabanı kullanarak SQL Server veritabanı kullanarak ve MySQL Workbench ile MySQL veritabanı kullanarak test ettim ve her iki durumda da tablo isimlerini veriyor.

Sorgu, Michael Baylon'un iki farklı sorgusunu, daha sonra her iki veritabanı türünde de çalışacak şekilde oluşturur. WHERE deyiminin ilk bölümü MySQL veritabanlarında, ikinci bölümü (OR'den sonra) MS SQL Server veritabanlarında çalışır. Veritabanıyla aynı ada sahip istenmeyen bir şemanın olmadığını varsaydığı için çirkin ve mantıksal olarak biraz yanlıştır. Bu, herhangi bir veritabanı sunucusunda çalışabilecek tek bir sorgu arayan birine yardımcı olabilir.


1

MSSQL SUNUCUSU'NUN SON VERSİYONU İÇİN GÜNCELLEME (17.7)

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

Veya SELECT *tüm sütunları almak için.


Ben sadece Michael Baylon doğru sonuçları verirken bu sorgu tablo adı İngilizce olmayan karakterler için yanlış sonuç verdi fark etti. (karakter Türkçe küçük harf "ı" idi)
onur demir

1

Aşağıdaki veritabanı sorgusunu seçmek için:

use DatabaseName

şimdi

SELECT * FROM INFORMATION_SCHEMA.TABLES

Şimdi oluşturulan tabloları konsolda görebilirsiniz.

PFA.

Sorgu


0

Evet kehanet:

select * from user_tables

Diğer bir deyişle, yalnızca oturum açmış olanların sahip olduğu nesneleri isterseniz sistem tablolarını da user/schemakullanabilirsiniz .all_tablesdba_tables


sağlayıcıya özgü olmayan çapraz sağlayıcı sorguları arıyorlar.
cjb110

Tüm db motorları veri sözlüğünü farklı şekilde uyguladığı için bunu sql'den yapmanın tutarlı bir yolu yoktur. Programlı bir gereklilikse jdbc / odbc ve C / Java / C # gibi bir 3GL dili kullanarak bunu soyutlamak mümkün olabilir, her veritabanı için farklı bir uygulamanız varsa kesinlikle mümkündür. The op onların ihtiyaçlarını açıklamak gerekir ...
kayakpim

0

Michael Baylon'un cevabından, şema bilgilerini de içeren bir listeye ihtiyacım vardı ve sorgusunu bu şekilde değiştirdim.

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) kodumuzda, DB'de bulunan tüm tabloların listesini almak için çalışan kod.

select * from tab;

ve

select table_name from tabs;

ikisi de çalışıyor. deneyelim ve sizinkini bulalım.


0

Mysql'de bu SQL ile aşağıdaki tüm önemli bilgileri almanız yeterlidir

    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;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.