测试数据脚本
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
|
SELECT * FROM Atable as A cross join Btable as B order by A.S# |
2.inner join == join
内连接的功能是,把两个表相关联的记录列出来,必须是相关联的记录。
对两个输入表进行笛卡尔积,然后根据指定的谓词对结果行进行过滤。
怎么理解内联接:
理解内联接最容易的方法是认为A表中每一行同C表中的所有行进行比较,如果A表中的id和C表中的id相等,则匹配成功。
另外一种更正式的方法是在关系代数的基础上来考虑内联接,联接运算首先对两个表求笛卡尔积(4行A记录*5行C记录=20行记录),然后根据条件C.id=A.id对行进行过滤,最终返回16行。
1
|
SELECT * FROM Atable as A INNER JOIN Btable as B ON A.Sname = B.Sname |
3.left outer join == left join
产生表B的完全集,而A表中匹配的则有值,没有匹配的则以null值取代。
1
|
SELECT * FROM Atable as A left outer join Btable as B ON A.Sname = B.Sname |
4.right outer join == right jion
产生表A的完全集,而B表中匹配的则有值,没有匹配的则以null值取代。
1
|
SELECT * FROM Atable as A right outer join Btable as B ON A.Sname = B.Sname |
5.full outer join == full join
产生A和B的并集。但是需要注意的是,对于没有匹配的记录,则会以null做为值。
1
|
SELECT * FROM Atable as A full join Btable as B ON A.Sname = B.Sname |
6.union与union all
区别就是联合查询的时候union会去重,union all不会去重
1
|
通过 UNION 运算符来将两张表纵向联接,基本方式为: |
1
2
3
4
5
6
7
|
SELECT 列1 , 列2 FROM 表1 UNION SELECT 列3 , 列4 FROM 表2; UNION ALL 为保留重复行: SELECT 列1 , 列2 FROM 表1 UNION ALL SELECT 列3 , 列4 FROM 表2; |
1
2
|
SELECT Sname FROM Atable UNION SELECT Sname FROM Btable SELECT Sname FROM Atable UNION ALL SELECT Sname FROM Btable |
自交叉联接
对同一个表进行联接,就是自联接。交叉联接、内联接、外联接都支持自联接。
SELECT A1.a,A2.a FROM A AS A1 CROSS JOIN A AS A2
A表有4行,查询会生成一个包含4*4=16行的数据的结果集。
在自联接中,必须为表起别名。如果不为表指定别名,联接结果中的列名就会有歧义。
比如在本例中,别名为A1,A2。
小结
年与时驰,意与日去,遂成枯落,
多不接世,悲守穷庐,将复何及。