转载于http://blog.csdn.net/pacosonswjtu/article/details/51396622
Attention)left和right是外连接,Inner是内连接。(left join=left outer join,right join=right outer join)
【0】README
0.1)本文旨在review MySQL的自然联结+外部联结(左外连接,右外连接)+内部联结 的相关知识;
【1】自然联结
1)自然联结定义:无论何时对表进行联结,应该至少有一个列出现不止一个表中(被联结的列)。标准的联结返回所有数据,甚至相同的列多次出现。自然联结排除多次出现,使每个列只返回一次;(干货——自然联结的作用就是排除多次出现,使每个列只返回一次)
看个荔枝)
自然连接怎么连接?
R表 S表 A B C D B E 1 a 3 2 c 7 2 b 6 3 d 5 3 c 7 1 a 3 <span style="font-family: SimSun; background-color: rgb(255, 255, 255);"> </span>
step1)自然连接是第一步R×S结果是(就是用R表中的每一项乘以S表中的每一项):A B C D B E 1 a 3 2 c 7 1 a 3 3 d 5 1 a 3 1 a 3 2 b 6 2 c 7 2 b 6 3 d 5 2 b 6 1 a 3 3 c 7 2 c 7 3 c 7 3 d 5 3 c 7 1 a 3
step2)选择R.B=S.B的记录:
R.A R.B R.C S.D S.B S.E 1 a 3 1 a 3 3 c 7 2 c 7
step3)然后去掉相同且值也相同的B属性,最后R∞S的值为:
A B C D E 1 a 3 1 3 3 c 7 2 7
【supplement】测试前的准备
1)假设有A,B两个表:
// 表A记录如下 aID aNum 1 a2010 2 a2011 3 a2012 4 a2012 5 a2013 // 表B记录如下: bID bName 1 b2010 2 b2011 3 b2012 4 b2013 8 b2014
【2】left join (左外联结)sql语句如下:
select*from A left join B on A.aID = B.bID
对以上结果的分析(Analysis)
A1)left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.A2)换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID). B表记录不足的地方均为NULL;
【3】right join (右外联结)
【4】内联结sql语句如下: select*from A innerjoin B on A.aID = B.bID
对以上结果的分析(Analysis):
A1)很明显,这里只显示出了 A.aID = B.bID的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录.A2)LEFT JOIN操作用于在任何的 FROM 子句中,组合来源表的记录。使用 LEFTJOIN 运算来创建一个左边外部联接。左边外部联接将包含了从第一个(左边)开始的两个表中的全部记录,即使在第二个(右边)表中并没有相符值的记录。A3)语法:FROM table1 LEFT JOIN table2 ON table1.field1 compopr table2.field2
A3.1)说明:table1, table2参数用于指定要将记录组合的表的名称。A3.2)field1, field2参数指定被联接的字段的名称。且这些字段必须有相同的数据类型及包含相同类型的数据,但它们不需要有相同的名称。A3.3)compopr参数指定关系比较运算符:"=", "<", ">", "<=", ">=" 或 "<>"。A3.4)如果在INNER JOIN操作中要联接包含Memo 数据类型或 OLE Object 数据类型数据的字段,将会发生错误。
Attention)left和right是外连接,Inner是内连接。(left join=left outer join,right join=right outer join)