利用navicat进行跨库查询(2019 年 6 月 4 日,由 Robert Gravelle 撰写转载)
随着主从(Master-Slave)拓扑和数据库分片等现代实践变得越来越普遍,数据库管理员(DBA)和开发人员比以往更常同时访问多个数据库。通过使用可以容纳多个数据库连接的软件,令这些工作变得更加容易。
Navicat Premium就是专为这工作而设。它是一套数据库开发工具,让你同时连接 MySQL、MariaDB、MongoDB、SQL Server、Oracle、PostgreSQL 和 SQLite 数据库。它亦与 Amazon RDS、Amazon Aurora、Amazon Redshift、Microsoft Azure、Oracle Cloud、MongoDB Atlas、阿里云、腾讯云和华为云等云数据库兼容。
在今天的文章中,我们将学习如何构建和运行 SELECT 查询。该查询将使用 Navicat Premium 的 SQL 编辑器从多个数据库中获取数据。
设置环境
我们需要几个表,每个表都在自己的数据库中。碰巧的是,我有一些 Sakila 示例数据库的副本。我已创建了 actors 表的副本并将其内容在中间拆分为两组,以 A 到 L 开头的名称在第一个数据库中,以 M 到 Z 开头的名称在另一个数据库中。我们将会将两组名称组合成一个结果集。以下是 Navicat 对象窗格中的布局:
多个数据库 SELECT 语法
正如你可以在 SELECT 语句中将默认数据库中的表引用为 tbl_name 一样,你也可以在表名前加上数据库名用于显式指定数据库,例如:db_name.tbl_name。数据库前缀也可用于在一个SELECT语句的表列表中组合不同数据库,如 FROM 关键字后面指定的那样。因此,以下是有效的SQL:
SELECT database1.table1.field1,
database2.table1.field1
FROM database1.table1,
database.table1
WHERE database1.table1.age > 12;
使用 JOIN
你可以像往常一样联接(JOIN)表。只需通过在表前添加数据库名称来确保完全限定表名称:
SELECT *
FROM database1.table1 T1
JOIN database2.table1 AS T2 ON T1.id = T2.id
如果您不需要用公共字段联接(JOIN)表,则可以使用 UNION 运算符组合多个 SELECT 语句:
SELECT *
FROM database1.table1 T1
WHERE T1.age > 12
UNION
SELECT *
FROM database2.table1 T2
WHERE T2.age > 12;
现在我们知道如何一次查询两个表,让我们在 actors 表上尝试类似的查询。 我们将选择(SELECT) ID 在特定范围之间的演员:
SELECT T1.actor_id,
T1.first_name,
T1.last_name
FROM sakila.`actor_a-l` T1
WHERE T1.actor_id BETWEEN 30 AND 50
UNION
SELECT T2.actor_id,
T2.first_name,
T2.last_name
FROM sakila2.`actor_m-z` T2
WHERE T2.actor_id BETWEEN 30 AND 50
ORDER BY last_name;
你可以得到保存在于 A-L 表中的演员的结果,而有些演员是来自 M-Z 表:
注意:不适用于跨服务器查询。