我们在上课时,老师讲过关于两张表及多张表的连接问题,最常用的就是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_membervip_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之中。
网友评论