溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

SqlServer 表連接教程(問(wèn)題解析)

發(fā)布時(shí)間:2020-10-04 17:07:59 來(lái)源:腳本之家 閱讀:248 作者:Alan_beijing 欄目:數(shù)據(jù)庫(kù)

1.2 本篇文章內(nèi)容概要

SqlServer 表連接教程(問(wèn)題解析)

1.3 本篇文章內(nèi)容概括

在SQL語(yǔ)句中,關(guān)于表連接,若按照表的數(shù)量來(lái)劃分,可以劃分為單表連接、兩表連接和兩表以上連接,在本篇文章中,主要講解兩表連接,其他多表連接原理一樣。

關(guān)于表連接有很多種類(lèi),本文主要講解交叉連接,內(nèi)連接,外連接(左外部連接,右外部連接,全連接),自連接。

1.4 本章測(cè)試樣表和Sql

業(yè)務(wù)場(chǎng)景:有兩張表,分為為顧客表Customers和顧客訂單表Orders,SQL語(yǔ)句分別如下:

創(chuàng)建Customes并初始化

--CREATE TABLE Customers
CREATE TABLE Customers
(
  CustID VARCHAR(50) NOT NULL, --顧客ID
  CustName VARCHAR(50),--顧客姓名
  CustCompany VARCHAR(50) --顧客公司
)

--Initial Customers

INSERT INTO Customers VALUES('SXN-DD-01','趙武','A')
INSERT INTO Customers VALUES('SXN-DD-02','劉楊','B')
INSERT INTO Customers VALUES('SXN-DD-03','張永為','C')
INSERT INTO Customers VALUES('SXN-DD-04','李龍飛','D')
INSERT INTO Customers VALUES('SXN-FF-01','鄧華','E')
INSERT INTO Customers VALUES('SXN-HH-01','張濤明','F')

查詢(xún)結(jié)果為:

SqlServer 表連接教程(問(wèn)題解析)

創(chuàng)建Order表并初始化

CREATE TABLE Orders
(
 CustID VARCHAR(50) NOT NULL, --顧客ID
 OrdetID VARCHAR(50) --訂單ID
)

--Initial Orders

INSERT INTO Orders VALUES('SXN-DD-01','SCCCCFFFFFSSOX002')
INSERT INTO Orders VALUES('SXN-DD-02','SCCCCFFFFFSSOX0X2')
INSERT INTO Orders VALUES('SXN-DD-03','')
INSERT INTO Orders VALUES('SXN-DD-04','')
INSERT INTO Orders VALUES('SXN-DD-05','SCCCCFFFFFSSOX0H2')
INSERT INTO Orders VALUES('SXN-DD-06','')

查詢(xún)結(jié)果為:

SqlServer 表連接教程(問(wèn)題解析)

2 問(wèn)題引入

Q1:寫(xiě)一個(gè)查詢(xún),生成從1到1000的整數(shù)序列。

3 交叉連接

3.1 SQL示例及示例結(jié)果

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

結(jié)果:

SqlServer 表連接教程(問(wèn)題解析)

3.2 示例結(jié)果分析

交叉連接使用關(guān)鍵字CROSS JOIN進(jìn)行查詢(xún),查詢(xún)的結(jié)果為笛卡兒積,從如上結(jié)果可以看出,查詢(xún)出的結(jié)果共有36行數(shù)據(jù),因?yàn)镃ustomers表和Orders表分別有6條記錄,6X6=36;

3.3 小結(jié)

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

4 內(nèi)連接

4.1 SQL示例及示例結(jié)果

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

結(jié)果:

SqlServer 表連接教程(問(wèn)題解析)

4.2 示例結(jié)果分析

內(nèi)連接在交叉連接的基礎(chǔ)上外加過(guò)濾條件ON,如上例子中用Customers.CustID=Orders.CustID作為過(guò)濾條件,結(jié)果顯而易見(jiàn)。

4.3 小結(jié)

內(nèi)聯(lián)接規(guī)則為笛卡爾積+用戶(hù)謂詞過(guò)濾:它首先像交叉連接一樣,對(duì)兩個(gè)輸入表進(jìn)行笛卡爾積運(yùn)算,然后根據(jù)用戶(hù)指定的謂詞對(duì)結(jié)果進(jìn)行過(guò)濾;

5 外連接

5.1 SQL示例及示例結(jié)果(只分析左外部連接,因?yàn)橛疫B接和全連接原理也是一樣的)

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

結(jié)果:

SqlServer 表連接教程(問(wèn)題解析)

5.2 示例結(jié)果分析

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

5.3 小結(jié)

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

6自連接

6.1 SQL示例及示例結(jié)果

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

結(jié)果:

SqlServer 表連接教程(問(wèn)題解析)

6.2 示例結(jié)果分析

如上例子為自連接在內(nèi)連接中的運(yùn)用,在其他連接中的運(yùn)用就不舉例子了,比較簡(jiǎn)單。

6.3 小結(jié)

a.自連接為單個(gè)表取不同的別名,通過(guò)別名來(lái)連接;
b.自連接可以用于其它連接;
b.自連接可以看作交叉連接、內(nèi)連接、外連接等連接的一個(gè)特例;

7問(wèn)題答案

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參考文獻(xiàn)

【01】Microsoft SqlServer 2008技術(shù)內(nèi)幕:T-SQL語(yǔ)言基礎(chǔ)

【02】Microsoft SqlServer 2008技術(shù)內(nèi)幕:T-SQL查詢(xún)

總結(jié)

以上所述是小編給大家介紹的SqlServer 表連接教程,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)億速云網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI