从“show tables”MySQL查询中选择数据

时间:2008-09-15 17:24:54

标签: mysql sql metadata

是否可以从MySQL中选择show tables

SELECT * FROM (SHOW TABLES) AS `my_tables`

沿着这些方向的东西,虽然上面的方法不起作用(至少在5.0.51a上)。

13 个答案:

答案 0 :(得分:40)

我想你想要SELECT * FROM INFORMATION_SCHEMA.TABLES

请参阅http://dev.mysql.com/doc/refman/5.0/en/tables-table.html

答案 1 :(得分:20)

我不知道,除非你从其他人提到的INFORMATION_SCHEMA中选择。

但是,SHOW命令非常灵活, E.g:

SHOW tables like '%s%'

答案 2 :(得分:11)

要算:

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;

答案 3 :(得分:4)

您是否考虑过查询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;

答案 4 :(得分:4)

您不能将SHOW语句放在子示例中,就像您的示例中一样。可以在子查询中使用的唯一语句是SELECT

正如其他答案所述,您可以直接使用SELECT查询INFORMATION_SCHEMA,并以此方式获得更多灵活性。

MySQL的SHOW语句内部只是针对INFORMATION_SCHEMA表的查询。

用户@physicalattraction已将此评论发布在大多数其他答案中:

  

这为OP提供了关于表的信息,而不是表格的内容。 - 物理吸引

相反,OP的问题表示他们想要在所有表中选择数据。他们说他们想要从SHOW TABLES的结果中进行选择,SHOW TABLES只是一个表名列表。

如果OP确实想要从所有表中选择所有数据,那么答案是否定的,你不能用一个查询来做。每个查询都必须明确命名其表。您不能使表名成为变量或同一查询的另一部分的结果。此外,给定查询结果的所有行必须具有相同的列。

因此,从所有表中选择所有数据的唯一方法是运行{{1}},然后对于该结果中指定的每个表,运行另一个查询。

答案 5 :(得分:3)

我认为你想要的是MySQL的information_schema视图: http://dev.mysql.com/doc/refman/5.0/en/tables-table.html

答案 6 :(得分:3)

SELECT * FROM INFORMATION_SCHEMA.TABLES

这应该是一个好的开始。有关更多信息,请查看INFORMATION_SCHEMA Tables

答案 7 :(得分:3)

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

这将返回以下注释:myTable.myColumnName

答案 8 :(得分:3)

你可能比你想象的更近 - 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";
}

答案 9 :(得分:2)

是的,table_schema中的SELECT对于系统管理非常有用。如果你有很多服务器,数据库,表......有时你需要DROP或UPDATE一堆元素。例如,为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_%';

答案 10 :(得分:2)

在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)

答案 11 :(得分:1)

我不明白你为什么要使用SELECT * FROM作为声明的一部分。

12.5.5.30. SHOW TABLES Syntax

答案 12 :(得分:1)

您可以创建存储过程并将表名放在游标中,然后遍历表名以显示数据。

存储过程入门: 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();