Mysql实现"组合两个表"的一种方法

Table: Person

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| PersonId    | int     |
| FirstName   | varchar |
| LastName    | varchar |
+-------------+---------+
PersonId is the primary key column for this table.

Table: Address

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| AddressId   | int     |
| PersonId    | int     |
| City        | varchar |
| State       | varchar |
+-------------+---------+
AddressId is the primary key column for this table.

写一个SQL查询,在Person表中查询每一个人的如下信息,无论这个人是否存在地址信息

FirstName, LastName, City, State

1:简单的join操作

JOIN 按照功能大致分为如下三类:

  • INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
  • LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
  • RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
select FirstName, LastName, City, State from Person left join Address on Person.PersonId=Address.PersonId

 算法题来自:https://leetcode-cn.com/problems/combine-two-tables/description/

### 合并两个的数据到一个 MySQL 要将两个 `t1` 和 `t2` 的数据合并到一个新的中,可以通过多种方法实现。以下是几种常见的解决方案: #### 方法一:使用 `INSERT INTO ... SELECT` 语句 这是最简单的方式之一,适用于直接复制两中的所有数据。 假设目标为 `target_table`,其结构与 `t1` 和 `t2` 完全一致,则可以执行如下 SQL 语句: ```sql -- 插入 t1 数据 INSERT INTO target_table (col1, col2, col3) SELECT col1, col2, col3 FROM t1; -- 插入 t2 数据 INSERT INTO target_table (col1, col2, col3) SELECT col1, col2, col3 FROM t2; ``` 需要注意的是,如果存在重复记录(即主键冲突),则需要处理这些情况。例如,可以选择忽略重复项或更新现有记录[^1]。 --- #### 方法二:使用 `UNION ALL` 或 `UNION DISTINCT` 当希望一次性插入来自多个的数据时,可以利用 `UNION ALL` 或 `UNION DISTINCT` 来组合查询结果后再插入。 - 如果允许重复记录,可使用 `UNION ALL`; - 如果需要去除重复记录,应使用 `UNION DISTINCT`。 示例代码如下: ```sql -- 使用 UNION ALL 插入数据 INSERT INTO target_table (col1, col2, col3) SELECT col1, col2, col3 FROM t1 UNION ALL SELECT col1, col2, col3 FROM t2; -- 使用 UNION DISTINCT 去重后插入数据 INSERT INTO target_table (col1, col2, col3) SELECT col1, col2, col3 FROM t1 UNION DISTINCT SELECT col1, col2, col3 FROM t2; ``` 此方法特别适合于需要对原始数据进行预处理的情况[^4]。 --- #### 方法三:创建存储过程批量插入 对于大规模数据迁移场景,建议采用存储过程以提高效率。以下是一个基于循环的存储过程示例,逐步从源读取数据并插入至目标[^2]。 ```sql DELIMITER $$ CREATE PROCEDURE merge_tables() BEGIN -- 清空目标(如有必要) TRUNCATE TABLE target_table; -- 插入 t1 数据 INSERT INTO target_table (col1, col2, col3) SELECT col1, col2, col3 FROM t1; -- 插入 t2 数据 INSERT INTO target_table (col1, col2, col3) SELECT col1, col2, col3 FROM t2 ON DUPLICATE KEY UPDATE col2 = VALUES(col2), col3 = VALUES(col3); END$$ DELIMITER ; ``` 上述脚本还展示了如何通过 `ON DUPLICATE KEY UPDATE` 处理可能存在的主键冲突问题[^3]。 --- #### 方法四:借助触发器自动同步 如果需要实时保持三个之间的数据一致性,可以考虑设置触发器。每当向 `t1` 或 `t2` 中新增/修改/删除记录时,都会自动反映到 `target_table` 上[^5]。 示例触发器定义如下: ```sql -- 当向 t1 插入数据时,同时写入 target_table CREATE TRIGGER after_insert_t1 AFTER INSERT ON t1 FOR EACH ROW BEGIN INSERT INTO target_table (col1, col2, col3) VALUES (NEW.col1, NEW.col2, NEW.col3); END; -- 类似地,针对 t2 创建对应触发器... ``` 这种方法的优点在于无需手动干预即可维持多间的一致性;缺点则是会增加一定的性能开销。 --- ### 总结 根据实际需求选择合适的技术方案至关重要。如果是简单的单次操作,推荐直接运用 `INSERT INTO ... SELECT` 结合 `UNION` 子句完成任务;而对于复杂业务逻辑或者频繁变动的需求,则更适合引入存储过程乃至触发机制加以应对。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值