MySQL的7种join,交集,并集,差集。

Posted chensi2113

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL的7种join,交集,并集,差集。相关的知识,希望对你有一定的参考价值。

mysql的7种join,交集,并集,差集。

1.总括

mysql种共有7种join(但实际上只有4种主要的:左外连接,右外连接,内连接,全外连接)以下7种不过在此基础上有一些变动:

2.具体实现

(1)内连接(inner join 可简写为join)

从图可知:就是交集,也就是两张表的共同数据;
用sql语句表示为:

select * from a [inner] join b on a.key = b.key

(2)左外连接

从集合上看就是A,B的交集加上A的私有

从集合上看就是A,B的交集加上A的私有
用sql语句表示:

select * from a left join b on a.key = b.key

(3)右外连接

从集合上看就是A,B的交集加上B的私有
用sql语句表示:

select * from a right join b on a.key = b.key

(4)全外连接

从集合上看:就是A和B的共有+A的私有+B的私有 (AB全有)
对应的sql为:

select * from a full outer join b on a.key = b.key;

注意:上面的sql只在Oracle中适用,MYSQL中不支持,因此在MYSQL中想要实现全外连接,得用联合查询(union)实现
什么是联合查询(union)?
简单来说就是把两个sql语句的结果取并集(也就是去重复值)
sql语句如下:

select * from a left join b on a.key = b.key 
union
select * from a right join b on a.key = b.key

剩下的3种只需要在上面4中join的基础上加where条件即可

(5)A的独有

相当于在(2)的基础上加上where条件:

select * from a left join b on a.key = b.key  where b.key is null

(6)B的独有

相当于在(3)的基础上加上where条件:

select * from a right join b on a.key = b.key  where a.key is null
或者
select * from b left join a on a.key = b.key  where a.key is null

(7)相当于A的独有+B的独有

相当于在(4)的基础上加上where条件:

select * from a full outer join b on a.key = b.key 
where a.key is null or b.key is null 

同样,此写法只在oracle中适用,在mysql中得用union

select  * from a  left join b on a.key = b.key where b.key is null
union
select  * from a right join b on a.key = b.key where a.key is null

sql 的并集UNION和内联结INNER JOIN 有啥区别?感觉结果是一样的。

我好像理解了内联结,但是并集UNLON有把我绕晕了。所以想知道他们有什么区别?(内联结、左右外联结、全联结,刚刚好像理解了) 但是突然又跑出个 (并集,交集,差集,不知道他们有什么区别?)就想感觉内联结和并集的结果是一样的。 求高手随便指点指点,我很快就会明白的。QQQ

union与inner join不存在区别的,主要体现如下:
1)union:是无条件合并两个结果集的,前提是列的数据类型相兼容,体现在行数增加了;
2)inner join:是需要给出关联字段条件且相等才连接两个结果集,体现在列数增加了。
参考技术A join是针对列,union是针对行。

还有的区别就是inner join需要关联条件,也就是表和表之间需要有联系
union则不需要,可以之间把两个表select 的结果进行连接
参考技术B SQL的并集UNION只能查询两表字段类型(同为int 或者 字符串)相同时才能使用
如 Select id,name,age from tableA
Select id,name,age from tableB 可以并集得到两表查询的结果集
而INNER JOIN 是内连接,需要两表存在关联关系,并且查询出来的结果是两表所有字段的结果集,UNION不需要关联关系 只要查询的字段对应类型一致即可
参考技术C 当然不一样了 其中主要区别在于
UNION 多条查询结果合并一起 而且查询的结果字段还必须相同 尤其是一个查询语句无法满足查询结果的情况
INNER JOIN 是联合多表 可同时查询多个表字段 和多个表条件
简单举个例子
假如表 TABLE 有字段 ID NAME
UNION 可以的查询
SELECT * FROM TABLE WHERE ID = 2
UNION
SELECT * FROM TABLE WHERE ID <>2 AND NAME = 'A'
合并这样的查询
参考技术D 区别大了,join是列的联接,union是行的联接。追问

如果他们联结的对象是主键和外键
JOIN是列的联结。大概的意思是将外键按照主键相加,会把子表里面的其他字段也给带过去。结果会包含除了主键和外键以外的其他的所有字段。
UNION是行的联结,结果是不包含其他的字段。只有该字段的记录。是把两个字段的记录相加成一个字段。
是不是大概这个意思啊。。。

追答

join基本正确。union你理解错了吧,举个例子,where age = 20结果有2条,where age = 30有3条,那么union起来共5条。union通常针对同样表(很多时候就只有一个表)结构的多次select,如果字段不一样就没法union了。

本回答被提问者采纳

以上是关于MySQL的7种join,交集,并集,差集。的主要内容,如果未能解决你的问题,请参考以下文章

java 求交集 并集 差集

Hive 差集交集并集

两个list,并集交集差集

SQL集合运算:差集、交集、并集

java找到两个list的交集并集差集

Python求两个list的交集并集补集对称差集的两种方法