Lấy tất cả các tên bảng của một cơ sở dữ liệu cụ thể bằng truy vấn SQL?


304

Tôi đang làm việc trên ứng dụng có thể xử lý nhiều máy chủ cơ sở dữ liệu như "MySQL" và "MS SQL Server".

Tôi muốn lấy tên của các cơ sở dữ liệu cụ thể bằng một truy vấn chung phù hợp với tất cả các loại cơ sở dữ liệu. Tôi đã thử như sau:

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

Nhưng nó đang đặt tên bảng của tất cả các cơ sở dữ liệu của một máy chủ cụ thể nhưng tôi chỉ muốn lấy tên bảng của cơ sở dữ liệu đã chọn. Làm cách nào để hạn chế truy vấn này để lấy các bảng của một cơ sở dữ liệu cụ thể?


1
Đối với Mysql bạn có thể làm đơn giản. BẢNG BIỂN;
Ashish Gupta

Câu trả lời:


500

Có lẽ là do cách các dbms sql khác nhau đối phó với các lược đồ.

Hãy thử như sau

Đối với máy chủ SQL:

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

Đối với MySQL:

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

Đối với Oracle tôi nghĩ tương đương sẽ được sử dụng DBA_TABLES.


3
Tôi thích giải pháp này khi tôi có lược đồ bảng khác nhau trong một cơ sở dữ liệu (SQL Server): SELECT CONCAT (TABLE_SCHEMA,, TABLE_NAME ' ') TỪ INFORMATION_SCHEMA.TABLES ĐÂU TABLE_TYPE = 'CƠ SỞ TABLE' VÀ TABLE_CATALOG =' MyDB'
Verena Haunschmid

3
Người ta phải sử dụng DB cụ thể đó để lấy thông tin. USE dbName GOcho SQL-Server. Nếu bạn không sử dụng DB , kết quả sẽ không được hiển thị, ngay cả khi có các bảng trong DB đó.
barnes

2
Đối với Mysql bạn có thể làm đơn giản. BẢNG BIỂN;
Ashish Gupta

Mục nhập Máy chủ SQL hoạt động tốt đối với tôi mà không cần USE dbName GOtiền tố trên Máy chủ 2014.
Mmm

1) Bạn đã đề xuất điều tương tự cho Máy chủ SQL và MySQL 2) THÔNG TIN_SCHema.TABLES chỉ tồn tại trong MySQL 3) Tôi thực sự tự hỏi làm thế nào bạn có được nhiều sự ủng hộ cho việc này ...
Apostolos

82

Bị đánh cắp từ đây :

USE YOURDBNAME
GO 
SELECT *
FROM sys.Tables
GO

3
Có lẽ hầu hết tên CHỌN TỪ sys.Tables trong đó is_ms_shipped = 0
om471987

1
đây là nhà cung cấp cơ sở dữ liệu cụ thể và không tương thích với ANSI SQL.
cjb110

1
Ngoài ra, CHỌN * TỪ yourdbname.sys.Tables; nếu bạn thích ngắn gọn hơn Hoạt động trong SQL Server, ít nhất.
buckminst

29

Truy vấn sau đây sẽ chọn tất cả Tablestrong cơ sở dữ liệu có tên DBName:

USE DBName
GO 
SELECT *
FROM sys.Tables
GO

KHÔNG nó chỉ là một phần tách biệt. bạn có thể thay đổi thành khác. Không phải là cú pháp T-SQL.
anishMarokey

1
SỬ DỤNG Cơ sở dữ liệu Mẫu CHỌN * TỪ sys.Tables
Hamzeh Soboh

17
USE DBName;
SELECT * FROM sys.Tables;

Chúng tôi có thể giao dịch mà không cần GOtại chỗ bạn có thể sử dụng dấu chấm phẩy ;.


3
Đối với SQL Server trên Azure, điều này hiệu quả với tôi, nhưng câu trả lời được chấp nhận thì không. Cảm ơn.
Giô-na

14

Chỉ cần đặt DATABASE NAMEphía trước INFORMATION_SCHEMA.TABLES:

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

10

Trong mysql, sử dụng:

SHOW TABLES;

Sau khi chọn DB với:

USE db_name

Osm ,,, swt n ngắn
Deepa MG

Đây là MySQL, câu hỏi được gắn thẻ máy chủ MSSQL
Melle

@Melle Hãy xem mô tả của câu hỏi
Lorenzo L Cả

Đây không phải là câu trả lời tốt nhất, hãy xem nhận xét của tôi dưới câu trả lời được chấp nhận (và chính xác).
Chiwda

6

Tôi không thấy câu trả lời này, nhưng đây là những gì tôi làm:

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

Bất kỳ cơ hội nào bạn có thể giải thích một chút về ý của bạn là gì? Có thể giải thích nó?
Alex K

1
Exec sp_MSforeachtable 'Select ''?'''

Xin chào Amirreza, tôi tin rằng bạn đang nói về sp_MSforeachtable?
bummi

@bummi: vâng tuyệt vời, Cảm ơn bạn đã chú ý và xin lỗi vì đã gõ nhầm. Đã chỉnh sửa
Amir Keshavarz

1
USE dbName;

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

Nếu bạn đang làm việc với nhiều lược đồ trên máy chủ MS SQL, thì CHỌN TABLE_NAME mà không đồng thời chọn TABLE_SCHema có thể có lợi ích hạn chế, vì vậy tôi đã giả sử rằng chúng tôi quan tâm đến các bảng thuộc một lược đồ đã biết khi sử dụng MS SQL Server.

Tôi đã kiểm tra truy vấn ở trên với SQL Server Management Studio bằng cơ sở dữ liệu SQL Server của tôi và với MySQL Workbench bằng cơ sở dữ liệu MySQL và trong cả hai trường hợp, nó đều cung cấp tên bảng.

Truy vấn kết hợp hai truy vấn khác nhau của Michael Baylon thành một truy vấn có thể chạy trên cả hai loại cơ sở dữ liệu. Phần đầu tiên của mệnh đề WHERE hoạt động trên cơ sở dữ liệu MySQL và phần thứ hai (sau OR) hoạt động trên cơ sở dữ liệu MS SQL Server. Thật là xấu xí và logic một chút không chính xác vì nó cho rằng không có lược đồ không mong muốn có cùng tên với cơ sở dữ liệu. Điều này có thể giúp ai đó đang tìm kiếm một truy vấn duy nhất có thể chạy trên một trong hai máy chủ cơ sở dữ liệu.


1

CẬP NHẬT CHO PHIÊN BẢN MỚI NHẤT CỦA MSSQL SERVER (17.7)

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

Hoặc SELECT *để có được tất cả các cột.


Tôi mới nhận ra rằng truy vấn này cho kết quả sai đối với các ký tự không phải tiếng Anh trong tên bảng trong khi Michael Baylon đưa ra kết quả chính xác. (ký tự viết bằng chữ thường tiếng Thổ Nhĩ Kỳ "ı")
onur demir

1

Để chọn truy vấn cơ sở dữ liệu dưới đây:

use DatabaseName

Hiện nay

SELECT * FROM INFORMATION_SCHEMA.TABLES

Bây giờ bạn có thể thấy các bảng được tạo dưới đây trong giao diện điều khiển.

PFA.

Truy vấn


0

Có lời tiên tri là:

select * from user_tables

Đó là nếu bạn chỉ muốn các đối tượng thuộc sở hữu của người đăng nhập user/schemanếu không bạn có thể sử dụng all_tableshoặc dba_tablesbao gồm các bảng hệ thống.


họ đang tìm kiếm các truy vấn nhà cung cấp chéo không phải nhà cung cấp cụ thể.
cjb110

Không có cách nhất quán để làm điều này từ sql vì tất cả các công cụ db thực hiện từ điển dữ liệu khác nhau. Có thể trừu tượng hóa điều này bằng cách sử dụng jdbc / odbc và ngôn ngữ 3GL như C / Java / C # nếu đây là một yêu cầu lập trình, chắc chắn có thể nếu bạn có một triển khai khác nhau cho mỗi cơ sở dữ liệu. Các op nên làm rõ các yêu cầu của họ ...
kayakpim

0

Dựa trên câu trả lời của Michael Baylon, tôi cần một danh sách bao gồm thông tin lược đồ và đây là cách tôi sửa đổi truy vấn của anh ấy.

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

Trong Oracle DB (PL / SQL) bên dưới, mã của chúng tôi hoạt động để lấy danh sách tất cả các bảng tồn tại trong DB của chúng tôi.

select * from tab;

select table_name from tabs;

cả hai đều đang làm việc Hãy thử và tìm của bạn.


0

Đơn giản chỉ cần lấy tất cả thông tin của ilotanat với SQL bên dưới trong 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;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.