[英]Select data from "show tables" MySQL query
是否可以從 MySQL 的show tables
中進行選擇?
SELECT * FROM (SHOW TABLES) AS `my_tables`
沿着這些路線的東西,雖然以上不起作用(至少在 5.0.51a 上)。
我想你想要SELECT * FROM INFORMATION_SCHEMA.TABLES
不是我所知道的,除非你從INFORMATION_SCHEMA
選擇,正如其他人提到的那樣。
但是, SHOW
命令非常靈活,例如:
SHOW tables like '%s%'
計算:
SELECT COUNT(*) as total FROM (SELECT TABLE_NAME as tab, TABLES.* FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='database_name' GROUP BY tab) tables;
列出:
SELECT TABLE_NAME as table, TABLES.* FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='database_name' GROUP BY table;
您不能像示例中那樣將SHOW
語句放在子查詢中。 可以進入子查詢的唯一語句是SELECT
。
正如其他答案所述,您可以直接使用SELECT
查詢 INFORMATION_SCHEMA 並以這種方式獲得更大的靈活性。
MySQL 的SHOW
語句在內部只是針對 INFORMATION_SCHEMA 表的查詢。
用戶@physicalattraction 在大多數其他答案上發布了此評論:
這為您提供了有關表格的(元)信息,而不是表格的內容,正如 OP 所期望的那樣。 – 物理吸引力
相反,OP的問題並沒有說他們要選擇所有表中的數據。 他們說他們想從SHOW TABLES
的結果中進行選擇,這只是一個表名列表。
如果 OP 確實想要從所有表中選擇所有數據,那么答案是否定的,您不能通過一個查詢來完成。 每個查詢必須明確命名其表。 您不能使表名成為變量或同一查詢的另一部分的結果。 此外,給定查詢結果的所有行必須具有相同的列。
因此,從所有表中選擇所有數據的唯一方法是運行SHOW TABLES
,然后為該結果中命名的每個表運行另一個查詢。
您可能比您想象的更接近 — SHOW TABLES 的行為已經很像 SELECT 語句。 這是一個PHP示例,說明如何獲取其“行”:
$pdo = new PDO("mysql:host=$host;dbname=$dbname",$user,$pass);
foreach ($pdo->query("SHOW TABLES") as $row) {
print "Table $row[Tables_in_$dbname]\n";
}
SHOW TABLES 的行為類似於單列表上的 SELECT。 該列名稱是Tables_in_
加上數據庫名稱。
您是否考慮過查詢 INFORMATION_SCHEMA.Tables? 如
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;
SELECT * FROM INFORMATION_SCHEMA.TABLES
這應該是一個好的開始。 有關更多 信息,請查看INFORMATION_SCHEMA 表。
SELECT column_comment FROM information_schema.columns WHERE table_name = 'myTable' AND column_name = 'myColumnName'
這將返回評論:myTable.myColumnName
我想你想要的是 MySQL 的 information_schema 視圖: http : //dev.mysql.com/doc/refman/5.0/en/tables-table.html
在 MySql 5.1 你可以試試
show tables like 'user%';
輸出:
mysql> show tables like 'user%';
+----------------------------+
| Tables_in_test (user%) |
+----------------------------+
| user |
| user_password |
+----------------------------+
2 rows in set (0.00 sec)
您可以創建一個存儲過程並將表名放在游標中,然后遍歷表名以顯示數據。
存儲過程入門: http : //www.mysqltutorial.org/getting-started-with-mysql-stored-procedures.aspx
創建游標: http : //www.mysqltutorial.org/mysql-cursor/
例如,
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
然后調用存儲過程:
CALL ShowFromTables();
是的,來自 table_schema 的 SELECT 對系統管理非常有用。 如果你有很多服務器、數據庫、表……有時你需要刪除或更新一堆元素。 例如,為 DROP 所有具有前綴名稱“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_%';
我不明白你為什么要使用SELECT * FROM
作為語句的一部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.