日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

收藏1 -SQL

發布時間:2025/7/14 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 收藏1 -SQL 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
較之前一版本,SQL Server 2005可以說是作出了根本性的革新。對于一般的編程人員來說,最具吸引力的一大特性就是實現了對CLR的寄宿,使我們可以使用任意一種.NET Programming Language來編寫Stored ProcedureFunction、Trigger、User Defined Type等等。但是并不意味著我們使用多年的T-SQL即將被淘汰,而事實上T-SQL仍然是我們最為常見的基于Database的編程語言。為了使編程人員更容易地使用T-SQL來實現一些較為復雜的功能,SQL Server 2005T-SQL進行了一系列的改進,這篇文章將概括性地介紹這些T-SQL Enhancement

為了使讀者對這些新引入的T-SQL特性有一個大概的了解,我先概括性地列出這些特性:

  • APPLY Operator
  • Common Table Expression
  • PIVOT Operator
  • TOP Clause Enhancement
  • Ranking
  • DDL Trigger
  • Others

一、??????????? APPLY Operator

APPLY這個操作符被置于一個查詢的FROM語句中,對于查詢出的每條數據行,都去調用一個Table Value FunctionTVF),并將TVF的數據附加在現有的查詢結果上。APPLY通常用于這樣的場景中:查詢的結果一部分包含在一個Table或者View,另一部分則通過一個TVF來獲得,通過TVF獲得的記錄是基于Table或者View中每條記錄的某個Column的數據,也就是說我們把Table或者View的某個Column的值作為調用TVF的參數。這實際上將通過TVF獲得的Table作為現有Table或者ViewOuter table,將它們連接(Join)在一起,而連接它們的Key就是作為TVF參數傳入的Column。

我們知道Join分為Inner JoinOuter Join,他們分別對應著CROSS APPLYOUTER APPLY。如果對于某個條記錄,TVF發揮的是一個空的Rowset,對于CROSS APPLY,該記錄將不會出現在最終的結果中,而對于OUTER APPLY來說,最終的查詢結果將包含該條記錄,只是基于TVFColumn的值為NULL。

可能文字描述太過抽象,我們現在通過例子來進一步理解APPLY Operator。下面的例子基于的DatabaseSQL Server 2005 Sample DatabaseAdventureWorks。(注:后續的例子如未作特殊的說明,均使用的是該Database)。

我們首先創建一個TVFdbo.fn_getproduct。根據Product ID獲得產品信息。

IF?EXISTS?(SELECT?*?FROM?sysobjects?WHERE?type?=?'IF'?AND?name?=?'fn_getproduct')
????
BEGIN
????????
DROP??Function??dbo.fn_getproduct
????
END
GO

CREATE?Function?dbo.fn_getproduct?
(
????
@product_id?Int
)
RETURNS?TABLE

AS?RETURN?

SELECT?*?FROM?Production.Product?WHERE?ProductID?=?@product_id

GO

然后我們做如下的查詢:對Production.WorkOrder作查詢,并列出對應的Product的信息:

SELECT?WorkOrderID,WorkOrder.ProductID,ProductNumber,[Name],OrderQty
FROM?Production.WorkOrder?WorkOrder
CROSS?APPLY?dbo.fn_getproduct(WorkOrder.ProductID)

下面是查詢結果:

我們可以看到ProductNumberName兩個Column實際上是來自TVF中的,其余才是來自于Production.WorkOrder。如果把TVF看作一個Table,通過查詢結果我們可以看出,上面的查詢相當于把這個TableProduction.WorkOrder通過ProductID作了一個Join。到底是Inner Join,還是Outer Join?我們對這個TVF作如下修改,使其在正常的情況下返回一個空的結果集(WHERE ProductID = @product_id * -1):

IF?EXISTS?(SELECT?*?FROM?sysobjects?WHERE?type?=?'IF'?AND?name?=?'fn_getproduct')
????
BEGIN
????????
DROP??Function??dbo.fn_getproduct
????
END
GO

CREATE?Function?dbo.fn_getproduct?
(
????
@product_id?Int
)
RETURNS?TABLE

AS?RETURN?

SELECT?*?FROM?Production.Product?WHERE?ProductID?=?@product_id?*?-1

GO

再次運行上面的查詢,我們會發現最終返回的結果為空:


看來
CROSS APPLY使用的是Inner Join

我們現在來試試OUTER APPLY

SELECT?WorkOrderID,WorkOrder.ProductID,ProductNumber,[Name],OrderQty
FROM?Production.WorkOrder?WorkOrder
OUTER?APPLY?dbo.fn_getproduct(WorkOrder.ProductID)

下面是最終的輸出結果,我們發現所有的Order記錄被返回,通過TVF獲得的ProductNumberName的值為NULL。這充分說明了OUTER APPLY采用的是OUTER JOIN

二、??????????? Common Table Expression

Common Table ExpressionCTE)可以看成是一個臨時創建的View,他的生命周期僅僅限于當前Context。一旦CTE被創建,你可以將它當成一般的Table,大部分基于Table的操作都可以運用于CTE。下面是創建CTE的語法結構:

WITH?cte_name(column?name?list)
AS
(
?????query
)

E.G.

WITH?CTE_Black_Product
AS
(
????
SELECT?*?FROM?Production.Product?WHERE?Color?=?'Black'
)

SELECT?*?FROM?CTE_Black_Product

CTE具有廣泛的運用,他往往具有將問題化繁為簡的魔力。下面介紹幾個典型的運用:

1.????????? 1.??????????? 將復雜的Aggregate置于CTE中,將復雜的問題分解為多個步驟。

如果我們現在需要統計每個客戶發出的訂單數量(相關數據存儲于Sales.SalesOrderHeader

中),同時輸出客戶的個人信息(相關數據存儲于Sales.Customer中)。雖然這樣的功能很簡單,但他體現了一種思想,把一部完成略顯復雜的功能進程分解成多個簡單的步驟。

WITH?CTE_SalesOrder_Count
AS
(
????
SELECT?CustomerID,?Count(*)?As?OrderCount
????
FROM?Sales.SalesOrderHeader
????
GROUP?BY?CustomerID
)

SELECT?Sales.Customer.CustomerID,?AccountNumber,OrderCount
FROM?Sales.Customer?INNER?JOIN?CTE_SalesOrder_Count
ON?CTE_SalesOrder_Count.CustomerID?=?Sales.Customer.CustomerID

2.????????? 使用CTE代替自連接,以便更易于理解。

假設我們有一個Product表用于存儲每個Product的信息,每個Product有一個唯一標識Product_ID和一個不唯一的Product_Name。由于不同的Product可能重名,倘若我們有這樣的一個需求:需要將重名的記錄(除了具有最小ID的那個)刪除,從而保證其名稱的唯一性。我們來看看如何保這些需要上出的記錄篩選出來。Product表的記錄如下,ID14的兩條記錄重名,現在我們的目的是把ID4的記錄篩選出來。


在不考慮
CTE的情況下,我們通過下面的SQL實現這個功能,這個SQL采用了自連接。雖然SQL看起來很簡潔,但是相信有一些人第一次看到這樣一個SQL,不能立即理解。

SELECT?*?
FROM?dbo.PRODUCT
WHERE?PRODUCT_ID?NOT?IN
(
????
SELECT?MIN(PRODUCT_ID)
????
FROM?dbo.PRODUCT?p
????
WHERE?dbo.PRODUCT.PRODUCT_NAME?=?p.PRODUCT_NAME
)

但是如果我們采用了CTE,通過下面一段SQL來實現,雖然代碼多了點,但是從語義上看要易于理解一點:首先把重名的選出來,在和Product作一次連接。

WITH?CTE_PRODUCT(PRODUCT_ID,PRODUCT_NAME)
AS
(
????
SELECT?MIN(PRODUCT_ID)?AS?PRODUCT_ID,PRODUCT_NAME
????
FROM?dbo.PRODUCT
????
GROUP?BY?PRODUCT_NAME
????
HAVING?COUNT(*)>1
)

SELECT?dbo.PRODUCT.PRODUCT_ID,?dbo.PRODUCT.PRODUCT_NAME
FROM?dbo.PRODUCT?
INNER?JOIN?CTE_PRODUCT
ON?CTE_PRODUCT.PRODUCT_NAME?=?dbo.PRODUCT.PRODUCT_NAME
AND?dbo.PRODUCT.PRODUCT_ID?>?CTE_PRODUCT.PRODUCT_ID

3.????????? 用于具有層次結構記錄的遞歸查詢

比如一個公司的員工體系就是一個包含上下級關系的具有層次化的樹形結構。假設我們有如下一個EMPLOYEE表,通過REPORT_TO體現每個員工的上下級關系(假設Empoyee_Name具有唯一性)。


我們現在的需求是:列出員工
A的所有下級。

為了實現這樣的一個功能,我們需要以一種特殊的結構來創建CTE

WITH?CTE_EMPLOYEE(EMPLOYEE_ID,?EMPLOYEE_NAME,REPORT_TO)
AS
(
????
SELECT?*?
????
FROM?dbo.EMPLOYEE
????
WHERE?EMPLOYEE_NAME?=?'A'
????
????
UNION?ALL
????
????
SELECT?dbo.EMPLOYEE.*
????
FROM?dbo.EMPLOYEE
????
JOIN?CTE_EMPLOYEE
????
ON?dbo.EMPLOYEE.REPORT_TO?=?CTE_EMPLOYEE.EMPLOYEE_ID
)

SELECT?*?
FROM?CTE_EMPLOYEE
WHERE?EMPLOYEE_NAME?>?'A'
OR?EMPLOYEE_NAME?<?'A'

我們發現CTE中主體部分由兩個SELECT語句組成,我們把第一個叫做Anchor MemberAM),AM不會遞歸,只會執行一次,本例中篩選出了級別最高的A;另一個SELECT語句叫做Recursive MemberRM),RM通過CTE本身和EMPLOYEE表建立連接,所以RM會采用遞歸的方式執行。

轉載于:https://www.cnblogs.com/Gsun/archive/2009/12/24/1631494.html

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的收藏1 -SQL的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 69天堂网| 久久婷婷一区 | 欧美激情精品久久久久久变态 | 久久精品三级 | 欧美激情中文字幕 | 成人影| 猫咪av网| 亚洲精品久久久中文字幕痴女 | 奇米影视在线 | 奇米在线 | 久久精品久 | 国产日韩欧美精品在线观看 | 丰满人妻一区二区三区53 | 琪琪色在线视频 | 自拍偷拍亚洲天堂 | 欧美大白bbbb与bbbb | 50一60岁老妇女毛片 | 国产精品色在线网站 | 国产免费无遮挡吸奶头视频 | 日韩一级片在线播放 | 精品人妻人人做人人爽 | 91精品一区二区三 | 日本乱轮视频 | 无码人妻少妇伦在线电影 | 一级黄色伦理片 | 欧美大喷水吹潮合集在线观看 | 99热这里只有精品4 精品国产黄色 | 一区二区在线免费视频 | 男生捅女生肌肌 | 乳罩脱了喂男人吃奶视频 | 一区二区三区四区视频在线观看 | 无码人妻av一区二区三区波多野 | 国产精品久久久久av | 中文毛片 | 激情六月天婷婷 | 奇米一区二区三区 | 中文字幕在线视频不卡 | 99热在线只有精品 | 欧美成人综合视频 | 国产爱搞 | 久久精品一本 | 男女啪啪网站免费 | 变态视屏| 国产高清视频在线播放 | 日本高清在线一区 | 不卡日本 | 午夜电影一区二区 | 办公室大战高跟丝袜秘书经理ol | 国产精品第9页 | 国产精品毛片久久久久久久av | 日韩一二三四 | 欧美第一页在线 | 免费看成人av | 免费在线观看网址入口 | 亚洲国产色图 | 成熟人妻av无码专区 | 欧美一二三区在线观看 | 娇妻玩4p被三个男人伺候电影 | 五月天婷婷视频 | 日韩精品无码一区二区三区 | 欧美高清v | 美女扒开内看个够网站 | 91动态图 | k8yy毛片 | a v视频在线观看 | 成a人片亚洲日本久久 | 欧美性极品 | 人妻久久久一区二区三区 | 操操色| 成人午夜在线视频 | 中文字幕高清在线观看 | 国产精选第一页 | 欧美毛片基地 | 交hdsexvideos娇小 | 久久精品网 | 夜色综合 | 一区二区成人免费视频 | 欧美做爰猛烈床戏大尺度 | 狂野欧美 | 男人靠女人免费视频网站 | 无码人妻丰满熟妇啪啪网站 | 丁香综合 | 成人欧美日韩 | 日本伦理一区 | 开心激情播播网 | www四虎精品视频免费网站 | 娇妻玩4p被三个男人伺候电影 | 欧美性猛交xxxx乱大交俱乐部 | 91在线视频导航 | 中文字幕人妻伦伦 | 娇妻之欲海泛舟无弹窗笔趣阁 | 天天天天天干 | 亚洲欧美在线免费 | 久久久久久久久久久久久久久久久 | 日韩av在线播放观看 | 五月婷婷深深爱 | 精品人妻aV中文字幕乱码色欲 | 国产日韩在线免费观看 | 乱子伦一区二区三区 |