MySQL连接用法示例

以下的文章主要介绍的是MySQL连接用法总结,以及MySQL连接的概念,各种连接的具体使用方案,数据库增量同步实例的介绍,如果你对这些相关的内容心存好奇的话,你就可以对以下的文章进行阅读了。

1、MySQL连接简介

MySQL支持的连接类型如下:

 

交叉连接、内连接、外连接(左外MySQL连接和右外连接)、自连接、联合

 

 

2、各种连接的使用方法

 

在演示各种MySQL连接的用法之前,我们先定义如下的数据库表格,以后的演示就使用它们。

 

  1. mysql> select * from t_users;  
  2. +---------+-----------+---------+---------------------+  
  3. | iUserID | sUserName | iStatus | dtLastTime |  
  4. +---------+-----------+---------+---------------------+  
  5. | 1 | baidu | 0 | 2010-06-27 15:04:03 |  
  6. | 2 | google | 0 | 2010-06-27 15:04:03 |  
  7. | 3 | yahoo | 0 | 2010-06-27 15:04:03 |  
  8. | 4 | tencent | 0 | 2010-06-27 15:04:03 |  
  9. +---------+-----------+---------+---------------------+mysql> select * from t_groups;  
  10. +----------+------------+---------------------+  
  11. | iGroupID | sGroupName | dtLastTime |  
  12. +----------+------------+---------------------+  
  13. | 1 | spring | 2010-06-27 15:04:03 |  
  14. | 2 | summer | 2010-06-27 15:04:03 |  
  15. | 3 | autumn | 2010-06-27 15:04:03 |  
  16. | 4 | winter | 2010-06-27 15:04:03 |  
  17. +----------+------------+---------------------+mysql> select * from t_users_groups;  
  18. +---------+----------+---------------------+  
  19. | iUserID | iGroupID | dtLastTime |  
  20. +---------+----------+---------------------+  
  21. | 1 | 1 | 2010-06-27 15:04:03 |  
  22. | 2 | 1 | 2010-06-27 15:04:03 |  
  23. | 4 | 3 | 2010-06-27 15:04:03 |  
  24. | 6 | 4 | 2010-06-27 15:04:03 |  
  25. +---------+----------+---------------------+1.交叉连接  

2.内连接

3.外连接

 

外连接有什么特点?简而言之,外连接作用在通过某个key相连接的两张表上,它首先从A表中依次读出每行数据,然后到与之相连接的B表,寻找具有相同key值的记录。如果有匹配行,A和B的对应记录组成新结果行;如果没有,A与一条各字段为NULL的B记录组成新结果行。

 

到底从哪个表中选择所有行,SQL标准定义了左外连接和右外连接。

 

 

左外连接:

 

 

  1. mysql> SELECT * FROM t_users LEFT JOIN t_users_groups ON t_users.iUserID=t_users_groups.iUserID;  
  2. +---------+-----------+---------+---------------------+---------+----------+---------------------+  
  3. | iUserID | sUserName | iStatus | dtLastTime | iUserID | iGroupID | dtLastTime |  
  4. +---------+-----------+---------+---------------------+---------+----------+---------------------+  
  5. | 1 | baidu | 0 | 2010-06-27 15:04:03 | 1 | 1 | 2010-06-27 15:04:03 |  
  6. | 2 | google | 1 | 2010-06-27 15:46:51 | 2 | 1 | 2010-06-27 15:04:03 |  
  7. | 3 | yahoo | 1 | 2010-06-27 15:46:51 | NULL | NULL | NULL |  
  8. | 4 | tencent | 0 | 2010-06-27 15:04:03 | 4 | 3 | 2010-06-27 15:04:03 |  
  9. +---------+-----------+---------+---------------------+---------+----------+---------------------+  
  10. 4 rows in set (0.00 sec) 

t_users为上述描述中的A表,t_users_groups为B表。

 

右外连接:

 

  1. mysql> SELECT * FROM t_users RIGHT JOIN t_users_groups ON t_users.iUserID=t_users_groups.iUserID;  
  2. +---------+-----------+---------+---------------------+---------+----------+---------------------+  
  3. | iUserID | sUserName | iStatus | dtLastTime | iUserID | iGroupID | dtLastTime |  
  4. +---------+-----------+---------+---------------------+---------+----------+---------------------+  
  5. | 1 | baidu | 0 | 2010-06-27 15:04:03 | 1 | 1 | 2010-06-27 15:04:03 |  
  6. | 2 | google | 1 | 2010-06-27 15:46:51 | 2 | 1 | 2010-06-27 15:04:03 |  
  7. | 4 | tencent | 0 | 2010-06-27 15:04:03 | 4 | 3 | 2010-06-27 15:04:03 |  
  8. | NULL | NULL | NULL | NULL | 6 | 4 | 2010-06-27 15:04:03 |  
  9. +---------+-----------+---------+---------------------+---------+----------+---------------------+  
  10. 4 rows in set (0.00 sec) 

t_users_groups为上述描述中的A表,t_users为B表。

4.自MySQL连接

5.联合

 

UNION运算符表示联合,它用来把多个SELECT查询的结果连接成一个单独的结果集,但在MySQL连接时去除重复行。可以使用UNION连接尽可能多的SELECT查询,但要谨记两个基本条件。首先,每个SELECT查询返回的字段个数必须相同。第二,每个SELECT查询的字段类型必须依次相同。

 

我们举个联合例子:

 

  1. mysql> SELECT iUserID,sUserName,dtLastTime FROM t_users   
  2. -> UNION   
  3. -> SELECT iGroupID,sGroupName,dtLastTime FROM t_groups;  
  4. +---------+-----------+---------------------+  
  5. | iUserID | sUserName | dtLastTime |  
  6. +---------+-----------+---------------------+  
  7. | 1 | baidu | 2010-06-27 15:04:03 |  
  8. | 2 | google | 2010-06-27 15:46:51 |  
  9. | 3 | yahoo | 2010-06-27 15:46:51 |  
  10. | 4 | tencent | 2010-06-27 15:04:03 |  
  11. | 1 | spring | 2010-06-27 15:04:03 |  
  12. | 2 | summer | 2010-06-27 15:04:03 |  
  13. | 3 | autumn | 2010-06-27 15:04:03 |  
  14. | 4 | winter | 2010-06-27 15:04:03 |  
  15. +---------+-----------+---------------------+ 

8 rows in set (0.01 sec)

对UNION的每个SELECT添加ORDER BY子句是没有意义的,如果要排序则必须将其施加到***的结果集上。比如我们要对上面的例子中的iUserID进行排序,应该使用如下的SQL语句:

  1. mysql> (SELECT iUserID,sUserName,dtLastTime FROM t_users)   
  2. -> UNION   
  3. -> (SELECT iGroupID,sGroupName,dtLastTime FROM t_groups)  
  4. -> ORDER BY iUserID ASC;  
  5. +---------+-----------+---------------------+  
  6. | iUserID | sUserName | dtLastTime |  
  7. +---------+-----------+---------------------+  
  8. | 1 | baidu | 2010-06-27 15:04:03 |  
  9. | 1 | spring | 2010-06-27 15:04:03 |  
  10. | 2 | google | 2010-06-27 15:46:51 |  
  11. | 2 | summer | 2010-06-27 15:04:03 |  
  12. | 3 | yahoo | 2010-06-27 15:46:51 |  
  13. | 3 | autumn | 2010-06-27 15:04:03 |  
  14. | 4 | tencent | 2010-06-27 15:04:03 |  
  15. | 4 | winter | 2010-06-27 15:04:03 |  
  16. +---------+-----------+---------------------+  
  17. 8 rows in set (0.02 sec) 

以上的相关内容就是对MySQL连接与各种连接的使用方法的介绍,望你能有所收获。#p#

3、数据库增量同步例子

假设我们还有一个db_src.t_users,它与db_tar.t_users结构完全相同。现网的应用策略,要求先操作db_src.t_users,确认无误后再同步到db_tar.t_users。所以两边数据只会存在三种情况,后面我们将分别介绍如何使用SQL连接在数据库间增量同步数据。

 

  1. mysql> select * from t_users;  
  2. +---------+-----------+---------+---------------------+  
  3. | iUserID | sUserName | iStatus | dtLastTime |  
  4. +---------+-----------+---------+---------------------+  
  5. | 1 | baidu | 0 | 2010-06-27 15:04:03 |  
  6. | 2 | google | 1 | 2010-06-27 15:46:51 |  
  7. | 3 | yahoo | 1 | 2010-06-27 15:46:51 |  
  8. | 4 | tencent | 0 | 2010-06-27 15:04:03 |  
  9. | 5 | netease | 0 | 2010-06-27 15:04:03 |  
  10. +---------+-----------+---------+---------------------+  
  11. 5 rows in set (0.01 sec) 

情况1:db_src.t_users存在某条记录,db_tar.t_users中不存在。策略->将前者中的记录插入到后者中。

解决该问题的SQL语句为:

 

  1. INSERT INTO db_tar.t_users select db_src.t_users.*   
  2. FROM db_src.t_users LEFT JOIN db_tar.t_users ON db_src.t_users.iUserID=db_tar.t_users.iUserID   
  3. WHERE db_tar.t_users.iUserID IS NULL;  

 

同步原理其实很简单,核心SQL语句就是SELECT db_src.t_users.iUserID, db_src.t_users.sUserName, db_tar.t_users.* FROM db_src.t_users LEFT JOIN db_tar.t_users ON

 

  1. db_src.t_users.iUserID=db_tar.t_users.iUserID WHERE db_tar.t_users.iUserID IS NULL。如果不使用where条件检索数据,执行SQL得到结果如下:   
  2. mysql> SELECT db_src.t_users.iUserID, db_src.t_users.sUserName, db_tar.t_users.*   
  3. -> FROM db_src.t_users   
  4. -> LEFT JOIN db_tar.t_users ON db_src.t_users.iUserID=db_tar.t_users.iUserID;  
  5. +---------+-----------+---------+-----------+---------+---------------------+  
  6. | iUserID | sUserName | iUserID | sUserName | iStatus | dtLastTime |  
  7. +---------+-----------+---------+-----------+---------+---------------------+  
  8. | 1 | baidu | 1 | baidu | 0 | 2010-06-27 15:04:03 |  
  9. | 2 | google | 2 | google | 1 | 2010-06-27 15:46:51 |  
  10. | 3 | yahoo | 3 | yahoo | 1 | 2010-06-27 15:46:51 |  
  11. | 4 | tencent | 4 | tencent | 0 | 2010-06-27 15:04:03 |  
  12. | 5 | netease | NULL | NULL | NULL | NULL |  
  13. +---------+-----------+---------+-----------+---------+---------------------+ 

5 rows in set (0.00 sec)加入where语句后,我们就能得到”iUserID=5″这条记录不在目标数据表中,使用insert语句可以将其插入到目标数据库中,从而完成同步操作。

情况2:db_src.t_users存在某条记录,db_tar.t_users中也存在。策略->如果两者数据不同,则修改后者的记录。

这里有个问题,就是如何判断这两条记录是否不同。我们可以采用逐个字段比较的方法,但字段较多的时候就不好使用了。简单点的方法是规定修改db_src.t_users时,必须同时将db_src.t_users.dtLastTime修改为当前时间,以后就可以通过比较dtLastTime来判断数据是否不同。

 

根据上述判断方法,解决该问题的SQL语句为:

 

  1. select CONCAT('UPDATE db_src.t_users SET ',   
  2. 'iUserID=\'', db_src.t_users.iUserID, '\',',   
  3. 'sUserName=\'', db_src.t_users.sUserName, '\',',   
  4. 'iStatus=\'', db_src.t_users.iStatus, '\',',   
  5. 'dtLastTime=\'', db_src.t_users.dtLastTime, '\' ',   
  6. 'WHERE db_tar.t_users.iUserID=\'', db_src.t_users.iUserID, '\';')   
  7. from db_src.t_users left join db_tar.t_users on db_src.t_users.iUserID = db_tar.t_users.iUserID  
  8. where db_tar.t_users.iUserID is not null and   
  9. db_src.t_users.dtLastTime > db_tar.t_users.dtLastTime; 

 

直接执行上述语句得到只是一组UPDATE的SQL,并不能直接修改db_tar.t_users,我们可以在shell命令行上执行下面的这个命令完成同步功能:

 

  1. mysql -Nse select CONCAT('UPDATE db_src.t_users SET ',   
  2. 'iUserID=\'', db_src.t_users.iUserID, '\',',   
  3. 'sUserName=\'', db_src.t_users.sUserName, '\',',   
  4. 'iStatus=\'', db_src.t_users.iStatus, '\',',   
  5. 'dtLastTime=\'', db_src.t_users.dtLastTime, '\' ',   
  6. 'WHERE db_tar.t_users.iUserID=\'', db_src.t_users.iUserID, '\';')   
  7. from db_src.t_users left join db_tar.t_users on db_src.t_users.iUserID = db_tar.t_users.iUserID  
  8. where db_tar.t_users.iUserID is not null and   
  9. db_src.t_users.dtLastTime > db_tar.t_users.dtLastTime; | mysql;  

 

情况3:db_src.t_users不存在某条记录,但在db_tar.t_users中存在。策略->将该记录从后者中删除。

 

解决该问题的SQL语句为:

 

  1. SELECT CONCAT('DELETE FROM db_tar.t_users WHERE db_tar.t_users.iUserID=',   
  2. db_tar.t_users.iUserID, ';')   
  3. FROM db_tar.t_users LEFT JOIN db_src.t_users ON db_src.t_users.iUserID=db_tar.t_users.iUserID   
  4. WHERE db_src.t_users.iUserID IS NULL; 

该SQL语句的情况和第二种情况相似,也不能直接执行。所以需要采用同样的方式使用SQL语句才能完成工作。可能已经有人看出了,还有更为简单的方法可以处理这种情况。对,确实存在!当然可以使用下面更为简洁的SQL语句:

 

  1. DELETE FROM db_tar.t_users   
  2. WHERE db_tar.t_users.UserID NOT IN (SELECT db_src.t_users.iUserID FROM db_src.t_users); 

以上的相关内容就是对MySQL连接用法总结的介绍,望你能有所收获。

【编辑推荐】

  1. MySQL root密码忘记的解决
  2. MySQL导入导出.sql文件实践演练
  3. MySQL数据库中的5种数据类型简介
  4. 对MySQL DELETE语法的详细解析
  5. MySQL show的实际操作用法

 

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/225735.html<

(0)
管理的头像管理
上一篇2025-04-17 01:12
下一篇 2025-04-17 01:14

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注