多表join查询的几种方式,内查询  左  右 等几种 不再描述,可参考网络文章。
一般在使用时候内查询最多 。本文说的就是这个。
join是做个一个笛卡尔积运算,结果是得到一个字段和记录数都变大的表,也可视为扩展了原表的字段列数 和记录数。如下

表T1
     C1    C2
a   C1a  C2a
b   C1b  C2b

表T2
    C1   C2
c   C1c  C2c
d   C1d C2d

没有过滤条件下:
select * from T1 join T2  
完全笛卡尔积
a  c
a  d
b  c
b  d
很明显 新表完全组合,也可看为表T1被扩展了 2列。若基于T1看 其记录条数增多,冗余了。此类情况 再做统计,比如针对T1分类统计 等要注意,否则会错误。

当然有些时候可以使用on using等过滤。 如
select * from T1 join T2   on T1.C1  =T2.C1. 也可确定T1 记录稳定,没有做记录数扩展。
但是 有些情况,若连接join的关联表字段C1 是重复的,也就是不唯一。此时即使用了on 也会扩大记录数导致冗余。
所以若要原表(T1)不扩大记录数,必须确保join的关联表(T2)对应字段是唯一的。
举个列子
颜色表 Color
  id    color
1       green
 2        red  

水果表 Fruits
id       color_id
苹果     红色
苹果2   绿色
黄瓜    绿色

select * from Fruits  join Color on Fruits.color_id = Color.id
这个就不会扩大记录数,因为Color  2个记录对应的id没有重复的。

反之若
select * from Color    join Fruits on Fruits.color_id = Color.id
就会扩大记录数,因为Fruits 的id字段有2个列是苹果  重复。所以会扩大


上述描述,可理解什么时候使用join最好,当然有些时候可以结合 distinct 等去重,若不行也可采用in查询(虽然慢些)
select * from Color   in (select distinct(id)  from Fruits)

11-18 05:57
查看更多