mysql远程跨库联合查询

本文详细介绍如何在同一物理主机或不同物理主机上进行跨库查询,包括使用联合查询和FEDERATED引擎建立远程数据库连接快捷方式的方法,以及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意:myemployees库和shoppingCart库在同一台物理主机,如果不在同一台物理主机该怎么办呢?下面我会介绍到。

情况一2个库在同一台物理主机

联合查询(不同的2个库,myemployees库和shoppingCart库),这2个库在同一台物理主机上,都在我本机。

#联合查询(不同的2个库,myemployees库和shoppingCart库)
SELECT emp01.`employee_id`, emp01.`first_name` FROM myemployees.employees AS emp01 LIMIT 0, 5
UNION
SELECT emp02.`employee_id`, emp02.`first_name` FROM shoppingCart.`employees2` AS emp02;
#
SELECT emp01.`employee_id`, emp01.`first_name` FROM myemployees.employees AS emp01 LIMIT 0, 5
UNION ALL
SELECT emp02.`employee_id`, emp02.`first_name` FROM shoppingCart.`employees2` AS emp02;

情况二2个库不在同一台物理主机(即2个库分别在不同的物理主机)

为了演示效果,我这里使用我的虚拟机,我虚拟机里安装了Linux系统(centos),Linux系统中已经安装了MySql数据库,MySql数据库服务已经启动了,所有的环境已经全部弄好了。

我的Linux系统(centos)的ip是192.168.117.66。

我打算我本地的author表和远程的user表进行联合查询。

在linux中输入SHOW CREATE TABLE `user`;这句话得到的结果后,我们把

CREATE TABLE IF NOT EXISTS `user` (
  `id` INT(11) DEFAULT NULL,
  `name` VARCHAR(20) DEFAULT NULL
)这段代码拷贝到我本地的数据库中,并且在末尾加上

ENGINE =FEDERATED CONNECTION='mysql://root:root@192.168.117.66:3306/testDB/user';这句话。

CREATE TABLE IF NOT EXISTS `user` (
  `id` INT(11) DEFAULT NULL,
  `name` VARCHAR(20) DEFAULT NULL
)ENGINE =FEDERATED CONNECTION='mysql://root:root@192.168.117.66:3306/testDB/user';

其实上面的那段语句,说白了,就是在我本地的数据库中建了一个远程数据库的连接的快捷方式(远程数据库的连接快捷方式),类似于什么呢?就类似于我们window操作系统中的桌面上的桌面快捷方式,我们双击一下桌面上的某个软件图标就能打开该软件,一样的道理嘛。

执行上面的语句即可。

对了,还有一点要注意:

你要查一下,你本地的mysql数据库的FEDERATED引擎有没有开启。

SHOW ENGINES;

如果FEDERATED是NO的话,说明没有开启,需要你去修改一下mysql数据库的配置文件。

修改本地mysql数据库的配置文件,在配置文件末尾加上federated,如下图:

如果你是windows系统的话,就修改my.ini文件,如果你用的是Linux系统的话,就修改my.cnf文件。

修改完配置文件后记得重启一下mysql的服务

linux重启mysql服务,service mysqld restart

windows重启mysql服务,在dos窗口中,输入net stop mysql服务名,然后再输入net start mysql服务名

OK,全部搞定后,执行如下sql语句,即可看到跨库查询的查询结果。

#
SELECT id, aname FROM author
UNION
SELECT id, `name` FROM `user`;

SELECT * FROM author INNER JOIN  `user`;

以上这种跨服务器跨库的查询,需要注意如下几点: 

1.该跨库查询方式不支持事务,最好别使用事务。

2.不能修改表结构。

3.MySQL使用这种跨库查询方式,远程数据库目前仅支持MySQL,其他数据库不支持。

4.表结构必须和目标数据库表完全一致。

<think>嗯,用户问的是MySQL表查询的实现方式和示例。首先,我需要回忆一下MySQL中处理表查询的不同方法。表查询通常指的是在同一数据内不同表之间的关联查询,或者不同数据甚至不同服务器的表查询。不过根据用户提供的引用,他们可能更关注查询,比如同一服务器下的不同数据,或者不同服务器的情况。 首先,用户提到的引用[3]里提到同服务的查询,只需要在表名前加上数据名,用点号分隔。例如SELECT * FROM 数据1.table1 JOIN 数据2.table2 ON ...。这种方法适用于同一MySQL实例下的不同数据,比较简单,用户只需要有权限访问这两个数据即可。需要确认用户是否了解基本的JOIN语法,可能需要给出示例代码。 然后,引用[2]提到了FEDERATED引擎,这适用于不同MySQL服务器的表查询。FEDERATED表实际上是一个虚拟表,数据存储在远程服务器上。创建FEDERATED表需要指定CONNECTION字符串,包含用户名、密码、地址、端口、数据名和表名。用户可能需要注意,FEDERATED引擎在MySQL中可能默认未启用,需要配置。此外,性能可能有问题,特别是大数据量时。 接下来,引用[4]提到了子查询,这可能是在同一查询中嵌套SELECT语句,但子查询通常用于过滤或作为临时结果集,可能不直接用于表,但如果有的情况,可能结合数据名前缀使用子查询。 另外,用户的问题可能还涉及普通的JOIN操作,即同一数据内的多表关联。需要区分开和同的情况,避免混淆。例如,用户可能想知道如何连接不同数据中的表,而不仅仅是同一个数据中的表。 需要检查用户提供的引用,引用[3]中的示例是同服务器,引用[2]是服务器,引用[5]可能涉及链接的服务器配置,但具体内容未完全显示。引用[1]和[4]可能提供背景信息,比如查询的应用场景和多表查询的基本概念。 用户可能需要的实现方式包括: 1. 同一服务器下的查询:使用数据名.表名的形式。 2. 不同服务器下的查询:使用FEDERATED引擎或配置MySQL链接(类似dblink的概念)。 3. 子查询或联合查询作为表查询的一部分。 需要给出每种方法的示例,并说明注意事项,比如权限问题、性能问题、引擎支持等。例如,FEDERATED引擎可能在某些MySQL版本中不可用,或者需要额外配置。同时,服务器查询可能会有网络延迟,影响性能。 另外,用户可能对权限方面有疑问,比如是否需要具有远程服务器的访问权限,或者在同一个服务器中是否需要对两个数据都有SELECT权限。这些在回答中需要提及。 还需要注意,用户提到的“表搜索”可能是指表的全文本搜索,但根据引用内容,可能更偏向于一般的表关联查询,而非特定的全文检索功能。因此,回答应集中在JOIN、FEDERATED引擎、同服务器查询等方法上。 总结步骤: 1. 解释表查询的基本概念,区分同。 2. 同一服务器查询的方法,使用数据名前缀,并提供示例SQL。 3. 服务器查询的方法,使用FEDERATED引擎,提供创建FEDERATED表的示例。 4. 可能提到其他方法,如使用存储过程或中间件,但根据引用内容,可能主要介绍上述两种。 5. 注意事项,如权限、性能、引擎支持等。 6. 提供相关问题,帮助用户深入理解。 需要确保回答中的示例代码正确,比如FEDERATED表的创建语句是否正确,以及JOIN语句的格式是否符合标准。同时,引用对应的参考文献,如引用[3]用于同服务,引用[2]用于FEDERATED引擎。</think>### MySQL表查询实现方式及示例 MySQL表查询主要分为**同数据表查询**和**数据/服务器查询**两类,具体实现方式如下: --- #### 一、同数据表查询 在同一数据内使用标准JOIN语法进行关联查询: ```sql SELECT t1.name, t2.order_id FROM users t1 JOIN orders t2 ON t1.id = t2.user_id; ``` **说明**:通过`JOIN`关联`users`和`orders`表,使用`ON`指定关联条件[^4]。 --- #### 二、数据查询(同一MySQL服务) 在表名前添加**数据名**前缀,用`.`分隔: ```sql SELECT a.*, b.* FROM db1.employees a JOIN db2.salary b ON a.employee_id = b.employee_id; ``` **说明**:需确保用户对`db1`和`db2`均有查询权限[^3]。 --- #### 三、服务器查询(不同MySQL服务) 1. **使用FEDERATED引擎** 创建虚拟表映射远程表: ```sql CREATE TABLE federated_salary ( employee_id INT, amount DECIMAL(10,2) ) ENGINE=FEDERATED CONNECTION='mysql://user:password@192.168.1.100:3306/remote_db/salary'; ``` 查询时直接操作本地虚拟表: ```sql SELECT * FROM local_db.employees JOIN federated_salary ON employees.id = federated_salary.employee_id; ``` **注意**:需启用FEDERATED引擎,且远程表必须存在[^2]。 --- #### 四、子查询嵌套 将表查询结果作为子查询: ```sql SELECT name FROM db1.users WHERE id IN (SELECT user_id FROM db2.orders WHERE amount > 1000); ``` --- ### 关键注意事项 1. **权限控制**:操作需`SELECT`权限,服务器需远程登录权限[^5]。 2. **性能影响**:服务器查询可能因网络延迟导致性能下降,建议对频繁操作的数据做本地缓存。 3. **引擎兼容性**:FEDERATED引擎在MySQL 8.0默认禁用,需手动配置。 ---
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值