SQL SERVER 系列(1)那些我們錯過的細節


從去年開始用Oracle(注:本人使用的是9i)后很久沒有用SQL SERVER 2008 SQL 了,昨天打開SQL SERVER 2008編輯器,不由想起了曾經教我怎么寫出性能更高的SQL 和 教我寫 第一個Jquery插件的兄弟,在此由衷的感謝 : “Ben(小強)(沒有他也許我現在還是超級菜鳥,現在他還是很年輕的構架師哦),第二個要感謝的人是 ”萬哥” (第一個教我寫Jquery插件,小強就是萬哥培養出來的哦,元老級,呵呵)。為了在使用Oracle的同時,不讓自己SQL  SERVER 退步,雖然Oracle SQL SERVER 語句大部份語句有相同之處,當使用Oracle 后發現SQL SERVER 有些特性比Oracle 方便不少.例如SQL SERVER 行轉列 “PIVOT” 語句 列轉行 “UNPIVOT” 語句 比 Oracle 的 行轉列 ,列轉行 要方便的多。所以為了加深對數據庫知識,同時也為了自己不偷懶准備寫SQL一套系列。系列中的SQL語句大部門來自項目通常遇到的問題怎么用更好的SQL去解決,同時也會講解SQL SERVER 2008新增的一些特性。

最近又一次仔細看了一遍SQLSERVER,發現了很多細節以前沒注意到,確實很多經常我們使用的東西,很多時候一些基礎的東西我們會忽略掉,有時候有些很基礎的東西是非常重要的。例如:簡單的Select語句中就有些我們經常忽視掉的東西

(1):對於剛寫SQL的人來說,很多人寫查詢的時候通常會寫 SELECT * FROM table_list,注:作為一個好習慣,顯示指定想要獲取的列要比SELECT * 更好,如果在應用程序中使用了SELECT *,那么程序希望從查詢中得到所有的列,如果之后要添加新列或刪除列,那么可能你就不能調用這個程序了,因為在結果集中是新列是不希望出現的。SELECT * 返回的數據可能比真正的需要的要多,這樣會增加結果集的大小和SQL SERVER 實例的數據檢索操作,所以它可能對性能造成負面影響。對於需要每秒幾千次事物來說,結果集返回的列數對性能的影響是不可低估的。

(2):當我們用Select 查詢中,where 子句用來限制查詢結果集返回的行。語句為:

SELECT select_list

FROM table_list

[where search_conditions]

Where 子句使用了搜索條件,它們確定了查詢返回的行,搜索條件使用了謂詞,它們計算結果為TRUE,FALSEUNKNOWN 的表達式。 在搜索條件中有NULL 數據時可能會出現UNKNOWN值,很多時候我們是否考慮過什么是NULL值:NULL值不同於空白或零值,只表示值未知,並且兩個NULL值並不相等。不產生UNKNOWN值的話是不能做比較的。

(3):AND , OR , NOT 優先級 有時候更具業務的要求WHERE  子句后面會用到AND,OR,NOT 當同時使用這三個語句時,我們需要括號來明確語句的意思。然而AND, OR,NOT 優先級是怎么樣的呢?NOT優先級最高,比AND高,AND運算符的優先級比OR運算符高,當在統一where   子句中同時使用 AND OR 運算時,如果不使用括號可能會導致意想不到的結果:SELECT  title,

        Firstname,

        Lastname

Where title=’yu’ and 

firstname=’wang’ or

lastname=’jin’

這段代碼是返回titleyu,  並且firstnamewanglastname jin的所以行嗎?或者是firstnamewangtitleyu,  或lastname jin 的所以行嗎? 所以我們要括號來明確條件:SELECT  title,

        Firstname,

        Lastname

Where ( title=’yu’ and 

firstname=’wang’ ) or

lastname=’jin’

開篇就寫到這吧,第一次寫博客很多排版的地方不是很好,如果大家在這個系列中有什么更好的語句或者我有講的有誤的地方希望大家不要吝嗇您的意見,我會關注您的評論,並改正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM