美文网首页
16、两表全连接查询报价单

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

作者: 小碧小琳 | 来源:发表于2018-12-05 22:12 被阅读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表一万行,做一个全相乘,就崩了。

    由此,引出了左连接。

    相关文章

      网友评论

          本文标题:16、两表全连接查询报价单

          本文链接:https://www.haomeiwen.com/subject/kddwcqtx.html