1、内联接(典型的联接运算,使用像 = 或 <> 之类的比较运算符)。包括相等联接和自然联接。
内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如,检索 students和courses表中学生标识号相同的所有行。 2、外联接。外联接可以是左向外联接、右向外联接或完整外部联接。 在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定: 1)LEFT JOIN或LEFT OUTER JOIN 左向外联接的结果集包括 LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。 2)RIGHT JOIN 或 RIGHT OUTER JOIN 右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。 3)FULL JOIN 或 FULL OUTER JOIN完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。 3、交叉联接 交叉联接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。 FROM 子句中的表或视图可通过内联接或完整外部联接按任意顺序指定;但是,用左或右向外联接指定表或视图时,表或视图的顺序很重要。有关使用左或右向外联接排列表的更多信息,请参见使用外联接。
下面是例子分析
表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 JOING 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 INNER JOIN b ON a.aID =b.bID
等同于以下SQL句:
SELECT * FROM a,b WHERE 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并不以谁为基础,它只显示符合条件的记录.
4.全连接
sql语句如下:
SELECT * FROM a full join 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 a20050115 NULL NULL
结果说明:
完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
5.交叉连接(取笛卡儿积)
概念:没有where条件的交叉连接将产生连接表所涉及的笛卡尔积。即TableA的行数*TableB的行数的结果集。(TableA 5行*TableB 5行=25行)sql语句:
SELECT * FROM a cross join JOIN b;
结果如下:
aID aNum bID bName 1 a20050111 1 20060324012 a20050112 1 20060324013 a20050113 1 20060324014 a20050114 1 20060324015 a20050115 1 20060324011 a20050111 2 20060324022 a20050112 2 20060324023 a20050113 2 20060324024 a20050114 2 20060324025 a20050115 2 20060324021 a20050111 3 2006032403 2 a20050112 3 2006032403 3 a20050113 3 2006032403 4 a20050114 3 2006032403 5 a20050115 3 2006032403 1 a20050111 4 20060324042 a20050112 4 20060324043 a20050113 4 20060324044 a20050114 4 20060324045 a20050115 4 20060324041 a20050111 8 20060324082 a20050112 8 20060324083 a20050113 8 20060324084 a20050114 8 20060324085 a20050115 8 2006032408
以上写法等效于:
select * from a,b
6.自然连接(转自:)
两张表:
自然连接
通过MySql自己的判断完成连接过程,不需要指定连接条件。MySql会使用表内的,相同的字段,作为连接条件。
自然连接分为内外之分。
内:natural join
外:左外natural left join、右外natural right join
注:select * from one natural join two;
select * from one inner join two using(public_field);
两者是等效的。
同理,下面也是等效的:
natural left join & left join
natural right join & right join