SQL Server進階(四):cross join、inner join、left join、right jion、union、union all


測試數據腳本

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'
View Code

數據表

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表中的idC表中的id相等,則匹配成功。

  另外一種更正式的方法是在關系代數的基礎上來考慮內聯接,聯接運算首先對兩個表求笛卡爾積(4A記錄*5C記錄=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

小結

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM