16、两表全连接查询报价单

2018-12-05  本文已影响0人  小碧小琳

一、背景知识:

1.1、笛卡尔积

1.2、表与集合的关系

一张表就是一个集合。
每一行就是一个元素。

可以理解为,拥有相同字段特性的元素都放到同一个集合中。

比如,下图中,表test10有3个元素,表test11有2个元素:

疑问:集合不能重复,但是有可能两行数据完全一样?
答:不可能,MySQL中每一行还有一个row_id的。

1.3、表与表之间的操作

问:既然说表是一个集合,那么笛卡尔积的操作在表与表之间如何体现?
答:直接用“,”(逗号)隔开表名,查询即可。如下图:

可见,上图中查询得到的结果,就是两个表中不同元素之间的组合,共有2*3个结果。

两表做全相乘
从行的角度看:就是两表每一行,两两组合。
从列的角度看:相乘以后结果集中的列,是两表列名的相加。

1.4、有重复列名时的情况

mingoods表来自于goods表的前三行

作全相乘时,如果觉得列比较多,也可以有针对的取出几列。比如只取几列,但是如果有重复的列,会出错:

如果在多表联查时,某一列名,在2张或2张以上表都有,则需要在列名前,指定表名。即“表名.列名”。
如上图中,需要用mingoods.cat_id,category.cat_id来确定列名属于哪里。如下图:

前三列来自于mingoods表,后两列来自于category表。对于每一行来说,结果来自于笛卡尔积。
比如第一行,KD876属于第4个cat_id,手机类型是第一个cat_id的名称。但是这一行,感觉没有太大的意义呀~
图中最后一行中,感觉有意义,KD876正好也属于cat_id=4的3G手机。

说白了,我们希望mingoods.cat_id = category.cat_id时,是我们所认为有意义的。如下:

图1

我们找到了每个商品对应的cat_id以及cat_name。

二、两表全相乘做报价单

根据图1中的查询语句,我们可以舍弃上一篇中的1+N模式了。只需要两表全乘以后,再在where后面加一个判断语句即可。(跟图1的查询语句一样)

在上一篇中的php语言中,用sql的全相乘,再用where做一个筛选,即可得到想要的结果。

至此,往前进了一步,只用了一条sql语句就查出来了。
但是,两表全相乘的效率是很低的,在内存中会生成一个非常大的数据。比如A表一万行,B表一万行,做一个全相乘,就崩了。

由此,引出了左连接。

上一篇下一篇

猜你喜欢

热点阅读