测试数据脚本
CREATE TABLE Atable ( S# INT, Sname nvarchar(32), Sage INT, Sfrom nvarchar(8) ) insert into Atable select 1,N‘李四‘,18,N‘A‘ union all select 2,N‘tom‘,19, N‘A‘ union all select 3,N‘刘一‘,17,N‘A‘ union all select 4,N‘jack‘,18,N‘A‘ CREATE TABLE Btable ( S# INT, Sname nvarchar(32), Sage INT, Sfrom nvarchar(8) ) insert into Btable select 1,N‘刘一‘,18,N‘B‘ union all select 2,N‘钱二‘,19,N‘B‘ union all select 3,N‘张三‘,17,N‘B‘ union all select 4,N‘李四‘,18,N‘B‘
数据表
Join(麻蛋 废话不多说 有图有真相)
1.cross join
交叉连接不需要任何连接条件。两个表的的数据直接进行笛卡尔积运算。如果一个表有m行,而另一个表有n行,将得到m*n的结果集。
1 |
|
2.inner join == join
内连接的功能是,把两个表相关联的记录列出来,必须是相关联的记录。
对两个输入表进行笛卡尔积,然后根据指定的谓词对结果行进行过滤。
怎么理解内联接:
理解内联接最容易的方法是认为A表中每一行同C表中的所有行进行比较,如果A表中的id和C表中的id相等,则匹配成功。
另外一种更正式的方法是在关系代数的基础上来考虑内联接,联接运算首先对两个表求笛卡尔积(4行A记录*5行C记录=20行记录),然后根据条件C.id=A.id对行进行过滤,最终返回16行。
1 |
|
3.left outer join == left join
产生表B的完全集,而A表中匹配的则有值,没有匹配的则以null值取代。
1 |
|
4.right outer join == right jion
产生表A的完全集,而B表中匹配的则有值,没有匹配的则以null值取代。
1 |
|
5.full outer join == full join
产生A和B的并集。但是需要注意的是,对于没有匹配的记录,则会以null做为值。
1 |
|
6.union与union all
区别就是联合查询的时候union会去重,union all不会去重
1 |
|
1 2 3 4 5 6 7 |
|
1 2 |
|
自交叉联接
对同一个表进行联接,就是自联接。交叉联接、内联接、外联接都支持自联接。
SELECT A1.a,A2.a FROM A AS A1 CROSS JOIN A AS A2
A表有4行,查询会生成一个包含4*4=16行的数据的结果集。
在自联接中,必须为表起别名。如果不为表指定别名,联接结果中的列名就会有歧义。
比如在本例中,别名为A1,A2。
小结
原文地址:https://www.cnblogs.com/baili-luoyun/p/11132004.html