一、ITERATOR(迭代)
這種模式提供一種在相似對象列表中遍歷對象的標准化方法。在SQL Server數據庫中的同義詞是游標。
DECLARE tables CURSOR
FOR select TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
FOR READ ONLY
DECLARE @table varchar(40)
OPEN tables
FETCH tables INTO @table
WHILE (@@FETCH_STATUS = 0)
BEGIN
exec sp_help @table
FETCH tables INTO @table
END
CLOSE tables
DEALLOCATE tables
注:游標的清理代碼:在CLOSE後緊跟DEALLOCATE,實際上可以只運行DEALLOCATE,並且游標也能自動關閉。但這不是最自然,也不是最常見的方法。大家可以理解為:CLOSE抵消OPEN,DEALLOCATE與DECLARE則相反,這樣可以使代碼保持對稱並且合乎邏輯。
二、INTERSECTOR(交集)
這種模式是表示集合交集的一種模板。
1、推薦方法:
select c.companyname,o.orderid
FROM customer c INNER join orders o ON c.customerid = o.customerid
2、舊式語法(不推薦使用)
select c.companyname,o.orderid
FROM customer c ,orders o
where c.customerid = o.customerid
注:實現集合交集還有許多變種方法。但是慣例方法就是方法1,方法2在實現左(右)聯接時,條件的表示及結果都可能出現問題,SQL SERVER的後續版本將會取消此種聯接方式。
三、QUALIFIER(限定)
限定數據等價於篩選查詢所返回的行數。
1、常用法:where子句限定
select city,count(*) AS NumberCity
FROM customers
where city like ’A%’
GROUP BY city
2、不自然的篩選:HAVING子句限定
select city,count(*) AS NumberCity
FROM customers
GROUP BY city
HAVING city like ’A%’
注:HAVING子句的目的是在結果集被檢索出來後再篩選查詢。實際上,SQL SERVER內在地轉換HAVING子句為where子句(兩種方法查詢的執行計劃是相同的),如果SQL SERVER不執行此優化,則針對包含大量數據行的表,因需要在篩選前從表中檢索所有行,則性能方面可能會遭受重大損失。