淺談SQL Server交叉聯(lián)接 內部聯(lián)接
前言
本節(jié)開始我們進入聯(lián)接學習,關于連接這一塊涉及的內容比較多,我們一步一步循序漸進學習,簡短內容,深入的理解。
交叉聯(lián)接(CROSS JOIN)
交叉連接是最簡單的聯(lián)接類型。交叉聯(lián)接僅執(zhí)行一個邏輯查詢處理階段-笛卡爾乘積。例如對兩個輸入表進行操作,聯(lián)接并生成兩個表的笛卡爾乘積,也就是說,將一個表的每一行與另一個表的所有行進行匹配。所以,如果一個表有m行,另一個表有n行,得到的結果中則會有m*n行。我們就拿SQL Server 2012教程中的例子說下
SELECT C.custid, E.empid FROM Sales.Customers AS C CROSS JOIN HR.Employees AS E ORDER BY E.empid
在Sales.Customers表中有91行數(shù)據(jù),HR.Employees表中有9行數(shù)據(jù),則利用交叉聯(lián)接數(shù)據(jù)則有819(91*9)行數(shù)據(jù),簡略數(shù)據(jù)如下。
交叉聯(lián)接我們可以用如下圖表示
交叉聯(lián)接最大的用途在于生成數(shù)字表以便我們用于其他目的,我們一起來看看。
IF OBJECT_ID('dbo.Digits','U') IS NOT NULL DROP TABLE dbo.Digits; CREATE TABLE dbo.Digits ( digit INT NOT NULL );
插入10條基礎數(shù)據(jù)
USE TSQL2012 GO INSERT INTO dbo.Digits ( digit ) VALUES ( 0 ), ( 1 ), ( 2 ), ( 3 ), ( 4 ), ( 5 ), ( 6 ), ( 7 ), ( 8 ), ( 9 )
創(chuàng)建數(shù)字表
USE TSQL2012 GO CREATE TABLE Nums ( n INT NOT NULL PRIMARY KEY );
利用交叉聯(lián)接在數(shù)字表中插入100萬條數(shù)據(jù)
USE TSQL2012 GO INSERT INTO dbo.Nums(n) SELECT D6.digit * 100000 + D5.digit * 10000 + D4.digit * 1000 + D3.digit * 100 + D2.digit * 10 + D1.digit + 1 AS n FROM dbo.Digits AS D1 CROSS JOIN dbo.Digits AS D2 CROSS JOIN dbo.Digits AS D3 CROSS JOIN dbo.Digits AS D4 CROSS JOIN dbo.Digits AS D5 CROSS JOIN dbo.Digits AS D6 ORDER BY n
內部聯(lián)接(INNER JOIN)
內部聯(lián)接用法如下
SELECT * FROM table1 AS t1 INNER JOIN table2 AS t2 ON t1.Id = t2.Id
內部聯(lián)接返回表中更多數(shù)據(jù)
我們首先給出如下三個測試表
USE TSQL2012 GO CREATE TABLE FirstTable (Col1 INT) CREATE TABLE SecondTable (Col1 INT) CREATE TABLE ThirdTable (Col1 INT) GO INSERT INTO FirstTable (Col1) VALUES (1), (2), (3), (NULL) GO INSERT INTO SecondTable (Col1) VALUES (1), (2), (3), (NULL) GO INSERT INTO ThirdTable (Col1) VALUES (2), (2), (2), (2), (2), (NULL) GO
(1)等值條件查詢
SELECT f.Col1 fCol1 FROM FirstTable f INNER JOIN SecondTable s ON s.Col1 = f.col1 GO
(2)非等值條件查詢
USE TSQL2012 GO SELECT f.Col1 fCol1 FROM FirstTable f INNER JOIN SecondTable s ON s.Col1 <> f.col1 GO
上述我們同樣可以利用交叉連接實現(xiàn)同樣效果
USE TSQL2012 GO SELECT f.Col1 fCol1 FROM FirstTable AS f CROSS JOIN SecondTable AS s where s.Col1 <> f.col1 GO
(3)查詢非重復行(NON-DISTINCT)
我們在創(chuàng)建第三個測試表時,插入的數(shù)據(jù)是5個2,而在第一個表中插入的數(shù)據(jù)分別是1、2、3,此時我們利用等值聯(lián)接得到的結果到底是1個2,還是5個2呢?
USE TSQL2012 GO SELECT f.Col1 fCol1 FROM FirstTable f INNER JOIN ThirdTable s ON s.Col1 = f.col1 GO
我們得到的結果是5個2,為什么利用內部聯(lián)接也就是說利用的等值條件不是返回1個2呢,其實我們可以總結如下:
結論:利用內部聯(lián)接比實際表中返回更多數(shù)據(jù)的原因在于,內部聯(lián)接返回的結果集是基于查詢條件中的JOIN,若有多行滿足條件則返回多條數(shù)據(jù)。
內部聯(lián)接安全性
在兩個表利用等值條件查詢時,我們有兩種寫法。
ANSI SQL-92寫法
USE TSQL2012 GO SELECT * FROM Sales.Orders AS SO INNER JOIN Sales.OrderDetails AS SOD ON SOD.orderid = SO.orderid
ANSI SQL-89寫法
USE TSQL2012 GO SELECT * FROM Sales.Orders AS SO, Sales.OrderDetails AS SOD WHERE SOD.orderid = SO.orderid
雖然這兩種寫法都可以,都能滿足需求,但是SQL Server 2012基礎教程強烈建議使用ANSI SQL-92寫法,為什么呢,因為用ANSI SQL-89寫法時若出現(xiàn)錯誤,此時解析根本不會生成錯誤,而對于ANSI SQL-92寫法則會,下面我們一起來看下ANSI SQL-89寫法的問題
USE TSQL2012 GO SELECT COUNT(*) AS '利用等值條件查詢總數(shù)據(jù)行' FROM Sales.Orders AS SO, Sales.OrderDetails AS SOD WHERE SOD.orderid = SO.orderid
上面是我們利用正確的寫法得到的正確的總數(shù)據(jù)行為2155條,下面我們看看有問題的寫法
SELECT COUNT(*) AS '利用等值條件查詢總數(shù)據(jù)行' FROM Sales.Orders AS SO, Sales.OrderDetails AS SOD
此時我們沒有給出WHERE條件,而解析未出現(xiàn)錯誤,當然返回的結果集也就是錯誤的。當我們利用ANSI SQL-92寫法時,我們同樣也未給出比較條件,如下
USE TSQL2012 GO SELECT * FROM Sales.Orders AS SO INNER JOIN Sales.OrderDetails AS SOD;
此時會出現(xiàn)解析錯誤,也就是無法再繼續(xù)查詢,自然也就得不到錯誤的結果。
結論:強烈推薦使用ANSI SQL-92寫法,這樣一來使得數(shù)據(jù)不會出現(xiàn)不一致性,同時可讀性和可維護性比ANSI SQL-89寫法強。
總結
本節(jié)我們講了交叉聯(lián)接和內部聯(lián)接,同時也給出了使用需要注意的地方,本節(jié)到此結束,我們下節(jié)再講講自聯(lián)接和外部聯(lián)接。簡短的內容,深入的理解,我們下節(jié)再會,good night。
以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,同時也希望多多支持腳本之家!
- SQL Server 2005通用分頁存儲過程及多表聯(lián)接應用
- SQL設置SQL Server最大連接數(shù)及查詢語句
- 解析SQL Server聚焦移除(Bookmark Lookup、RID Lookup、Key Lookup)
- 詳解SQL Server的聚焦過濾索引
- 淺述SQL Server的聚焦強制索引查詢條件和Columnstore Index
- 淺析SQL Server的分頁方式 ISNULL與COALESCE性能比較
- 詳解SQL Server中的數(shù)據(jù)類型
- 淺析SQL Server的聚焦使用索引和查詢執(zhí)行計劃
- 淺析SQL Server 聚焦索引對非聚集索引的影響
- 如何快速刪掉SQL Server登錄時登錄名下拉列表框中的選項
相關文章
Sql?Server高版本數(shù)據(jù)庫數(shù)據(jù)備份后還原到低版本數(shù)據(jù)庫詳細步驟
不同版本SQL?Server數(shù)據(jù)庫備份還原存在問題,不能從高版本的數(shù)據(jù)庫導入到低版本數(shù)據(jù)中,這篇文章主要給大家介紹了關于Sql?Server高版本數(shù)據(jù)庫數(shù)據(jù)備份后還原到低版本數(shù)據(jù)庫的詳細步驟,需要的朋友可以參考下2023-10-10SQL一條語句統(tǒng)計記錄總數(shù)及各狀態(tài)數(shù)
這篇文章主要為大家介紹了SQL一條語句統(tǒng)計記錄總數(shù)及各狀態(tài)數(shù)的sql語句,需要的朋友可以參考下2013-12-12SQL server高并發(fā)生成唯一訂單號的方法實現(xiàn)
這篇文章主要介紹了SQL server高并發(fā)生成唯一訂單號的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02SQLSERVER聚集索引和主鍵(Primary Key)的誤區(qū)認識
很多人會把Primary Key和聚集索引搞混起來,或者認為這是同一個東西。這個概念是非常錯誤的,本文將帶你理清思路,感興趣的你可不要錯過了哈,或許本文對你有所幫助2013-02-02SQL語句練習實例之五 WMS系統(tǒng)中的關于LIFO或FIFO的問題分析
SQL語句練習實例之五 WMS系統(tǒng)中的關于LIFO或FIFO的問題分析,需要的朋友可以參考下。2011-10-10