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’

开篇就写到这吧,第一次写博客很多排版的地方不是很好,如果大家在这个系列中有什么更好的语句或者我有讲的有误的地方希望大家不要吝啬您的意见,我会关注您的评论,并改正。

posted @ 2012-06-21 15:23  用未来思考现在  Views(2290)  Comments(18Edit  收藏  举报