Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6152344
  • 博文数量: 498
  • 博客积分: 12019
  • 博客等级: 上将
  • 技术积分: 6740
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-01 16:46
文章分类

全部博文(498)

文章存档

2020年(55)

2019年(4)

2018年(10)

2017年(5)

2016年(2)

2015年(4)

2014年(4)

2013年(16)

2012年(47)

2011年(65)

2010年(46)

2009年(34)

2008年(52)

2007年(52)

2006年(80)

2005年(22)

分类: Mysql/postgreSQL

2020-11-13 14:28:34

多表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)

阅读(47) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~