17、左连接语法及应用
一、左连接的动态演示
现在有两个表,一个goods表(不包含cat_name),一个是category表(只有cait_id和cat_name两个字段)
我们在goods表中只选择三个字段,然后与category表进行对比,如下图:
左边goods表中有32个物品,右边category有14个cat_name(少了11)。那么左边goods表与右边category表从上到下两两交叉匹配,共有32*14次匹配。
其中,左边goods表不动,右边category表从上往下进行匹配,在goods表中第一行KD876挨个匹配时,与cat_id=15不匹配,cat_id=14不匹配,一直到cat_id=4时匹配。
然后,第二行诺基亚N85同样匹配,与category表中的cat_id=8进行匹配,专门留下这一行的数据。
按照这个思路,goods表不动,category表不断地从上往下循环滑动,与左边的每一行进行匹配并找到相匹配的行。
二、左连接的语法表示
假设A表在左,不动。B表在A表的右边滑动。
A表与B表通过一个关系来筛选B表的行。
A left join B on 条件 条件为真,则B表对应的行取出
其中,左半部分
也就是说,可以把左半部分看成一个表C,然后对C表可以再做查询。
问:C表可以查询的列有哪些?
答:AB的列都可以查(因为是两张表组成的新表),自然where,group,having,order by,limit照常使用。
三、报价表的第三个改进版(用左连接来查询)
用左连接,新手的话建议分成两步来写:
- 第一步:先根据“A left join B on 条件”得到已经关联好的表C(即把下列语句得到的结果集当做表C看)
- 第二步:从表C中查询,得到最终想要的结果
最终,也就是如下语句:
带入PHP中,利用PHP得到报价单:
可见,结果与前两篇文章的结果是相同的。这次的实现效率,提升了许多。因为在左连接的过程中,用上了索引(在每一次匹配中,直接利用索引找到该行,有点类似于哈希表的效率?暂时不清楚)。
比如,我们想要在得到表C以后,我们直接用where筛选出第4个栏目的商品。
其中,其中左连接以后,再从得到的结果集中查询cat_id等于4的商品。