多表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)
阅读(2511) | 评论(0) | 转发(0) |