内连接(INNER JOIN):分为三种:等值连接、自然连接、不等连接
外连接(OUTER JOIN):分为三种:左外连接(LEFT JOIN)、右外连接(RIGHT JOIN)、全外连接(FULL JOIN)
交叉连接(CROSS JOIN):没有where 子句,它返回连接表中所有数据行的笛卡尔积
SQL中的UNION与UNION ALL的区别:前者会去重,后者保留相同的;
交叉连接 CROSS JOIN: 如果不带WHERE条件子句,它将会返回被连接的两个表的笛卡尔积,返回结果的行数等于两个表行数的乘积::笛卡尔积CROSS JOIN:select * from A CROSS JOIN B; (等价于select * from A,B;) ; --------- 一般不建议使用该方法,因为如果有WHERE子句的话,往往会先生成两个表行数乘积的行的数据表然后才根据where条件中选择;;不适合大的表;
内连接:INNER JOIN
如果仅仅使用 SELECT * FROM A INNER JOIN B 没有指定连接条件的话,和交叉连接的结果一样;
如果指定条件,如下:
--等值连接(不去重):selecr * from A INNER JOIN B on A.col=B.col;
--不等连接:select * from A INNER JOIN B on A.col>B.col;
--自然连接(去重)(公共属性只保留一个):(通过相同名字的属性连接的结果就是自然连接)
外连接 OUTER JOIN:
首先内连接和外连接的不同之处: 内连接如果没有指定连接条件的话,和笛卡尔积的交叉连接结果一样,但
是不同于笛卡尔积的地方是,没有笛卡尔积那么复杂地要先生成行数乘积的数据表,内连接的效率要高于笛卡
尔积的交叉连接。
·指定条件的内连接,仅仅返回符合连接条件的条目。
·外连接则不同,返回的结果不仅包含符合连接条件的行,而且包括左表(左外连接时), 右表 (右连接时)或者两边连接(全外连接时)的所有数据行。
--左外连接LEFT JOIN:除了显示符合条件的数据行外,还显示左边数据表不符合条件的数据行;;要是右边没有对应的行,就显示NULL;(select A LEFT JOIN B on A.col=B.col;)
--右外连接RIGHT JOIN:除了显示符合条件的数据行外,还显示右边数据表不符合条件的数据行;;要是左边没有对应的行,就显示NULL;(select A RIGHT JOIN B on A.col=B.col;)
--全外连接FULL OUTER JOIN:除了显示符合条件的数据行外,还显示左边和右边数据表不符合条件的数据行;;要是没有对应的行,就显示NULL;(select A FULL OUT JOIN B on A.col=B.col;)
如果把舍弃的元组也保存在结果关系中,而在其他属性上空值,那么这种连接就叫外连接。如果只把左边关系R要舍弃的元组保留就叫左外连接,如果只把右边关系S中要舍弃的元组保留右外连接。
例子:
表A |
表B |
selecr * from A natural join B on A.Id=B.Id;自然连接的结果:
Id |
a |
b |
c |
d |
2 |
5 |
4 |
2 |
3 |
selecr * from A left join B on A.Id=B.Id;左连接的结果:
Id |
a |
b |
c |
d |
1 |
2 |
3 |
Null |
Null |
2 |
4 |
4 |
2 |
3 |
selecr * from A full out join B on A.Id=B.Id;全外连接的结果:
Id |
a |
b |
c |
d |
1 |
2 |
3 |
Null |
Null |
2 |
5 |
4 |
2 |
3 |
3 |
Null |
Null |
9 |
4 |
selecr * from A cross join B;交叉连接的结果:
IdA |
IdB |
a |
b |
c |
d |
1 |
2 |
2 |
3 |
2 |
3 |
1 |
3 |
2 |
3 |
9 |
4 |
2 |
2 |
5 |
4 |
2 |
3 |
2 |
3 |
5 |
4 |
9 |
4 |