首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何列出来自多个MySQL数据库的表数据?

问如何列出来自多个MySQL数据库的表数据?
EN

Stack Overflow用户
提问于 2016-04-09 20:01:53
回答 1查看 101关注 0票数 1

我在MySQL中有几十个数据库,它们都有具有相同结构的表log。是否有简单的方法(一行或两行SQL)在所有数据库中列出来自所有这些相似表的数据?而不需要写所有的数据库名称?

谢谢你提前提供帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-09 20:23:59

系统表information_schema.TABLES保存表信息,包括拥有表的架构(数据库)。通过巧妙地与UNION ALL连接,您可以使用它来构造一个结合所有log表的GROUP_CONCAT()查询。

但是,您将使用一个,片段UNION ALL SELECT col, col2, col3..作为分隔符,而不是默认的SQL连接分隔符。结果将是一个如下所示的查询:

代码语言:javascript
复制
SELECT col, col2, col3 FROM db1.log 
UNION ALL SELECT col, col2, col3 FROM db2.log
UNION ALL SELECT col, col2, col3 FROM db3.log...

查询的效果如下:

代码语言:javascript
复制
SELECT CONCAT('SELECT col1, col2, col3 FROM ', 
  GROUP_CONCAT(CONCAT(TABLE_SCHEMA, '.log') SEPARATOR ' UNION ALL SELECT col1, col2, col3 FROM '))
FROM information_schema.TABLES
WHERE TABLE_NAME = 'log';

外部CONCAT()确保SELECT cols... FROM开始查询。GROUP_CONCAT()将所有数据库集中在一个由UNION ALL组件连接的行中,CONCAT(TABLE_SCHEMA, '.log')用log表名对动态检索的数据库名称进行限定。

使用SELECT *可能很有诱惑力,但如果表的列顺序不一致,我会避免使用它。

这将输出一个完整的SQL字符串,然后您可以在任何客户机中执行该字符串。还可以将其放在CREATE PROCEDURE的主体中,后者将创建字符串,然后在其上调用PREPARE和EXECUTE。一般来说,这采取的形式是:

代码语言:javascript
复制
SET @qry = 'SELECT CONCAT(\'SELECT col1, col2, col3 FROM \', GROUP_CONCAT(....'
PREPARE stmt FROM @qry;
EXECUTE stmt;

请记住,在这个上下文中,SQL是一个字符串,它必须是完整的单引号,您必须反斜杠转义其中的引号。

最后,一个关于标识符引用的注释。这里的代码假设您的数据库名不需要回勾引用。根据数据库的命名方式,可能需要进行CONCAT()回退,如

代码语言:javascript
复制
CONCAT('`', TABLE_SCHEMA, '`')
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36522003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档