連接查詢是關系數據中最主要的查詢,包括內連接、外連接等。通過連接運算符可以實現多個表查詢。內連接查詢操作列出與連接條件匹配的數據行,它使用比較運算符比較被連接列的列值。SQL Server中的內連接有:等值連接和不等連接。
1 內連接-相等連接
相等連接又叫等值連接,在連接條件這使用等號(=)運算符比較被連接列的列值,其查詢結果中列出被連接表中的所有列,包括其中的重復列。
示例:
SELECT [dbo].[Category].* , [dbo].[Product].* FROM [dbo].[Category] INNER JOIN [dbo].[Product] ON [dbo].[Category].[CategoryID] = [dbo].[Product].[CategoryID]
SELECT p.[ProductCode], p.[ProductName], c.[CategoryName], d.[Quantity], d.[Subtotal] FROM [dbo].[Product] p INNER JOIN [dbo].[Category] c ON p.[CategoryID] = c.[CategoryID] INNER JOIN [dbo].[OrderDetails] d ON p.[ProductID] = d.[ProductID]
2 帶選擇條件的連接
帶選擇條件的連接查詢是在連接查詢的過程中,通過添加過濾條件限制查詢的結果,使查詢的結果更加准確。
示例:
SELECT [dbo].[Category].* , [dbo].[Product].* FROM [dbo].[Category] INNER JOIN [dbo].[Product] ON [dbo].[Category].[CategoryID] = [dbo].[Product].[CategoryID] AND [dbo].[Category].[CategoryID] = 1
3 自連接
如果在一個連接查詢中,涉及到的兩個表都是同一個表,這種查詢稱為自連接查詢。自連接是一種特殊的內連接,它是指相互連接的表在物理上為同一張表,但可以在邏輯上分為兩張表。
示例:
SELECT c1.CategoryID, c1.CategoryName FROM [dbo].[Category] c1 INNER JOIN [dbo].[Category] c2 ON c1.[CategoryID] = c2.[ParentID]
4 外連接
連接查詢將查詢多個表中相關聯的行,內連接時,返回查詢結果集合中的僅是符號查詢條件和連接條件的行,但有時需要包含沒有關聯的行中數據,即返回查詢結果集合中的不僅包含符合連接條件的行,還需要包括左表(左外連接或左連接)、右表(右外連接或右連接)或者兩個邊接表(全外連接)中的所有數據行。外連接分為左外連接和右外連接。
◊ LEFT JOIN(左連接):返回包括左表中的所有記錄和右表中連接字段相等的記錄。
◊ RIGHT JOIN(右連接):返回包括右表中的所有記錄和左表中連接字段相等的記錄。
4.1 左外連接
左連接的結果包括LEFT OUTER JOIN關鍵字左邊連接的表的所有行,而不僅僅是連接列所匹配的行。如果左表的某行在右表中沒有匹配行,則在相關聯的結果集中右表的所有選擇字段均為NULL。
示例:
SELECT [dbo].[Category].* , [dbo].[Product].* FROM [dbo].[Category] LEFT OUTER JOIN [dbo].[Product] ON [dbo].[Category].[CategoryID] = [dbo].[Product].[CategoryID]
4.2 右外連接
右連接將返回RIGHT OUTER JOIN關鍵字右邊的表中的所有行。如果右表的某行在左表中沒有匹配行,左表將返回NULL。
示例:
SELECT [dbo].[Category].* , [dbo].[Product].* FROM [dbo].[Category] RIGHT OUTER JOIN [dbo].[Product] ON [dbo].[Category].[CategoryID] = [dbo].[Product].[CategoryID]
4.3 全外連接
全外連接又稱為完全外連接,該連接查詢方式返回兩個連接中所有的記錄數據。根據匹配條件,如果滿足匹配條件時,則返回數據;如果不滿足匹配條件時,同樣返回數據,但在相應的列中填入NULL,全外連接返回的結果集中包含了兩個完全表的所有數據。全外連接關鍵字FULL OUTER JOIN。
示例:
SELECT [dbo].[Category].* , [dbo].[Product].* FROM [dbo].[Category] FULL OUTER JOIN [dbo].[Product] ON [dbo].[Category].[CategoryID] = [dbo].[Product].[CategoryID]