MySQL学习之自连接

自连接的用法

什么是自连接

自连接,故名思意就是一张表与自己连接。文字语言可能很苍白,换成SQL语言会更清晰一些。
比如说有一张水果表fruit,如下图:

+----+------+------+
| Id | Name | Price|
+----+------+------|
| 1  |apple | 8.00 |
| 2  |banna | 4.00 |
| 3  |orange| 3.50 |
+----+------+------|

friut表自连接代码如下:

SELECT 
f1.*, f2.*
FROM friut f1, friut f2

代码也是很简单,需要注意的是自连接的时候,需要取别名。自连接的结果如下:

Id	Name	Price	Id(1)	  Name(1)  Price(1)
1	apple	  8	     1	    apple	  8
2	banna	  4	     1	    apple	  8
3	orange	 3.5	   1	    apple	  8
1	apple	  8	     2	    banna	  4
2	banna	  4	     2	    banna	  4
3	orange	 3.5	   2	    banna	  4
1	apple	  8	     3	    orange	 3.5
2	banna	  4	     3	    orange	 3.5
3	orange	 3.5   	3	    orange	 3.5

可以看出,查询出来的结果就是f1 x f2的结果,即笛卡尔积。在这张表的数据中,就是用f1的3条数据分别与f2的3条数据相乘,得出3 x 3即9条数据。

自连接的应用

自链接可重排列排列组合
应用场景:假设一张存放了商品名称及价格的表,表里有“苹果、香蕉、橘子”三条记录。在生成用于查询销售额的报表时,需要获取这些商品的组合。

(1)可重排列

通过交叉连接生成笛卡尔积,可以得到有序对,上面提到的简单的自连接们就可以实现。

SELECT 
f1.Name fname1, f2.Name fname2
FROM friut f1, friut f2

(2)排列

可去掉由相同元素构成的对,SQL如下:

SELECT
f1.Name fname1, f2.Name fname2
FROM friut f1, friut f2
WHERE f1.Name <> f2.Name

查询结果:

fname1	fname2
banna 	apple
orange	apple
apple 	banna
orange	banna
apple 	orange
banna 	orange

(3)组合

上面的排列结果还是有序的,比如说banner -> apple 和apple -> banna是两种结果,组合就是不存在前后顺序,可以对对调换了元素顺序的对进行去重,SQL如下:

SELECT 
f1.Name fname1, f2.Name fname2
FROM friut f1, friut f2
WHERE f1.Name > f2.Name

查询结果:

fname1	fname2
banna	 apple
orange	apple
apple	banna

如果想要3个以上元素的组合,可以简单拓展一下:

SELECT 
f1.Name fname1, f2.Name fname2,f3.Name fname3
FROM friut f1, friut f2, friut f3
WHERE f1.Name > f2.Name
AND f2.Name > f3.Name

查询结果:

fname1	fname2	fname3
banna	apple	orange

自连接应用

题目:现有如下的水果表,求价格相同的水果
Id	Name	Price
1	apple	8
2	banna	4
3	orange	3.5
4	watermelon	4
5	lemon	8

SQL如下:

SELECT
f1.Name fname1, f2.Name fname2
FROM friut f1,friut f2
WHERE f1.Price = f2.Price
AND f1.Name > f2.Name

查询结果:

fname1	fname2
lemon	apple
watermelon	banna

END

以上就是今天的SQL学习,主要是关于SQL的自连接,即一张表与自身表的连接,自连接可以实现可重排列排列组合,在日常开发中还是有很多应用场景。有不对的地方,望指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值