关于sql:从“显示表” MySQL查询中选择数据

关于sql:从“显示表” MySQL查询中选择数据

Select data from “show tables” MySQL query

在MySQL中可以从show tables中选择吗?

1
SELECT * FROM (SHOW TABLES) AS `my_tables`

尽管上面的方法行不通(至少在5.0.51a上有效),但遵循这些原则还是可以的。


我想你要SELECT * FROM INFORMATION_SCHEMA.TABLES

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


据我所知,除非您如其他人所提到的那样从INFORMATION_SCHEMA中进行选择。

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

1
SHOW tables like '%s%'


计数:

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

列出:

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

您可能比您认为SHOW TABLES表现得更像SELECT更接近:

1
2
3
4
5
$pdo = new PDO("mysql:host=$host;dbname=$dbname",$user,$pass);
foreach ($pdo->query("SHOW TABLES") as $row) {
    print"Table $row[Tables_in_$dbname]
"
;
}

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

正如其他答案所指出的那样,您可以直接使用SELECT查询INFORMATION_SCHEMA,从而获得更多的灵活性。

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

用户@physicalattraction在大多数其他答案上发布了此评论:

This gives you (meta)information about the tables, not the contents of the table, as the OP intended. – physicalattraction

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

如果OP确实希望从所有表中选择所有数据,那么答案是否定的,您无法通过一个查询来完成。每个查询必须显式命名其表。您不能将表名设为变量或同一查询的另一部分的结果。同样,给定查询结果的所有行必须具有相同的列。

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


您是否考虑过查询INFORMATION_SCHEMA.Tables?如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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;


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

存储过程入门:
http://www.mysqltutorial.org/getting-started-with-mysql-stored-procedures.aspx

创建一个游标:
http://www.mysqltutorial.org/mysql-cursor/

例如,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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

然后调用存储过程:

1
CALL ShowFromTables();

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

这将返回以下评论:myTable.myColumnName


1
SELECT * FROM INFORMATION_SCHEMA.TABLES

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


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


在MySQL 5.1中,您可以尝试

1
show tables like 'user%';

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> show tables like 'user%';

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

| Tables_in_test (user%) |

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

| user                       |

| user_password              |

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

2 rows in set (0.00 sec)


是的,来自table_schema的SELECT对于系统管理可能非常有用。如果您有很多服务器,数据库,表...有时您需要DROP或UPDATE一堆元素。例如,创建查询以删除所有前缀名称为" wp_old _..."的表:

1
2
3
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。显示表语法


推荐阅读

    linux查询ip命令?

    linux查询ip命令?,地址,网络,信息,设备,系统,电脑,终端,命令,中心,技术指标,l

    linux显示错误命令?

    linux显示错误命令?,信息,系统,电脑,状态,时间,环境,命令,搜狐,密码,异常,虚

    linux逐行显示命令?

    linux逐行显示命令?,标准,信息,系统,工作,地址,命令,实时,名称,文件,目录,Lin

    linux日志命令查询?

    linux日志命令查询?,系统,名称,信息,实时,电脑,对比,最新,日志,命令,环境,Lin

    linux文本查询命令?

    linux文本查询命令?,标准,命令,文件,工具,数据,信息,位置,系统,内容,文本,Lin

    linux显示时间命令?

    linux显示时间命令?,时间,系统,管理,标准,信息,单位,工具,数据,中国,命令,lin

    查询linux的命令历史?

    查询linux的命令历史?,信息,系统,名称,地址,服务,命令,数据,环境,指令,用户,

    linux启动显示命令行?

    linux启动显示命令行?,系统,密码,终端,状态,首页,情况,基础,电脑,信息,工具,l

    linux命令左右查询?

    linux命令左右查询?,系统,信息,管理,地址,工作,命令,文件,单位,位置,数据,lin

    linux储存命令数据?

    linux储存命令数据?,系统,工作,地址,信息,标准,命令,工具,实时,数据,分析,lin

    linux线程查询命令?

    linux线程查询命令?,系统,第一,线程,命令,软件,名称,信息,进程,选项,方法,Lin

    linux命令左右查询?

    linux命令左右查询?,系统,信息,管理,地址,工作,命令,文件,单位,位置,数据,lin

    linux简单查询命令?

    linux简单查询命令?,地址,命令,信息,设备,电脑,系统,工作,文件,终端,内容,Lin

    linux启动显示命令行?

    linux启动显示命令行?,系统,密码,终端,状态,首页,情况,基础,电脑,信息,工具,l

    查询linux配置的命令?

    查询linux配置的命令?,系统,网络,地址,情况,信息,电脑,中科,状态,服务,命令,

    linux显示之前的命令?

    linux显示之前的命令?,系统,信息,命令,地址,服务,环境,数据,标准,数字,不了,l

    linux打开显示器命令?

    linux打开显示器命令?,信息,工具,系统,环境,发行,实时,数据,设备,命令,文件,L

    查询linux配置的命令?

    查询linux配置的命令?,系统,网络,地址,情况,信息,电脑,中科,状态,服务,命令,

    linux命令大全数据库?

    linux命令大全数据库?,服务,系统,平台,状态,软件,通用,环境,数据,神州,地址,

    linux命令实时显示?

    linux命令实时显示?,系统,实时,时间,信息,情况,命令,对比,电脑,名称,一致,lin