在 MySQL 中,跨库查询指的是在一个 SQL 语句中访问多个数据库中的表。实现跨库查询的核心是通过「数据库名。表名」的方式指定表的完整路径,适用于同一服务器上的多个数据库(不同服务器间的跨库查询需用联邦查询等特殊方式)。
跨库查询的基本格式为:
SELECT 字段 FROM 数据库名.表名 WHERE 条件;
如果需要关联多个库的表,格式与单库联表查询类似:
SELECT 字段
FROM 库1.表1
JOIN 库2.表2 ON 关联条件
WHERE 过滤条件;
假设有两个数据库:
-
db1
,包含表 user
(字段:id, name, dept_id
)
-
db2
,包含表 department
(字段:dept_id, dept_name
)
需要查询用户姓名及其所属部门名称(跨 db1
和 db2
):
SELECT
u.name,
d.dept_name
FROM
db1.user u
JOIN
db2.department d
ON
u.dept_id = d.dept_id;
-
权限问题执行跨库查询的用户必须对涉及的所有数据库和表有查询权限,否则会报权限错误。授权示例:
GRANT SELECT ON db1.* TO '用户名'@'访问IP';
GRANT SELECT ON db2.* TO '用户名'@'访问IP';
-
表名重复处理若不同库中有同名表,必须通过「库名。表名」明确区分,避免歧义。
-
跨服务器查询上述方法仅适用于同一 MySQL 服务器上的多个数据库。若需查询不同服务器的数据库,需使用:
-
Federated 存储引擎:通过创建「远程表映射」在本地库中访问远程表(需提前配置)。
-
中间件:如 MyCat、Sharding-JDBC 等,适合分布式数据库场景。
若需跨服务器查询,可使用 Federated 引擎(默认可能未启用):
-
启用 Federated 引擎在 MySQL 配置文件中添加:
重启 MySQL 服务后,通过 SHOW ENGINES;
确认 Federated
状态为 YES
。
-
创建远程表映射在本地库中创建一个映射表,指向远程服务器的表:
CREATE TABLE department_remote (
dept_id INT,
dept_name VARCHAR(50)
) ENGINE=FEDERATED
CONNECTION='mysql://用户名:密码@远程服务器IP:端口/db2/department';
-
查询远程表之后可像查询本地表一样使用映射表,间接实现跨服务器查询:
SELECT u.name, d.dept_name
FROM db1.user u
JOIN db1.department_remote d
ON u.dept_id = d.dept_id;
-
同一服务器的跨库查询:直接用「
数据库名.表名
」访问,语法简单。
-
不同服务器的跨库查询:需借助 Federated 引擎或中间件,配置较复杂。
-
核心前提:确保查询用户对涉及的所有库表有足够权限。
根据实际场景选择合适的方式,日常开发中同一服务器的跨库查询更为常见。