从“显示表”中select数据MySQL查询
是否有可能从MySQL中的show tables
中select?
SELECT * FROM (SHOW TABLES) AS `my_tables`
一些沿着这些线,虽然上述不起作用(在5.0.51a,至less)。
我想你想要SELECT * FROM INFORMATION_SCHEMA.TABLES
不是我所知道的,除非你从INFORMATION_SCHEMA
select,正如其他人所提到的那样。
但是, 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;
你有没有看过查询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;
我想你想要的是MySQL的information_schema视图(S): http : //dev.mysql.com/doc/refman/5.0/en/tables-table.html
SELECT column_comment FROM information_schema.columns WHERE table_name = 'myTable' AND column_name = 'myColumnName'
这将返回关于:myTable.myColumnName的评论
你可能比你想象的更近 – SHOW TABLES已经很像SELECT:
$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
语句放在子查询中。 唯一可以进入子查询的SELECT
是SELECT
。
正如其他答案所述,您可以使用SELECT
直接查询INFORMATION_SCHEMA,并以这种方式获得更多的灵活性。
MySQL的SHOW
语句在内部只是针对INFORMATION_SCHEMA表的查询。
用户@physicalattraction发表了这个评论大多数其他答案:
这给你(元)关于表的信息,而不是表的内容,因为OP的意图。 – 物理引导
相反,OP的问题并不是说要在所有的表格中select数据。 他们说他们想从SHOW TABLES
的结果中select,这只是表名列表。
如果OP想从所有表中select所有的数据,那么答案是否定的,你不能用一个查询来完成。 每个查询必须明确地命名其表。 您不能将表名称作为variables或同一查询的另一部分的结果。 另外,给定查询结果的所有行都必须具有相同的列。
因此,从所有表中select所有数据的唯一方法是运行SHOW TABLES
,然后对于在该结果中命名的每个表,运行另一个查询。
SELECT * FROM INFORMATION_SCHEMA.TABLES
这应该是一个好的开始。 更多信息 ,请查看INFORMATION_SCHEMA表 。
是的,table_schema中的SELECT可能对于系统pipe理非常有用。 如果你有很多的服务器,数据库,表…有时你需要删除或更新一堆的元素。 例如,为DROP创build查询,所有表的前缀名称为“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
作为语句的一部分。
12.5.5.30。 SHOW TABLES语法
在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)
您可以创build一个存储过程并将表名放在一个游标中,然后遍历您的表名来显示数据。
存储过程入门: http : //www.mysqltutorial.org/getting-started-with-mysql-stored-procedures.aspx
创build一个游标: 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();