学习前准备:安装Mysql,并准备两张数据表,保证两张数据表有公共数据,如下所示
背景:
在实际应用中,我们要查的数据很可能不在同一个表中,而是来自于不同的表
一:多表查询如果不加任何条件,得到的结果称为笛卡尔积,
结果数量为两张表数量的乘积
二:自连接 :
自连接是指在同一张表连接查询
新建一张名为“user”练习数据表(见上图)
任务:查询与“张三”来自同一个国家的人
![](https://i-blog.csdnimg.cn/blog_migrate/ddb81089141ceebb30befb6ef0aa12ca.png)
三 :多表连接
准备:新建一个country的表
3.1 内连接 :
通过内连接得到的是内部共有数据,所以连接方式称为内连接
![](https://i-blog.csdnimg.cn/blog_migrate/12396f4ea72390975435391d3b8b92d9.png)
任务:搜索“张三”的国家名字 (user country)
因为国家名字与张三名字存放的数据表不是同一张,所以需要两张表联合查询数据
![](https://i-blog.csdnimg.cn/blog_migrate/347517f86f16159a601762211bdb0737.png)
3.1 左连接
1)left join 或者left outer join
通过左连接,可以得到左边数据表的所有数据和右边数据表中满足某一条件的数据
![](https://i-blog.csdnimg.cn/blog_migrate/63a3a6a3db96296c836ee86561e6f29b.png)
任务:left join两张数据表,以countryID连接
![](https://i-blog.csdnimg.cn/blog_migrate/61ad5829d46415a31e5626e3c4f39901.png)
2)[left join 或者left outer join(等同于left join)] + [where B.column is null]
![](https://i-blog.csdnimg.cn/blog_migrate/a819d16f06bc28013549de8fde52c7a4.png)
任务:搜出user表中,在country表中没有countryID匹配的人员名字
![](https://i-blog.csdnimg.cn/blog_migrate/945fa9eca530177945d3c2049b14c350.png)
3.2 右连接
逻辑与左连接相同
1)
right join 或者right outer join(等同于right join)
通过右连接,可以得到右边数据表的所有数据和左边数据表中满足某一条件的数据
任务:右连接两张数据表
2)
[left join 或者left outer join(等同于left join)] + [where A.column is null]
![](https://i-blog.csdnimg.cn/blog_migrate/f3ee914a8b46654ba778b682902edcbd.png)
![](https://i-blog.csdnimg.cn/blog_migrate/af93b833f623f26d62d3710c2ef17f94.png)
3.3 全连接
1)
left join union right join
![](https://i-blog.csdnimg.cn/blog_migrate/109424e0bb31dab184487d3237a60c9e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c40659418381cb7351db8e2959171971.png)
2)
(left join + is null) union (right join+is null)
![](https://i-blog.csdnimg.cn/blog_migrate/02eae943cfeba03d728f2f8e470ba626.png)
![](https://i-blog.csdnimg.cn/blog_migrate/0f5d31290a57929852ebaaed1aa7e894.png)
3.4
交叉连接 (cross join)
实际应用中还有这样一种情形,想得到A,B记录的排列组合,即笛卡儿积
![](https://i-blog.csdnimg.cn/blog_migrate/faaadd0f4179839639451dd42d30baa5.png)