首页 / 知识

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

2023-04-15 11:34:00

关于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。显示表语法


选择查询显示数据

最新内容

相关内容

猜你喜欢