新聞中心
在數據庫設計與管理中,WHERE子句無疑是大家用的最頻繁的一個子句之一。那么大家是否真的擅長這個子句的使用呢?我看不見的的吧。筆者的下面這些建議就可以幫助大家來充分使用WHERE子句的功能,發(fā)揮其強大的作用。

建議一:查詢條件中包含撇號怎么處理?
數據庫的某些列中,可能會包含一些特殊的符號,如撇號(‘)。這對于SQLServer數據庫來說是一個特殊的符號。因為其原本是用來區(qū)分字符與變量的。如在查詢語句中,如果輸入的是字符串的值,就需要利用兩個撇號引用起來。(有時候撇號大家又叫做單引號)。但是在有些情況下,特別是國外人的名字中,本身就包含著單引號。如某個產品的規(guī)格信息為“8’尖嘴鉗(07型)/ 碳鋼/ 熱處理/ 全拋光/ 鍍鎳鐵合金/ 橙色”。在這個規(guī)格信息中就有一個單引號。此時如果在WHERE查詢語句中需要查詢這個規(guī)格信息,那么這個單引號還如何處理呢?數據庫管理員如果按如下的格式來輸入查詢語句(WHERE Description like ‘8’尖嘴鉗’),能夠查詢到所需要的結果呢?答案是否定的。因為此時數據庫系統(tǒng)因為這個查詢語句中有三個單引號分割符號,為此數據庫優(yōu)化器在編譯優(yōu)化這條語句的時候,無法識別輸入的條件語句的含義。
為此數據庫管理員在設計查詢語句的時候,就需要預計到這種情況,并在編寫語句的時候采取措施來避免這種錯誤。如果要在查詢條件中包含單引號的這個特殊符號也未嘗不可。在SQLServer數據庫中,如果需要查找的數據包含一個單引號時,則可以輸入兩個單引號來標明這個單引號是文本值而非分隔符。其實,這個單引號就好像程序開發(fā)語言中的轉移字符,能夠把系統(tǒng)中的一些特殊符號轉換成文本符號。不過由于轉義字符的使用或多或少會影響數據庫的執(zhí)行性能,為此在查詢的時候還是要盡量避免在查詢條件語句中包含單引號。數據管理員在設計SQL查詢語句中,應該有意識的限制這種行為,而不是支持。只有在用戶確實有這方面需求的情況下,才能夠使用轉移字符來告訴數據庫把單引號當作字符數據來處理。
建議二:數值作為查詢條件的注意事項。
如果把數值作為查詢條件時,其不用單引號括起來,在數字中間也不會出現單引號等分隔符。那么照理來說數值作為查詢參數是最容易的事情了。其實不然。很多數據庫管理員可能不熟悉一些基本的規(guī)則,為此在使用數值作為查詢條件的時候,還是會遇到磕磕碰碰的事情。
如把數值作為查詢條件的話,則在數值中可以加入小數點。默認情況下,小數點位一個小黑點,如12.5。但是并不是在所有操作系統(tǒng)中都是以這個點好作為小數點的分隔點。如筆者一次在給客戶進行數據庫維護時,在客戶的電腦上使用sql語句來查詢記錄,就是把參數值輸入為12.5。但是怎么執(zhí)行數據庫都提示這條SQL語句有錯誤。筆者核對了好幾次,就是發(fā)現這個問題。但是在筆者自己的筆記本電腦上,把這條SQL語句一模一樣的照寫了一遍,執(zhí)行起來的時候就沒有發(fā)生任何錯誤。這到底是怎么回事呢?原來小數點的分隔符默認情況下是采用小黑點,但是并不是所有操作系統(tǒng)這支持這個。小數點的分隔符用戶可以進行自定義。如在Windows操作系統(tǒng)控制面便的區(qū)域設置中,可以根據用戶的使用習慣來定義小數點的分隔符。當在書寫查詢條件的過程中如果使用到小數點的話,那么就需要跟這個區(qū)域設置中的設置相符。如果在這個區(qū)域設置中是采用冒號來作為小數的分隔符號的,那么在查詢語句中也需要利用冒號來作為小數點的分隔符。在數據庫編譯的時候,會自動把這個冒號轉換為二進制數據。為此,在有些教科書上,把小數點的分隔符好定義為小黑點筆者人為這是不科學的,會對讀者產生誤導。筆者認為,應該這么寫:如果把數值作為查詢條件的,則除了小數點分隔符和負號之外,不能夠包含非數字字符。如果為了讓讀者更加明白的話,則在后面可以加一句注釋,這里的小數點分隔符默認情況下是小黑點符號,但是可以在控制面中中的區(qū)域設置對方框內進行重新定義。
另外在使用數值型數據作為查詢條件時,需要注意如果輸入的是正數,那么無論搜索的是整數還是實數,都可以包含小數點標記。也就是說,12.與12是等價的(這里假設小數點分隔符為.號)。而且在SQLServer數據庫中,還可以利用科學計數法來作為查詢條件。要知道利用科學計數法來表示非常大或者非常小的數字,非常有用。數據庫能夠支持科學計數法作為查詢條件,則對于一些小數或者大數的查詢非常的有用。
建議三:要注意邏輯值的表示方法。
在SQLServer數據庫中,邏輯值的應用也是很普遍的。如在員工信息表中,往往把員工的性別利用邏輯值來表示。如員工如果是男性的話,則利用True來表示。如果員工是女性的話,則利用false來表示。再如如果某個員工離職了,為了后續(xù)查詢往往不會把這個員工信息刪除,而是采用另外一種管理機制來進行管理。如會在這個員工信息表中創(chuàng)建一個isactive等類似的布爾型字段。如果這個員工信息是有效的,則其值就為True;如果這個員工信息因為離職等原因已經實現了,則其就為Faluse。
但是數據庫管理需要注意這個邏輯數據的格式會因數據庫的不同而不同。如在SQLServer中,如果邏輯值為False的話,則在數據庫存儲為0;如果邏輯值為True的話,則其通常存儲的值為1。不過不同的數據庫這個對應的值可能不同,如有的數據庫利用-1來表示邏輯值False等等。為此在編寫SQL語句的時候,數據庫管理員需要注意這方面的差異,要防止張冠李戴的情況發(fā)生。
另外需要注意的是,在開發(fā)應用程序的時候,其往往不會利用數字0或者1來表示羅機值。如在C語言中直接以TRUE或者FALSE來表示布爾值。為此數據庫開發(fā)人員在開發(fā)應用系統(tǒng)的時候,需要注意這些表示方式上的差異。在必要的時候,需要通過別名等表達方式來進行相關的轉換。如用戶在生成報表時,如果利用1或者0數字來表示邏輯值的話,可能用戶并不一定看的懂。此時就需要在數據庫查詢的時候,進行一些轉換處理。如可以利用CASE語句來判斷并利用別名進行轉換。這也是數據庫設計過程中對邏輯值進行處理的最常見的方法。
建議四:當心日期數據的處理。
日期型的數據在數據庫中使最特殊也是最復雜的一類數據類型。其看起來像是字符型的數據,但是其操作起來要比數據型的字符負責的多。要掌握在WHERE語句中如果利用日期型的數據作為查詢條件,則數據庫管理員首先需要明白其日期的表示格式。因為不同類型的表示格式其所代表的含義是不同的。
首先數據庫管理員需要注意,在SQLServer與Windows操作系統(tǒng)的環(huán)境下,其日期格式可以在多個地方進行設置。如區(qū)域設置特定、數據庫特定、ANSI標準等三個方面。在數據庫部署的時候,***把這三個地方的日期格式設置為一致,否則的話,在后續(xù)操作的時候會遇到很多不必要的麻煩。如區(qū)域設置處設置的日期格式與數據庫特定的日期格式不一致的話,則在利用日期型數據進行查詢的時候,很容易因為日期格式不兼容而導致語法編譯錯誤。
其次需要注意的是,在SQL Server數據庫中有兩個地方可以生成SQL語句。一是在數據提供的窗口中生成SQL語句;二是直接編寫SQL語句。如果在其提供的查詢窗口中生成SQL語句的話,則在日期型的字段中輸入日期數據的話,則數據庫在生成SQL查詢語句的過程中,會自動對日期型的數據進行轉換,以符合于數據庫兼容的日期格式。也就是說,在查詢窗口輸入日期型數據查詢條件,一般不會出現問題。但是如果是在應用程序中直接編寫SQL語句,則此時需要注意,其輸入的日期要符合數據庫特定的格式或者ANSI標準的格式。而不是在區(qū)域設置處設定的格式。
第三,那么查詢返回的結果會以什么格式顯示呢?是按照區(qū)域設置特定的格式、還是數據庫特定的格式或者ANSI標準日期格式顯示呢?這里要注意,其顯示的時候是以操作系統(tǒng)中區(qū)域設置處設置的日期格式來顯示。而不是數據庫中設置的日期格式來顯示。為此在同一個數據庫中,不同的客戶端其日期顯示格式就有可能不同。這主要是因為客戶端上面的區(qū)域設置中的日期格式設置不同而造成的。
【編輯推薦】
- 數據庫開發(fā)管理中的十條建議
- 深入淺出SQL嵌套SELECT語句
- 詳解MySQL分組查詢Group By實現原理
本文名稱:WHERE語句中設置搜索值的一些建議
網站地址:http://fisionsoft.com.cn/article/cdohpjo.html


咨詢
建站咨詢
