连接分类:
>>按连接形式来分可以分为内连接和外连接
1.内连接只会在符合条件(且两表中作为连接条件的字段均不为Null)的时候将元组组合
2.外连接则会在另一个表中找不到符合条件的元组时将连接上一半全为Null的n个字段.
>>按连接条件来分可以分为等值连接和非等值连接
在逻辑上区分时可以认为:
1.等值连接在连接的时候会将值相等的一列融合为一列
2.非等等值连接则在连接的时候仅连接不融合.
>>按连接的表与表的关系来分可以分为不同表连接和同表的自身连接
注意:
基于外连接的逻辑意义,外连接才会被分为左外,右外,和全外连接.内连接只有一种,没有左右全.
所以当看见left,right,full关键字时,一定是外连接(系统地作笔记时为此问题恍惚了好一会儿).
另外:
还有一种连接叫做交叉连接(Cross Join),按其定义来看是两表直接进行笛卡尔积运算,即得到两表元组的所有组合.
所以从定义上来看它相当于无条件的全外连接.
等值与非等值连接
Select A.a,列名...
From A Join B
On A.a=B.a
上面是等值连接,非等值连接的区别只是条件谓词不为"=",如>,只要对方表中在此字段上大的,全部组合.
如A表有一个字段,B表中有四个字段,且字段a都大于A中的字段A,那么B的四个元组都符合A的元组的连接条件:将有四个组合.
如果在select中的列在两个表中都有相同的名字,那么需要带上"表名."以示区分
外连接
内连接时如果表A的一个元组在遍历表B的所有元组后找不到符合条件的元组相连时,结果中将看不到A的此元组部分.
外连接可以保证在没有符合条件的情况下依旧有输出内容,只不过原应该连接的另一半保持空值
那么这样外连接又分成了三类:
左外连接:只保证左边表的元组全部列出来,右边无符合元组连接时为NULL
右外连接:只保证右边表的元组全部列出来,左边无符合元组连接时为NULL
全外连接:同时保证左右表的元组都全部列出来,这样原来的两个表任何一个元组都至少出现在结果中的一个元组中,那怕另一半为NULL
Select A.a,列名... Select A.a,列名... Select A.a,列名...
From A Left join B From A Right join B From A Full join B
On A.a=B.b On A.a=B.b On A.a=B.b
Left,Right,Full可以写成Left out,Right out,Full out
自身连接
Select X.列名,X.列名,Y.列名...
From S as X,S as Y
Where X.age>Y.age
如果需要一个表连接自己(即两个同样的表相连)那么这种连接叫自身连接
此例将表S分别起两个别名:X,Y,然后将X,Y相连
表的别名
如上面自身连接所使用别名一样,连接时可使用别名以方便表的引用
另外嵌套查询中一个Select查询也可以作为一个临时表设置其别名.
连接条件_Where,On,Using
Where
92年的Sql标准中在连接时可以不写join关键字,而将要连接的表全部写在From子句中,连接条件与查询过滤条件全部放在Where子句中
On
99年的新标准在On子句中写连接条件.
Using
如果两个表在等值连接时,并且确定要求等值的两表的字段名相同的话,可以省略On子句直接写为Using(字段名).
表示两个表以此字段作等值连接.