關於Sql server 2005的子查詢、
2009-10-26 10:44 北冥有魚,其名為坤、 阅读(244) 评论(0) 编辑 收藏 举报本文對Northwind數據庫操作、
1、標量子查詢。
只有標量子查詢,返回的是單個記錄或者不返回,就是有效的子查詢.
2、獨立子查詢。
Ex1:返回每個美國員工至少為其處理過訂單的所有客戶。
--思路: 子查詢得到所有被美國員工處理過訂單的客戶,對Customer客戶分組且Employee不同員工數等於搜有美國員工數.
Code
Ex2:返回在每月最後实际订单日期发生的订单
-- 思路:子查詢按月分组得到每月最近的单日期。
Select OrderID,CustomerID,EmployeeID,OrderDate from Orders where OrderDate in
(Select Max(OrderDate) From Orders Group by Convert(char(6),OrderDate,112))
--112表示YYYYMMDD char(6)表示提取YYYYMM
(Select Max(OrderDate) From Orders Group by Convert(char(6),OrderDate,112))
--112表示YYYYMMDD char(6)表示提取YYYYMM
3、相關子查詢、
引用外部查詢列的子查詢。邏輯上講,子查詢會為外部查詢的每行計算一次、
Ex3:查詢每個員工最近日期的最近一個訂單、
--思路:兩個子查詢(無先後記錄)
Code
4、Exists()、
輸入是一個查詢,是否產生行,返回true或false,不返回Unknown。查詢中帶*不是一個好習慣,但Exists語句中可以適應,
它只關心返回行,優化器忽略查詢中的料表.
Ex4:返回來自spain且發生過訂單的Customer.
Code
NotExists與Not in的區別(區別不大,產生相同執行計畫)|
Not in(當存在null的時候)是不返回記錄的,所以要去掉null的情況,將和Not exists產生相同查詢結果.
但Not in查詢計畫會關心列為null的情況,所以Not exists性能更好點、
Select CustomerID,CompanyName From Customers AS c
Where Country=N'Spain' And CustomerID
NOt In(Select CustomerID From Orders where CustomerID is not Null )
Where Country=N'Spain' And CustomerID
NOt In(Select CustomerID From Orders where CustomerID is not Null )