MySQL内外联结
一、内联结(inner join)
mysql内联结使用inner join将多个数据表t1,t2隔开,结果是t1里的每一个数据行将与t2里的每一个数据行组合。
逗号连接符、cross join和join联结类型类似于inner join。
inner join、cross join和join(注意,不包括逗号操作符) 还支持另外几种用来表明如何对数据表里的数据列进行匹配的语法变体:
1、用一条on子句代替where子句。
2、使用using()子句,类似于on,但要求被联结的数据列必须是同名的。
二、左联结和右联结(外联结)
内联结只显示在两个数据表里都能找到匹配的数据行。
外联结除了显示同样的匹配结果,还可以把其中一个数据表在另一个数据表里没有匹配的数据行也显示出来。
外联结分左联结和右联结两种。
左联结意思是把左数据表在右数据表里没有匹配的数据行也显示出来。
右联结意思是把右数据表在左数据表里没有匹配的数据行也显示出来。
左联结工作原理:
前提:必须给出用来匹配两个数据表里的数据行的数据列(这里t1.i1 = t2.i2)。
如果左数据表的某个数据行与来自右数据表的某个数据行匹配时,那么这两个数据行的内容就会被选取为一个输出数据行。如果来自
左数据表的某个数据行在右数据表里找不到匹配,它就会被选取作为一个输出数据行,此时与它联结的是一个来自右数据表里的"假"数据行,这个“假”
数据行的所有数据列都包含null值。
换一句话说,在left join操作里,来自左数据表的每一个数据行在结果集里都有一个对应的数据行,不管它在右数据表里有没有匹配。
在结果集里,在右数据表里没有匹配的结果数据行有这样的特征:来自右数据表的所有数据列都是null值。
这个特征可以让你知道右数据表里缺少了哪些数据行。
左联结left join很有用,尤其是在你只想找出在右数据表里没有匹配的左数据表的行时,增加一条where语句,让它把右数据表的数据列全部是null值(也就是那些在一个数据表里有匹配,但在另一个数据表里没有匹配)的数据行筛选出来。
一般来说,你把右数据表里值为null的数据列显示出来没有什么意义,可以在select语句里输出列清单里剔除: