16、两表全连接查询报价单
一、背景知识:
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表一万行,做一个全相乘,就崩了。
由此,引出了左连接。