【SqlServer系列】表連接

来源:http://www.cnblogs.com/wangjiming/archive/2017/07/12/7153533.html
-Advertisement-
Play Games

1 概述 1 概述 1.1 已發佈【SqlServer系列】文章 【SqlServer系列】SQLSERVER安裝教程 【SqlServer系列】資料庫三大範式 【SqlServer系列】表單查詢 1.2 本篇文章內容概要 1.3 本篇文章內容概括 在SQL語句中,關於表連接,若按照表的數量來劃分, ...


1   概述

1.1  已發佈【SqlServer系列】文章

1.2  本篇文章內容概要

1.3  本篇文章內容概括

在SQL語句中,關於表連接,若按照表的數量來劃分,可以劃分為單表連接、兩表連接和兩表以上連接,在本篇文章中,主要講解兩表連接,其他多表連接原理一樣。

關於表連接有很多種類,本文主要講解交叉連接,內連接,外連接(左外部連接,右外部連接,全連接),自連接。

1.4  本章測試樣表和Sql

業務場景:有兩張表,分為為顧客表Customers和顧客訂單表Orders,SQL語句分別如下:

創建Customes並初始化

 1 --CREATE TABLE Customers
 2 CREATE TABLE Customers
 3 (
 4    CustID VARCHAR(50) NOT NULL,  --顧客ID
 5    CustName  VARCHAR(50),--顧客姓名
 6    CustCompany VARCHAR(50) --顧客公司
 7 )
 8 
 9 --Initial Customers
10 
11 INSERT INTO Customers VALUES('SXN-DD-01','趙武','A')
12 INSERT INTO Customers VALUES('SXN-DD-02','劉楊','B')
13 INSERT INTO Customers VALUES('SXN-DD-03','張永為','C')
14 INSERT INTO Customers VALUES('SXN-DD-04','李龍飛','D')
15 INSERT INTO Customers VALUES('SXN-FF-01','鄧華','E')
16 INSERT INTO Customers VALUES('SXN-HH-01','張濤明','F')

查詢結果為:

創建Order表並初始化

 1 CREATE TABLE Orders
 2 (
 3   CustID VARCHAR(50) NOT NULL,  --顧客ID
 4   OrdetID VARCHAR(50)  --訂單ID
 5 )
 6 
 7 --Initial Orders
 8 
 9 INSERT INTO Orders VALUES('SXN-DD-01','SCCCCFFFFFSSOX002')
10 INSERT INTO Orders VALUES('SXN-DD-02','SCCCCFFFFFSSOX0X2')
11 INSERT INTO Orders VALUES('SXN-DD-03','')
12 INSERT INTO Orders VALUES('SXN-DD-04','')
13 INSERT INTO Orders VALUES('SXN-DD-05','SCCCCFFFFFSSOX0H2')
14 INSERT INTO Orders VALUES('SXN-DD-06','')

查詢結果為:

 

 

2   問題引入

 Q1:寫一個查詢,生成從1到1000的整數序列。

3   交叉連接

3.1   SQL示例及示例結果

1 SELECT  C.CustID,C.CustName,C.CustCompany,O.CustID,O.OrdetID
2 FROM Customers AS C
3 CROSS JOIN Orders AS O

結果:

3.2   示例結果分析

交叉連接使用關鍵字CROSS JOIN進行查詢,查詢的結果為笛卡兒積,從如上結果可以看出,查詢出的結果公有14行數據,因為Customers表和Orders表分別有4條記錄,4X4=16;

3.3  小結

a.在邏輯上,交叉連接是一種最簡單的聯接;
b.交叉連接只實現一個邏輯處理步驟———笛卡兒積;
c.操作:對輸入的兩個表進行操作,把它們連接起來,生成兩者的笛卡兒積,即將一個輸入表的每行與另一個表的所以行進行匹配,如果一個表有m行,而另一個表有n行,將得到m x n行的接果集;
d.結構:
  SELECT  tb1.tb1ConumName,tb2.tb2ConumName
  FROM table1 AS tb1 
  CROSS JOIN table2 AS tb2
e.交叉連接使用的關鍵字:CROSS JOIN ;
f.交叉連接生成的接果集是一個虛擬表,虛擬表中的各列直接源於參與連接的兩個表;

 

4   內連接

4.1   SQL示例及示例結果

1 SELECT  C.CustID,C.CustName,C.CustCompany,O.CustID,O.OrdetID
2 FROM Customers AS C
3 INNER JOIN Orders AS O
4 ON C.CustID=O.CustID

結果:

4.2   示例結果分析

內連接在交叉連接的基礎上外加過濾條件ON,如上例子中用Customers.CustID=Orders.CustID作為過濾條件,結果顯而易見。

4.3  小結

內聯接規則為笛卡爾積+用戶謂詞過濾:它首先像交叉連接一樣,對兩個輸入表進行笛卡爾積運算,然後根據用戶指定的謂詞對結果進行過濾;

 

5   外連接

5.1   SQL示例及示例結果(只分析左外部連接,因為右連接和全連接原理也是一樣的)

1 SELECT  C.CustID,C.CustName,C.CustCompany,O.CustID,O.OrdetID
2 FROM Customers AS C
3 LEFT OUTER JOIN Orders AS O
4 ON C.CustID=O.CustID

結果:

5.2   示例結果分析

如上以Cutomers表作為左保留表,連接右表Orders列CustID缺少SXN-FF-01和SXN-HH-01,為了以左保留表為基準,用NULL占位符來填充。

5.3  小結

a.外連接:笛卡兒積+ON過濾+外部行;
b.在外連接中,要把一個表標記為“保留的”表,可以在表名之間使用關鍵字LEFT OUTER JOIN、RIGHT OUTER JOIN、FULL OUTER JOIN,其中OUTER關鍵字是可選的。LEFT關鍵字表示左邊表的行是保留的,RIGHT關鍵字表示右邊表的行是保留的,而FULL關鍵字則表示左右兩邊表的行都是保留的;
c.外連接的第三個邏輯查詢處理步驟就是要識別保留表中按照ON條件在另一個表找不到與之匹配的那些行,再把這些行添加到連接的前兩個步驟生成的結果中。對於來自連接的非保留表的那些列,追加的外不行中的這些列則用NULL作為占位符;
d.從外連接保留表的角度來看,可以認為外連接結果中的數據行包括兩種內部行和外部行。內部行是指按照ON子句中的條件能在連接的另一邊找到匹配的那些行;而外部行則是指找不到匹配的那些行。內連接只返回內部行,外連接同時返回內部行和外部行;
e.使用外連接時,到底是在查詢的ON子句中,還是在WHERE子句中指定連結條件?從外連接保留表中的行來考慮該問題,ON子句中的過濾條件不是最終的,換句話說,ON子句中的條件並不能最終決定保留表中的部分行是否會在結果中出現,而只是判斷是否能夠匹配另一邊表中的某些行。所以,當需要表達一個非最終的條件時(即這個條件只決定哪些行可以匹配非保留表),就在ON子句中指定連接條件,當在生成外部行以後,要運用過濾器,而且希望過濾條件是最終的,就應該在WHERE子句中指定條件;

 

6   自連接

6.1   SQL示例及示例結果

1 SELECT  C1.CustID AS C1CustID,C1.CustName AS C1CustName,C1.CustCompany AS C1CustCompany,C2.CustID,C2.CustName,C2.CustCompany
2 FROM Customers AS C1
3 JOIN Customers AS C2
4 ON C1.CustID=C2.CustID

結果:

6.2   示例結果分析

如上例子為自連接在內連接中的運用,在其他連接中的運用就不舉例子了,比較簡單。

6.3  小結

a.自連接為單個表取不同的別名,通過別名來連接;
b.自連接可以用於其它連接;
b.自連接可以看作交叉連接、內連接、外連接等連接的一個特例;

 

7   問題答案

Q1:KEY

CREATE TABLE Digits
( 
  digit int not null primary key
)
--Initial testing data for Digits
INSERT INTO Digits VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)

--Query

SELECT D3.digit*100+D2.digit*10+D1.digit+1 AS n
FROM Digits AS D1
CROSS JOIN Digits AS D2
CROSS JOIN Digits AS D3
ORDER BY n

 

8   參考文獻

【01】Microsoft  SqlServer 2008技術內幕:T-SQL 語言基礎

【02】Microsoft  SqlServer 2008技術內幕:T-SQL 查詢

9   版權

 

  • 感謝您的閱讀,若有不足之處,歡迎指教,共同學習、共同進步。
  • 博主網址:http://www.cnblogs.com/wangjiming/。
  • 極少部分文章利用讀書、參考、引用、抄襲、複製和粘貼等多種方式整合而成的,大部分為原創。
  • 如您喜歡,麻煩推薦一下;如您有新想法,歡迎提出,郵箱:[email protected]
  • 可以轉載該博客,但必須著名博客來源。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • UICollectionView實現瀑布流 在iOS中可以實現瀑布流的目前已知的有2種方案: 本文中我們介紹第二種實現方案首先我們需要自定義一個繼承於UICollectionViewLayout的layout,然後需要重寫四個方法: 第一個方法是做一些初始化的操作,這個方法必須先調用一下父類的實現第 ...
  • 1. drawRect: UIView子類重寫 2. drawLayer: inContext: CALayer設置代理 (這是個代理方法) 3. drawInContext: CALayer子類重寫 4. 使用圖形上下文生成圖片: imageContext 儘量避免混用 實現 drawRect : ...
  • 下載更新apk,基本上每個app都需要的功能,來看看吧,肯定有你想要的,以前都是自己寫,近期想藉助第三方的一個庫來做,功能齊全,感覺不錯,記錄使用過程,雖然官方也有使用教程,不過畢竟粗略,網上也能搜到,不過基本都是複製的 首先下載庫,地址改成我們自己的,檢查地址就讓它了,這個根據自己的業務調整,也能 ...
  • Error:FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':app:externalNativeBuildDebug'. > Build command failed. E ...
  • 使用Intent在活動間穿梭(Intent不僅可以指明當前組件想要執行的動作,還可以在不同組件之間傳遞數據) 1、使用顯式Intent 基於安卓入門1的內容,繼續在ActivityTest項目中再創建一個活動。右擊com.example.administrator.activitytest包->Ne ...
  • 1、設置導航欄標題的字體顏色和大小 方法一:(自定義視圖的方法,一般人也會採用這樣的方式) 就是在導航向上添加一個titleView,可以使用一個label,再設置label的背景顏色透明,字體什麼的設置就很簡單了。 //自定義標題視圖 UILabel *titleLabel = [[UILabel ...
  • setContenView(R.id.activity)實現原理 1.底層框架根據佈局ID找到佈局文件。 2.底層框架解析此佈局文件(pull解析)。 3.底層框架通過反射構建佈局文件中的元素對象(EditText,TextView等)。 4.底層框架會將元素對象(view)放到Activity中。 ...
  • 一,代碼。 二,輸出。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...