測試數據腳本

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'
數據表
1.cross join
交叉連接不需要任何連接條件。兩個表的的數據直接進行笛卡爾積運算。如果一個表有m行,而另一個表有n行,將得到m*n的結果集。
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行。
SELECT * FROM Atable as A INNER JOIN Btable as B ON A.Sname = B.Sname
3.left outer join == left join
產生表B的完全集,而A表中匹配的則有值,沒有匹配的則以null值取代。
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值取代。
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做為值。
SELECT * FROM Atable as A full join Btable as B ON A.Sname = B.Sname
6.union與union all
區別就是聯合查詢的時候union會去重,union all不會去重
通過UNION運算符來將兩張表縱向聯接,基本方式為:
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;
SELECT Sname FROM Atable UNION SELECT Sname FROM Btable SELECT Sname FROM Atable UNION ALL SELECT Sname FROM Btable
CROSS JOIN--自交叉聯接
對同一個表進行聯接,就是自聯接。交叉聯接、內聯接、外聯接都支持自聯接。
SELECT A1.a,A2.a FROM A AS A1 CROSS JOIN A AS A2
A表有4行,查詢會生成一個包含4*4=16行的數據的結果集。
在自聯接中,必須為表起別名。如果不為表指定別名,聯接結果中的列名就會有歧義。
比如在本例中,別名為A1,A2。
小結