天天看點

SQL Server-交叉聯接、内部聯接基礎回顧(十二)前言

本節開始我們進入聯接學習,關于連接配接這一塊涉及的内容比較多,我們一步一步循序漸進學習,簡短内容,深入的了解,Always to review the basics。

交叉連接配接是最簡單的聯接類型。交叉聯接僅執行一個邏輯查詢處理階段-笛卡爾乘積。例如對兩個輸入表進行操作,聯接并生成兩個表的笛卡爾乘積,也就是說,将一個表的每一行與另一個表的所有行進行比對。是以,如果一個表有m行,另一個表有n行,得到的結果中則會有m*n行。我們就拿SQL Server 2012教程中的例子說下

在Sales.Customers表中有91行資料,HR.Employees表中有9行資料,則利用交叉聯接資料則有819(91*9)行資料,簡略資料如下。

SQL Server-交叉聯接、内部聯接基礎回顧(十二)前言

交叉聯接我們可以用如下圖表示

SQL Server-交叉聯接、内部聯接基礎回顧(十二)前言

交叉聯接最大的用途在于生成數字表以便我們用于其他目的,我們一起來看看。

SQL Server-交叉聯接、内部聯接基礎回顧(十二)前言
SQL Server-交叉聯接、内部聯接基礎回顧(十二)前言

插入10條基礎資料

SQL Server-交叉聯接、内部聯接基礎回顧(十二)前言
SQL Server-交叉聯接、内部聯接基礎回顧(十二)前言

建立數字表

SQL Server-交叉聯接、内部聯接基礎回顧(十二)前言
SQL Server-交叉聯接、内部聯接基礎回顧(十二)前言

利用交叉聯接在數字表中插入100萬條資料

SQL Server-交叉聯接、内部聯接基礎回顧(十二)前言
SQL Server-交叉聯接、内部聯接基礎回顧(十二)前言
SQL Server-交叉聯接、内部聯接基礎回顧(十二)前言

内部聯接用法如下

我們首先給出如下三個測試表

SQL Server-交叉聯接、内部聯接基礎回顧(十二)前言
SQL Server-交叉聯接、内部聯接基礎回顧(十二)前言

(1)等值條件查詢

SQL Server-交叉聯接、内部聯接基礎回顧(十二)前言

(2)非等值條件查詢

SQL Server-交叉聯接、内部聯接基礎回顧(十二)前言
SQL Server-交叉聯接、内部聯接基礎回顧(十二)前言
SQL Server-交叉聯接、内部聯接基礎回顧(十二)前言

上述我們同樣可以利用交叉連接配接實作同樣效果

SQL Server-交叉聯接、内部聯接基礎回顧(十二)前言
SQL Server-交叉聯接、内部聯接基礎回顧(十二)前言

(3)查詢非重複行(NON-DISTINCT)

我們在建立第三個測試表時,插入的資料是5個2,而在第一個表中插入的資料分别是1、2、3,此時我們利用等值聯接得到的結果到底是1個2,還是5個2呢?

SQL Server-交叉聯接、内部聯接基礎回顧(十二)前言
SQL Server-交叉聯接、内部聯接基礎回顧(十二)前言
SQL Server-交叉聯接、内部聯接基礎回顧(十二)前言

我們得到的結果是5個2,為什麼利用内部聯接也就是說利用的等值條件不是傳回1個2呢,其實我們可以總結如下:

結論:利用内部聯接比實際表中傳回更多資料的原因在于,内部聯接傳回的結果集是基于查詢條件中的JOIN,若有多行滿足條件則傳回多條資料。

在兩個表利用等值條件查詢時,我們有兩種寫法。

ANSI SQL-92寫法

SQL Server-交叉聯接、内部聯接基礎回顧(十二)前言
SQL Server-交叉聯接、内部聯接基礎回顧(十二)前言

ANSI SQL-89寫法

SQL Server-交叉聯接、内部聯接基礎回顧(十二)前言
SQL Server-交叉聯接、内部聯接基礎回顧(十二)前言

雖然這兩種寫法都可以,都能滿足需求,但是SQL Server 2012基礎教程強烈建議使用ANSI SQL-92寫法,為什麼呢,因為用ANSI SQL-89寫法時若出現錯誤,此時解析根本不會生成錯誤,而對于ANSI SQL-92寫法則會,下面我們一起來看下ANSI SQL-89寫法的問題

SQL Server-交叉聯接、内部聯接基礎回顧(十二)前言
SQL Server-交叉聯接、内部聯接基礎回顧(十二)前言
SQL Server-交叉聯接、内部聯接基礎回顧(十二)前言

上面是我們利用正确的寫法得到的正确的總資料行為2155條,下面我們看看有問題的寫法

SQL Server-交叉聯接、内部聯接基礎回顧(十二)前言

此時我們沒有給出WHERE條件,而解析未出現錯誤,當然傳回的結果集也就是錯誤的。當我們利用ANSI SQL-92寫法時,我們同樣也未給出比較條件,如下

SQL Server-交叉聯接、内部聯接基礎回顧(十二)前言
SQL Server-交叉聯接、内部聯接基礎回顧(十二)前言
SQL Server-交叉聯接、内部聯接基礎回顧(十二)前言

此時會出現解析錯誤,也就是無法再繼續查詢,自然也就得不到錯誤的結果。

結論:強烈推薦使用ANSI SQL-92寫法,這樣一來使得資料不會出現不一緻性,同時可讀性和可維護性比ANSI SQL-89寫法高。

本節我們講了交叉聯接和内部聯接,同時也給出了使用需要注意的地方,本節到此結束,我們下節再講講自聯接和外部聯接。簡短的内容,深入的了解,我們下節再會,good night。

本文轉自Jeffcky部落格園部落格,原文連結:http://www.cnblogs.com/CreateMyself/p/6142275.html,如需轉載請自行聯系原作者