首要来个图例:
left join(左联接) 返回包含左表中的所有记录和右表中联结字段相等的记录
right join(右联接) 返回包含右表中的所有记录和左表中联结字段相等的记录
inner join(等值连接) 只返回两个表中联结字段相等的行
举例如下:
--------------------------------------------
表A记录如下:
aID aNum
1 a20050111
2 a20050112
3 a20050113
4 a20050114
5 a20050115
表B记录如下:
bID bName
1 2006032401
2 2006032402
3 2006032403
4 2006032404
8 2006032408
--------------------------------------------
1.left join
sql语句如下:
select * from A
left join B
on A.aID = B.bID
结果如下:
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
5 a20050115 NULL NULL
(所影响的行数为 5 行)
结果说明:
left join是以A表的记录为基本的,A能够看成左表,B能够看成右表,left join是以左表为准的.
换句话说,左表(A)的记录将会所有暗示出来,而右表(B)只会表示符合搜索要求的记录(例子中为: A.aID = B.bID).
B表记录不足的地区均为NULL.
--------------------------------------------
2.right join
sql语句如下:
select * from A
right join B
on A.aID = B.bID
结果如下:
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
NULL NULL 8 2006032408
(所影响的行数为 5 行)
结果说明:
仔细观察一下,就会发掘,和left join的结果刚好相反,这次是以右表(B)为基本的,A表不足的地区用NULL填充.
--------------------------------------------
3.inner join
sql语句如下:
select * from A
innerjoin B
on A.aID = B.bID
结果如下:
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
结果说明:
很显著,这儿只表示出了 A.aID = B.bID的记录.这说明inner join并不以谁为基本,它只表示符合要求的记录.
--------------------------------------------
注:
LEFT JOIN操功效于在任何的 FROM 子句中,组合源自表的记录。使用 LEFT JOIN 运算来创建一个左边外边联接。左边外边联接将包括了从第1个(左边)起始的两个表中的所有记录,即使在第二个(右边)表中并无相符值的记录。
连接要求可在FROM或WHERE子句中指定,意见在FROM子句中指定连接要求。WHERE和HAVING子句亦能够包括搜索要求,以进一步筛选连接要求所选的行。
连接可分为以下几类:
内连接。(典型的连接运算,运用像 = 或 <> 之类的比较运算符)。包含相等连接和自然连接。
内连接运用比较运算符按照每一个表共有的列的值匹配两个表中的行。例如,检索 students 和 courses 表中学生标识号相同的所有行。
外连接。外连接能够是左向外连接、右向外连接或完整外边连接。
在FROM子句中指定外连接时,能够由下列几组关键字中的一组指定:
LEFT JOIN 或 LEFT OUTER JOIN。
左向外连接的结果集包含LEFT OUTER子句中指定的左表的所有行,而不仅是连接列所匹配的行。倘若左表的某行在右表中无匹配行,则在关联联的结果集行中右表的所有选取列表列均为空值。
RIGHT JOIN 或 RIGHT OUTER JOIN。
右向外连接是左向外连接的反向连接。将返回右表的所有行。倘若右表的某行在左表中无匹配行,则将为左表返回空值。
FULL JOIN 或 FULL OUTER JOIN。
完整外边连接返回左表和右表中的所有行。当某行在另一个表中无匹配行时,则另一个表的选取列表列包括空值。倘若表之间有匹配行,则全部结果集行包括基表的数据值。
交叉连接。交叉连接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉连接亦叫作作笛卡尔积。
例如,下面的内连接检索与某个出版商居住在相同州和城市的作者:
USE pubs
SELECT a.au_fname, a.au_lname, p.pub_name
FROM authors AS a INNER JOIN publishers AS p
ON a.city = p.city
AND a.state = p.state
ORDER BY a.au_lname ASC, a.au_fname ASC
FROM 子句中的表或视图可经过内连接或完整外边连接按任意次序指定;然则,用左或右向外连接指定表或视图时,表或视图的次序很重要。相关运用左或右向外连接摆列表的更加多信息,请参见运用外连接。
例子:
a表 id name b表 id job parent_id
1 张3 1 23 1
2 李四 2 34 2
3 王武 3 34 4
a.id同parent_id 存在关系
内连接
select a.*,b.* from a inner join b on a.id=b.parent_id
结果是
1 张3 1 23 1
2 李四 2 34 2
左连接
select a.*,b.* from a left join b on a.id=b.parent_id
结果是
1 张3 1 23 1
2 李四 2 34 2
3 王武 null
右连接
select a.*,b.* from a right join b on a.id=b.parent_id
结果是
1 张3 1 23 1
2 李四 2 34 2
null 3 34 4
完全连接
select a.*,b.* from a full join b on a.id=b.parent_id
结果是
1 张3 1 23 1
2 李四 2 34 2
null 3 34 4
3 王武 null
|