mysql-关联查询 内连接 外连接(左外,右外,全连接) 交叉连接(迪卡积尔)

发布时间 2023-10-26 11:24:21作者: sunny123456

mysql-关联查询

关联查询:数据查询是Mysql数据库管理最重要的一个功能,关联查询是关系型数据库最主要的查询。包括内连接([inner] join … on),外连接(left/right [outer] join … on),全外连接,通过关联查询可实现多个表连接的条件关系查询得到预期结果。
基本定义:
[inner] join … on(内连接或等值连接,不写inner默认为内连接):返回两张表中符合连接条件的字段值,即两张表的数据交集。
left [outer] join … on(左外连接,一般默认不写outer):以左边的表为基表,返回左表的全部记录,右表中符合连接条件的记录,不足的地方为Null。
right [outer] join … on(右外连接,一般默认不写outer):以右边的表为基表,返回右表的全部记录,左表中符合连接条件的记录,不足的地方为Null。
full join(全外连接):oracle支持该种写法,mysql不支持。mysql可通过union关键字实现(左连接 union 右连接)。
说明:
union(合并查询,去重复):使用UNION关键字是将所有查询结果合并到一起,然后去除相同的记录。
union all(合并查询):使用UNION ALL关键字则是将所有的结果合并到一起。
示例解释:
新建两张表:

CREATE TABLE `a_table` (
  `a_id` int(11) DEFAULT NULL,
  `a_name` varchar(10) DEFAULT NULL,
  `a_part` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
  • 1
  • 2
  • 3
  • 4
  • 5
CREATE TABLE `b_table` (
  `b_id` int(11) DEFAULT NULL,
  `b_name` varchar(10) DEFAULT NULL,
  `b_part` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
  • 1
  • 2
  • 3
  • 4
  • 5

插入数据:

INSERT INTO `a_table` VALUES(1,'赵','销售');
INSERT INTO `a_table` VALUES(2,'钱','技术');
INSERT INTO `a_table` VALUES(3,'孙','人事');
INSERT INTO `a_table` VALUES(4,'李','销售');
  • 1
  • 2
  • 3
  • 4
INSERT INTO `b_table` VALUES(2,'钱','技术');
INSERT INTO `b_table` VALUES(4,'李','销售');
INSERT INTO `b_table` VALUES(6,'周','技术');
INSERT INTO `b_table` VALUES(8,'吴','人事');
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述 在这里插入图片描述
内连接(不写inner时,默认为内连接):

select * from a_table a inner join b_table b on a.a_id = b.b_id;
  • 1

结果如下图:
在这里插入图片描述
说明:将表a_table和表b_table中a.id和b.id相同的行筛选出,求两表的交集
在这里插入图片描述
左连接:

select * from a_table a left join b_table b on a.a_id = b.b_id;
  • 1

结果如下图:
在这里插入图片描述
说明:左表(a_table)的记录将会全部显示出来,而右表(b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。
在这里插入图片描述
右连接:

select * from a_table a right join b_table b on a.a_id = b.b_id;
  • 1

结果如下图:
在这里插入图片描述
说明:和左连接规则相反。
在这里插入图片描述
全外连接(union):

select * from a_table a left join  b_table b on a.a_id=b.b_id 
	union 
select * from a_table a right join b_table b on a.a_id = b.b_id;
  • 1
  • 2
  • 3

结果如下图:
在这里插入图片描述
说明:使用UNION关键字是将所有查询结果合并到一起,然后去除相同的记录。左表的记录+右表的记录-相交的记录
全外连接(union all):

select * from a_table a left join  b_table b on a.a_id=b.b_id 
	union all
select * from a_table a right join b_table b on a.a_id = b.b_id;
  • 1
  • 2
  • 3

结果如下图:
在这里插入图片描述
说明:使用UNION ALL关键字则是将所有的结果合并到一起。左表的记录+右表的记录+相交的记录

原文可参考链接:

https://www.jianshu.com/p/766dec20e28f
  • 1
原文链接:https://blog.csdn.net/qq_40298231/article/details/106091906/