美文网首页MySQL
由笛卡儿积问题分析数据库表的连接

由笛卡儿积问题分析数据库表的连接

作者: 风之舟 | 来源:发表于2019-05-14 21:39 被阅读15次

    我们在上课时,老师讲过关于两张表及多张表的连接问题,最常用的就是where a.id=b.id ...等等,但是当我们在公司时,我们发现,我们并不常用where进行表与表之间的连接,这就涉及到笛卡尔积的问题,那何为笛卡儿积呢?

    现在我们有两个集合A和B:

    A={1,2}         B={3,4,5}

    集合AxB和BxA的结果集可以分别表示为以下两种形式:

    AxB={(1,3),(1,4),(1,5),(2,3),(2,4),(2,5)}

    BxA={(3,1),(3,2),(4,1),(4,2),(5,1),(5,2)}

    以上A*B和B*A的结果就可以叫做两个集合相乘的“笛卡尔积”。

    这样我们可以看出:

    两个集合相乘,并不满足交换律,即AxB不等于BxA;

    两个集合相乘,包含了集合A中元素和集合B中元素相结合的所有的可能性。即两个集合相乘得到的新的集合的元素的个数是A集合的元素个数*B集合的元素个数;

    现在我们有两张表vip_member和vip_point_record:

    vip_member:

    vip_member

    vip_point_record:

    vip_point_member

    我们执行以下sql语句,进行纯粹的表连接:

    select * from vip_member join vip_point_record

    没有完全显示

    select * from vip_point_record join vip_member

    同上

    匹配完成后,我们得到了一张有m*n条的临时表,看到这里,我们会考虑表连接每次都会先形成一张笛卡尔积表吗?如果两张表的数据量比较大的话,那样就会占用很大的内存空间这显然是不合理的。所以,我们在进行连接查询时一般都会使用join...on...的语法,on语句的执行是在join语句之前的,也就是在两张表数据行之间进行匹配的时候,会先判断数据行是否符合on语句后面的条件,再决定是否join

    因此关于sql的一个优化方案是,当两张数据表比较大,又需要连接查询时,应该使用from table1 join table2 on xxxxx的语法,避免使用from table1,table2 WHERE xxx的语法,因为后者会在内存中先生成一张数据量比较大的笛卡尔积表,增加内存的开销。

    这里我们讲一下join...on的用法:

    join连接组合两个表中的字段记录,包括三种:

    inner join(等值连接):只返回两个表中联结字段相等的行

    left join(左连接):返回包括左表中的所有记录和右表中联结字段相等的记录

    right join(右连接):返回包括右表中的所有记录和左表中联结字段相等的记录

    以inner join为例:

    inner join连接两个数据报表的用法:

    select * from 表1 inner join 表2 on 表1.字段号=表2.字段号

    inner join连接三个数据表的用法:

    select *  from (表1 inner join 表2 on 表1.字段号=表2.字段号) inner join 表3 on 表1.字段号=表3.字段号

    inner join连接四个数据表的用法:

    select *  from ((表1 inner join 表2 on 表1.字段号=表2.字段号) inner join 表3 on 表1.字段号=表3.字段号) inner join 表4 on 表1.字段号=表4.字段号

    剩下的大家举一反三即可。

    也可以在join语句中连接多个on子句,请使用如下语法:

    select 字段 from table1 inner join table2 

    on table1.字段号1 compopr table2.字段号2 and

    on table1.字段号2 compopr table2.字段号2 or

    on table1.字段号3 compopr table2.字段号3;

    也可以使用嵌套join语句(注意括号):

    select 字段 from table1 inner join (tabel2 inner join [(] table x [inner join ...)])

    on table3.字段号3 运算关系符 table x.字段号x)]

    on table2.字段号2 运算关系符 table3.字段号3)

    on table1.字段号1 运算关系符 table2.字段号2;

    left join 或right join可以嵌套在inner join之中,但是inner join不能嵌套于left join或right join之中。

    相关文章

      网友评论

        本文标题:由笛卡儿积问题分析数据库表的连接

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