在MySQL中INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN 有什么区别?
我们有两张表:
TableA:
id firstName lastName
.......................................
1 arun prasanth
2 ann antony
3 sruthy abc
6 new abc
TableB:
id2 age Place
................
1 24 kerala
2 24 usa
3 25 ekm
5 24 chennai
INNER JOIN(内连接)
这是最简单,最常见,也是最容易理解的Join,两张表使用内连接查询时,得到的结果是两张表中完全匹配的行集。
对于上述两张表,我们有:
SELECT TableA.firstName,TableA.lastName,TableB.age,TableB.Place
FROM TableA
INNER JOIN TableB
ON TableA.id = TableB.id2;
得到的结果即为:
firstName lastName age Place
..............................................
arun prasanth 24 kerala
ann antony 24 usa
sruthy abc 25 ekm
得到的结果有4个字段,firstName 、 lastName 、 age 、 Place,就是我们上面SQL语句SELECT的4个字段,FROM和INNER JOIN后面的两个表名就是要内连接的两张表,ON后面就是在其中寻找共同点的字段。
LEFT JOIN(左连接)
左连接查询会返回左表中所有行,无论这些行是不是有任何一行在右表中匹配。
SELECT TableA.firstName,TableA.lastName,TableB.age,TableB.Place
FROM TableA
LEFT JOIN TableB
ON TableA.id = TableB.id2;
查询结果是:
firstName lastName age Place
.............................................................
arun prasanth 24 kerala
ann antony 24 usa
sruthy abc 25 ekm
new abc NULL NULL
我们可以看到,TableA中所有行都过来了,即使firstName为new,lastName为abc的那一行id为6,在TableB中找不到id为6的行,仍然在结果集中存在。值得注意的是,因为其id为6,在TableB中找不到对应的id,因此其没有age和Place字段的内容。
RIGHT JOIN(右连接)
右连接查询会返回右表中所有行,无论这些行是不是有任何一行在左表中匹配。
SELECT TableA.firstName,TableA.lastName,TableB.age,TableB.Place
FROM TableA
RIGHT JOIN TableB
ON TableA.id = TableB.id2;
结果集:
firstName lastName age Place
...............................................................
arun prasanth 24 kerala
ann antony 24 usa
sruthy abc 25 ekm
NULL NULL 24 chennai
FULL JOIN(全连接)
SQL语句如下:
SELECT TableA.firstName,TableA.lastName,TableB.age,TableB.Place
FROM TableA
FULL JOIN TableB
ON TableA.id = TableB.id2;
结果集为:
firstName lastName age Place
...........................................................
arun prasanth 24 kerala
ann antony 24 usa
sruthy abc 25 ekm
new abc NULL NULL
NULL NULL 24 chennai
查询结果是左连接和右连接的并集。