麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 數據庫 > SQL Server > 正文

淺談SQL Server交叉聯接 內部聯接

2024-08-31 01:04:25
字體:
來源:轉載
供稿:網友

前言

本節開始我們進入聯接學習,關于連接這一塊涉及的內容比較多,我們一步一步循序漸進學習,簡短內容,深入的理解。

交叉聯接(CROSS JOIN)

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

SELECT C.custid, E.empidFROM Sales.Customers AS CCROSS JOIN HR.Employees AS EORDER BY E.empid

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

sqlserver,交叉聯接,內部聯接

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

sqlserver,交叉聯接,內部聯接

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

IF OBJECT_ID('dbo.Digits','U')IS NOT NULL DROP TABLE dbo.Digits;CREATE TABLE dbo.Digits( digit INT NOT NULL);

插入10條基礎數據

USE TSQL2012GOINSERT INTO dbo.Digits  ( digit )VALUES ( 0 ), ( 1 ), ( 2 ), ( 3 ), ( 4 ), ( 5 ), ( 6 ), ( 7 ), ( 8 ), ( 9 )

創建數字表

USE TSQL2012GOCREATE TABLE Nums( n INT NOT NULL PRIMARY KEY);

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

USE TSQL2012GOINSERT INTO dbo.Nums(n)SELECT D6.digit * 100000 + D5.digit * 10000 + D4.digit * 1000 + D3.digit * 100 + D2.digit * 10 + D1.digit + 1 AS nFROM 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 D6ORDER BY n

sqlserver,交叉聯接,內部聯接

內部聯接(INNER JOIN)

內部聯接用法如下

SELECT *FROM table1 AS t1INNER JOIN table2 AS t2 ON t1.Id = t2.Id

內部聯接返回表中更多數據

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

USE TSQL2012GOCREATE TABLE FirstTable (Col1 INT)CREATE TABLE SecondTable (Col1 INT)CREATE TABLE ThirdTable (Col1 INT)GOINSERT INTO FirstTable (Col1)VALUES (1), (2), (3), (NULL)GOINSERT INTO SecondTable (Col1)VALUES (1), (2), (3), (NULL)GOINSERT INTO ThirdTable (Col1)VALUES (2), (2), (2), (2), (2), (NULL)GO

(1)等值條件查詢

SELECT f.Col1 fCol1FROM FirstTable f INNER JOIN SecondTable s ON s.Col1 = f.col1GO

sqlserver,交叉聯接,內部聯接

(2)非等值條件查詢

USE TSQL2012GOSELECT f.Col1 fCol1FROM FirstTable fINNER JOIN SecondTable s ON s.Col1 <> f.col1GO

sqlserver,交叉聯接,內部聯接

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

USE TSQL2012GOSELECT f.Col1 fCol1FROM FirstTable AS f CROSS JOIN SecondTable AS swhere s.Col1 <> f.col1GO

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

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

USE TSQL2012GOSELECT f.Col1 fCol1FROM FirstTable fINNER JOIN ThirdTable s ON s.Col1 = f.col1GO

sqlserver,交叉聯接,內部聯接

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

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

內部聯接安全性

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

ANSI SQL-92寫法

USE TSQL2012GOSELECT *FROM Sales.Orders AS SO INNER JOIN Sales.OrderDetails AS SOD ON SOD.orderid = SO.orderid

ANSI SQL-89寫法

USE TSQL2012GOSELECT *FROM Sales.Orders AS SO, Sales.OrderDetails AS SODWHERE SOD.orderid = SO.orderid

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

USE TSQL2012GOSELECT COUNT(*) AS '利用等值條件查詢總數據行' FROM Sales.Orders AS SO, Sales.OrderDetails AS SODWHERE SOD.orderid = SO.orderid

sqlserver,交叉聯接,內部聯接

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

SELECT COUNT(*) AS '利用等值條件查詢總數據行' FROM Sales.Orders AS SO, Sales.OrderDetails AS SOD

sqlserver,交叉聯接,內部聯接

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

USE TSQL2012GOSELECT *FROM Sales.Orders AS SO INNER JOIN Sales.OrderDetails AS SOD;

sqlserver,交叉聯接,內部聯接

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

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

總結

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

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,同時也希望多多支持VeVb武林網!


注:相關教程知識閱讀請移步到MSSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 日韩视频在线一区二区三区 | 国产jjizz一区二区三区视频 | 综合激情网 | 日韩不卡一区二区 | 久久久涩 | 日韩精品二区 | 久久精品高清 | 模特三级在线观看 | 97香蕉超级碰碰久久免费软件 | 激情影院在线观看 | 欧美一级在线免费 | 久久99国产精品免费网站 | 日本高清视频网站www | 成人午夜视频在线观看 | 成人区精品一区二区婷婷 | sm高h视频 | 日本不卡一区二区三区在线 | 少妇的肉体的满足毛片 | 久久成人动漫 | 龙床上的呻吟高h | 国产精品一二区 | 成人毛片在线免费看 | 国产99视频精品免视看9 | 羞羞的小视频 | 国产午夜精品久久久久久久蜜臀 | 精品xxxx户外露出视频 | 懂色粉嫩av久婷啪 | 亚洲一区二区三区日本久久九 | 51国产偷自视频区视频小蝌蚪 | 黄色毛片一级 | 永久久久| 毛片在线免费观看视频 | 国产一国产一级毛片视频在线 | 久久精品久久精品久久精品 | 精品亚洲午夜久久久久91 | 中文字幕在线观看精品 | 逼特逼视频在线观看 | 色综合精品 | 男女亲热网站 | 一区二区精品在线 | 久久久久久久久久久久久九 |