随着主从(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 表:
总结
在本篇文章中,我们学习了如何使用 Navicat Premium 构建和运行 SELECT 查询,从多个数据库中获取数据。Navicat 的代码补全和自定义的代码段功能透过关键字建议和减少重复输入相同的代码,令编码更加快速。你可以免费试用 14 天进行评估。