61

show tables是否可以在 MySQL 中进行选择?

SELECT * FROM (SHOW TABLES) AS `my_tables`

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

4

13 回答 13

45

我想你想要SELECT * FROM INFORMATION_SCHEMA.TABLES

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

于 2008-09-15T17:27:34.690 回答
21

INFORMATION_SCHEMA正如其他人所提到的,除非您从 中选择,否则我不知道。

但是,该SHOW命令非常灵活,例如:

SHOW tables like '%s%'
于 2008-09-15T17:37:40.237 回答
13

计算:

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;
于 2015-02-20T11:46:42.540 回答
5

您不能SHOW像示例中那样将语句放在子查询中。唯一可以进入子查询的语句是SELECT.

正如其他答案所述,您可以直接查询 INFORMATION_SCHEMASELECT并获得更大的灵活性。

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

用户@physicalattraction 对大多数其他答案发表了此评论:

这为您提供了有关表的(元)信息,而不是表的内容,正如 OP 所期望的那样。– 物理吸引力

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

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

因此,从所有表中选择所有数据的唯一方法是运行SHOW TABLES,然后对于该结果中命名的每个表,运行另一个查询。

于 2013-05-15T23:37:29.467 回答
5

您可能比您想象的更接近 - 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_加上数据库名称。

于 2013-08-02T14:36:38.597 回答
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;
于 2008-09-15T17:27:24.473 回答
4
SELECT * FROM INFORMATION_SCHEMA.TABLES

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

于 2008-09-15T17:30:14.530 回答
3
SELECT column_comment FROM information_schema.columns WHERE table_name = 'myTable' AND column_name = 'myColumnName'

这将返回评论:myTable.myColumnName

于 2010-11-05T17:26:03.060 回答
3

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

于 2008-09-15T17:27:41.790 回答
2

是的,从 table_schema 中选择对于系统管理可能非常有用。如果你有很多服务器、数据库、表……有时你需要删除或更新一堆元素。例如,要为 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_%';
于 2011-12-19T12:51:53.617 回答
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)
于 2013-05-15T22:28:22.893 回答
2

You can create a stored procedure and put the table names in a cursor, then loop through your table names to show the data.

Getting started with stored procedure: http://www.mysqltutorial.org/getting-started-with-mysql-stored-procedures.aspx

Creating a cursor: http://www.mysqltutorial.org/mysql-cursor/

For example,

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

Then call the stored procedure:

CALL ShowFromTables();
于 2017-09-15T14:51:12.820 回答
1

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

12.5.5.30。显示表语法

于 2008-09-15T17:30:22.767 回答