T-SQL中的Select查詢(續2)

T-SQL中的Select查詢
現在來討論一下:WHERE條件。
Where條件對from子句產生的數據進行篩選,挑出那些要放到結果集中的記錄行。在這裏需要提到一點的是:一種提高客戶/服務器數據庫性能的有效途徑是:讓數據庫引擎來完成篩選數據的工作,而不要讓應用程序來過濾那些無用的數據。然而,如果數據庫的設計使得需要在where子句中使用函數來定位記錄行,這些函數就會嚴重的降低查詢的性能,因爲對每一行記錄都必須進行函數的計算。
還有一點就是:對於數據庫查找而言,證明一個記錄行滿足條件,要比消除每個不滿足條件的記錄行要快得多。所以,將否定的where條件改寫爲肯定的條件將會提高性能,這是一個必須記住的準則。
1.       使用Between查找條件
Between查找條件用於測試給定的值是否在一個指定的範圍之內,這個範圍是包含了條件中限定起止範圍的那兩個值在內的,但有些人可能未意識到這一點。
Between查找條件經常與日期在一起使用。下面的例子代碼就是用於查找在2006年5月期間所發生的全部活動:
SELECT Code, DateBegin
FROM dbo.Event
WHERE DateBegin BETWEEN ‘06/05/01’ AND ‘06/05/31’
2.       使用IN查找條件
IN查找條件類似於“=”比較運算符,它們的不同之處在於:IN查找條件是在一個列表中查找與給定值精確匹配的值。如果能夠在列表中找到給定的值,比較的結果就爲真。如:
SELECT BaseCampName
FROM dbo.BaseCamp
WHERE Region IN(‘NC’,’WV’)
實際上,IN查找條件等價於多個用“or”連接在一起的等值比較。即:
SELECT BaseCampName
FROM dbo.BaseCamp
WHERE Region=’NC’ OR
        Region=’WV’
IN運算符可以與NOT配合使用以排除特定的行。如:
SELECT BaseCampName
FROM dbo.BaseCamp
WHERE Region NOT IN(‘NC’,’SC’)
但是,證明否定條件的難度較大,尤其當涉及到空值的時候更是如此。因爲空值的含義是“未知”,所以,我們無法排除要查找的值包含在列表中的可能性。下面的例子代碼展示了當列表中包含空值的時候,是不可能證明‘A’不在這個列表中的:
SELECT ‘IN’ WHERE ‘A’ NOT IN(‘B’,NULL)
這個不會返回任何結果,因爲條件中的那個我們不知道的空值也許就是‘A’。也正是由於SQL不能在邏輯上證明‘A’不再這個列表中,where子句返回了假值。每當將not in條件與含有空值的列表在一起使用時,where條件對於每個記錄行的篩選結果都是假值。
3.       使用LIKE查找條件
LIKE查找條件使用通配符在字符串內查找指定的模式。如:
查找所有以“air”開頭的任意長度的字符串(air後面可以跟任意多個字符):
SELECT ProductName
FROM dbo.Product
WHERE ProductName LIKE ‘Air%’
查詢以a到d之間的字符(即a、b、c和d)打頭的任意長度的產品名稱:
SELECT ProductName
FROM Product
WHERE ProductName LIKE ‘[a-d]%’
要查找包含通配符的模式,可以使用兩種方法:①將要查找的通配符永方括號括起來,或者在它的前面加一個轉義符;②應當在like表達式內定義轉義符。如:
下面的兩個例子都是在product表中查找短語“F-15”。第一個查詢使用方括號括住了-(在正常情況下是一個通配符);而第二個查詢則使用&作爲轉義符:
   SELECT Code, ProductName
   FROM Product
   WHERE ProductName LIKE ‘%F[-]15%’
 
   SELECT Code,ProductName
   FROM Product
   WHERE ProductName LIKE ‘%F&-15%’ ESCAPE ‘&’
上述兩個查詢都會返回同樣的結果集。
警告:⑴在這兩種查找包含通配符的模式的方法中,使用方括號的方法是T-SQL專有的,它不符合ANSI的SQL標準。而轉義的方法則是符合SQL標準的,因而也是可以移植的。
               ⑵雖然like運算符非常有用,但它會對性能造成影響。在索引中,主要是利用索引列中數據的開頭部分(而不是中間的某些部分)來對索引的鍵值排序的。如果發現你的應用程序需要頻繁地使用like運算符,就應該啓用全文索引,這是一種功能強大的索引方法,它甚至考慮到單詞的加權值,以及它們的不同變體,並可以用表的形式來返回分級的結果集,以便於進行連接操作。
4.       使用多個WHERE條件
可以在where子句中使用布爾邏輯運算符:and、or和not將多個where條件組合爲一個複雜的where條件。其優先級順序是:and的最高,or次之,not的優先級最低。試比較:
     SELECT Code, ProductName
     FROM dbo.Product
     WHERE ProductName LIKE ‘Air%’ OR
            Code BETWEEN ‘1018’ AND ‘1020’ AND
            ProductName LIKE ‘%G%’
   執行結果: code                        ProductName
             --------------------------       -------------------------------------------------
             1009                             Air Writer 36
             1010                             Air Writer 48
             1011                             Air Writer 66
             1019                             Grand Daddy
             1020                             Black Ghost
     SELECT Code, ProductName
     FROM dbo.Product
     WHERE (ProductName LIKE ‘Air%’ OR
            Code BETWEEN ‘1018’ AND ‘1020’) AND
            ProductName LIKE ‘%G%’
      執行結果: code                        ProductName
             --------------------------       -------------------------------------------------
1019                                        Grand Daddy
1020                                        Black Ghost
雖然上面這兩個查詢非常的相似,但在第一個查詢中採用的是布爾運算符的正常優先級,這就決定了and要在or之前進行運算,正是or將Air Writes包含進了結果集中。第二個查詢使用括號明確的改變了布爾運算符的優先級順序。Or篩選出了Code爲1018、1019和1020的產品以及名字以Air打頭的產品(Air Writes)。然後,and運算符檢查這些產品名字中是否含有字母g。最後,只有Code爲1019和1020的產品能夠滿足以上的全部條件。
說明:在編寫複雜的布爾或者數學表達式時,使用括號或者詳盡的代碼來明確地指出你的意圖,將會減少由於必須猜測你的意圖而造成的誤解和錯誤。
5.       Select…Where
令人驚訝的是:在select語句中使用where子句時並非一定要有from子句,或者引用任何的表。沒有from子句的select語句只會返回一行記錄:
      SELECT ‘ABC’
執行結果:ABC
在沒有from子句的select語句中使用where子句,將對整個select語句加以限定。如果where條件爲真,就會如你所願地執行select語句:
   SELECT ‘ABC’ WHERE 1>0
執行結果:ABC
如果where條件爲假,將不會執行select語句:
   DECLARE @test NVARCHAR(15)
      SET @test=’z’
SELECT @test=’ABC’ WHERE 1<0
SELECT @test
執行結果:z
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章