2008-09-15 49 views

Trả lời

4

Bạn đã xem xét truy vấn INFORMATION_SCHEMA.Tables chưa? Như trong

SELECT ic.Table_Name, 
    ic.Column_Name, 
    ic.data_Type, 
    IFNULL(Character_Maximum_Length,'') AS `Max`, 
    ic.Numeric_precision as `Precision`, 
    ic.numeric_scale as Scale, 
    ic.Character_Maximum_Length as VarCharSize, 
    ic.is_nullable as Nulls, 
    ic.ordinal_position as OrdinalPos, 
    ic.column_default as ColDefault, 
    ku.ordinal_position as PK, 
    kcu.constraint_name, 
    kcu.ordinal_position, 
    tc.constraint_type 
FROM INFORMATION_SCHEMA.COLUMNS ic 
    left outer join INFORMATION_SCHEMA.key_column_usage ku 
     on ku.table_name = ic.table_name 
     and ku.column_name = ic.column_name 
    left outer join information_schema.key_column_usage kcu 
     on kcu.column_name = ic.column_name 
     and kcu.table_name = ic.table_name 
    left outer join information_schema.table_constraints tc 
     on kcu.constraint_name = tc.constraint_name 
order by ic.table_name, ic.ordinal_position; 
+3

g này ives bạn (meta) thông tin về các bảng, không phải là nội dung của bảng, như OP dự định. – physicalattraction

38

Tôi nghĩ rằng bạn muốn SELECT * FROM INFORMATION_SCHEMA.TABLES

Xem http://dev.mysql.com/doc/refman/5.0/en/tables-table.html

+7

Điều này cung cấp cho bạn (meta) thông tin về các bảng, không phải nội dung của bảng, như OP dự định. – physicalattraction

+0

Điều này cung cấp cho các tên bảng trường hợp thấp hơn trên Windows, trong khi 'SHOW TABLES' cung cấp cho vỏ như được chỉ định. – AndreKR

2
SELECT * FROM INFORMATION_SCHEMA.TABLES 

Đó phải là một khởi đầu tốt. Để biết thêm, hãy kiểm tra INFORMATION_SCHEMA Tables.

+4

Điều này cung cấp cho bạn (meta) thông tin về các bảng, không phải nội dung của bảng, như OP dự định. – physicalattraction

2

Tôi không hiểu tại sao bạn muốn sử dụng SELECT * FROM như một phần của tuyên bố.

12.5.5.30. SHOW TABLES Syntax

+4

OP muốn trích xuất dữ liệu từ các Bảng được trả về bởi BẢNG HIỂN THỊ, không có thông tin về Bản thân Bảng. – physicalattraction

19

Không mà tôi biết, trừ khi bạn chọn từ INFORMATION_SCHEMA, như những người khác đã đề cập.

Tuy nhiên, lệnh SHOW là khá linh hoạt, Ví dụ:

SHOW tables like '%s%' 
+5

Điều này cung cấp cho bạn (meta) thông tin về các bảng, không phải nội dung của bảng, như OP dự định. – physicalattraction

3
SELECT column_comment FROM information_schema.columns WHERE table_name = 'myTable' AND column_name = 'myColumnName' 

này sẽ trở lại bình luận trên: myTable.myColumnName

+3

Điều này cung cấp cho bạn (meta) thông tin về các bảng, không phải nội dung của bảng, như OP dự định. – physicalattraction

2

Vâng, SELECT từ table_schema có thể sẽ rất hữu ích cho quản trị hệ thống. Nếu bạn có nhiều máy chủ, cơ sở dữ liệu, bảng ... đôi khi bạn cần DROP hoặc UPDATE bó các phần tử. Ví dụ để tạo truy vấn cho thả tất cả các bảng với tên tiền tố "wp_old _...":

SELECT concat('DROP TABLE ', table_name, ';') FROM INFORMATION_SCHEMA.TABLES 
WHERE table_schema = '*name_of_your_database*' 
AND table_name LIKE 'wp_old_%'; 
+3

Điều này cung cấp cho bạn (meta) thông tin về các bảng, không phải nội dung của bảng, như OP dự định. – physicalattraction

1

trong MySql 5.1 bạn có thể thử

show tables like 'user%'; 

đầu ra:

mysql> show tables like 'user%'; 

+----------------------------+ 

| Tables_in_test (user%) | 

+----------------------------+ 

| user      | 

| user_password    | 

+----------------------------+ 

2 rows in set (0.00 sec) 
+3

Điều này cung cấp cho bạn (meta) thông tin về các bảng, không phải nội dung của bảng, như OP dự định. – physicalattraction

3

Bạn không thể đặt các câu lệnh SHOW bên trong truy vấn phụ như trong ví dụ của mình. Câu lệnh duy nhất có thể truy vấn con là SELECT.

Như các câu trả lời khác đã nêu, bạn có thể truy vấn trực tiếp INFORMATION_SCHEMA với SELECT và linh hoạt hơn theo cách đó.

Các câu lệnh SHOW của MySQL chỉ là các truy vấn đối với các bảng INFORMATION_SCHEMA.

tài @physicalattraction đã đăng nhận xét này trên hầu hết các câu trả lời khác:

này cung cấp cho bạn (meta) thông tin về các bảng, không phải là nội dung của bảng, như OP dự định. - vật lý liên quan

Ngược lại, câu hỏi của OP là không phải nói rằng họ muốn chọn dữ liệu trong tất cả các bảng. Họ nói rằng họ muốn chọn từ kết quả của SHOW TABLES, mà chỉ là một danh sách các tên bảng.

Nếu OP không muốn chọn tất cả dữ liệu từ tất cả các bảng, thì câu trả lời là không, bạn không thể làm điều đó với một truy vấn. Mỗi truy vấn phải đặt tên bảng của nó một cách rõ ràng. Bạn không thể tạo tên bảng là biến hoặc kết quả của một phần khác của cùng một truy vấn. Ngoài ra, tất cả các hàng của một kết quả truy vấn nhất định phải có cùng các cột.

Vì vậy, cách duy nhất để chọn tất cả dữ liệu từ tất cả các bảng sẽ là chạy SHOW TABLES và sau đó cho mỗi bảng có tên trong kết quả đó, hãy chạy truy vấn khác.

3

Bạn có thể gần hơn bạn nghĩ — HIỂN THỊ BẢNG đã cư xử rất giống CHỌN:

$pdo = new PDO("mysql:host=$host;dbname=$dbname",$user,$pass); 
foreach ($pdo->query("SHOW TABLES") as $row) { 
    print "Table $row[Tables_in_$dbname]\n"; 
} 
8

Để đếm:

SELECT COUNT(*) as total FROM (SELECT TABLE_NAME as tab, TABLES.* FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='database_name' GROUP BY tab) tables; 

Để liệt kê:

SELECT TABLE_NAME as table, TABLES.* FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='database_name' GROUP BY table; 
+0

Chào mừng bạn đến với StackOverflow! Ở đây, chúng tôi sử dụng tiếng Anh làm ngôn ngữ chính của chúng tôi. Hãy đảm bảo rằng bài đăng của bạn bằng tiếng Anh. –

1

Bạn có thể tạo một thủ tục lưu sẵn và đặt tên bảng trong một con trỏ, sau đó lặp qua các tên bảng của bạn để hiển thị dữ liệu.

Bắt đầu với thủ tục lưu trữ: http://www.mysqltutorial.org/getting-started-with-mysql-stored-procedures.aspx

Tạo con trỏ: http://www.mysqltutorial.org/mysql-cursor/

Ví dụ,

CREATE PROCEDURE `ShowFromTables`() 
BEGIN 

DECLARE v_finished INTEGER DEFAULT 0; 
DECLARE c_table varchar(100) DEFAULT ""; 

DECLARE table_cursor CURSOR FOR 
SELECT table_name FROM information_schema.tables WHERE table_name like 'wp_1%'; 

DECLARE CONTINUE HANDLER 
    FOR NOT FOUND SET v_finished = 1; 

OPEN table_cursor; 

get_data: LOOP 

FETCH table_cursor INTO c_table; 

IF v_finished = 1 THEN 
LEAVE get_data; 
END IF; 

SET @s=CONCAT("SELECT * FROM ",c_table,";"); 

PREPARE stmt FROM @s; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

END LOOP get_data; 

CLOSE table_cursor; 

END 

Sau đó gọi thủ tục lưu trữ:

CALL ShowFromTables(); 
Các vấn đề liên quan