SQL支持一种所谓的同时操作的概念,其含义是认为在同一逻辑查询处理阶段中出现的所有表达式都是同时进行计算的。  例如,这个概念就可以解释为什么不能在SELECT子句中引用为同一SELECT子句中的列分配的别名,即使直觉上看起来应该能够这么做。考虑以下查询:[代码]  以上SELECT列表中第三个表达式对orderyear这一列名的引用是无效的,即使引用表达式位于这个别名的定义“之后”。因为从逻辑上来说,SELECT列表中各表达式的计算是没有顺序的——它们只是一组表达式。在逻辑上SELECT列表中的所有表达式都是在同一时刻进行计算的。因此该查询会生成以下输出:[代码]  再举一个与同时操作有关的 Read More
posted @ 2010-12-18 20:11 宁静月光 Views(276) Comments(0) Diggs(0) Edit
SQL支持用NULL符号来表示缺少的值,它使用的是三值谓词逻辑,这意味着谓词的计算结果可以是TRUE、FALSE或UNKNOWN(未知)。  T-SQL在这方面遵循了标准。在SQL中处理NULL和UNKNOWN可能非常容易让人困惑,因为人们在直觉上更习惯于用二值逻辑(TRUE、FALSE)来进行思考。更为添乱的是,SQL中不同语言元素处理NULL和UNKNOWN的方式也有所不同。我们先从三值谓词逻辑说起。如果逻辑表达式只涉及已经存在的值,那么最终的计算结果要么为TRUE,要么为FALSE;但是当逻辑表达式涉及缺少的值时,其计算结果就是UNKNOWN。例如,考虑谓词salary 0;当sal Read More
posted @ 2010-12-18 19:21 宁静月光 Views(379) Comments(0) Diggs(0) Edit
CASE表达式是一个标量表达式,它基于条件逻辑来返回一个值。注意,CASE是一个表达式,而不是一条语句;也就是会所,不能用它来控制活动的流程,也不能根据条件逻辑来做某些处理。相反,它只是根据条件逻辑来返回某个值。因为CASE是一个标量表达式,所以它可以支持任何标量表达式(如SELECT、WHERE、HAVING,以及ORDER BY子句)、CHECK约束,等等。  CASE表达式有两种格式:简单表达式和搜索表达式。CASE简单格式将一个值(或一个标量表达式)与一组可能的取值进行比较,并返回第一个匹配的结果。如果列表中没有值等于测试值,CASE表达式就返回其ELSE子句(如果存在)中列出的值。如 Read More
posted @ 2010-12-18 17:50 宁静月光 Views(619) Comments(0) Diggs(0) Edit
T-SQL有几种不同的语言元素可以指定逻辑表达式,例如,查询过滤器(WHERE和HAVING)、CHECK约束,等等。在逻辑表达式中可以使用各种谓词(取值为TRUE、FALSE或UNKNOWN的表达式)和运算符。  T-SQL支持的谓词包括IN、BETWEEN,以及LIKE等。IN这个谓词用于检查一个值(或标量表达式)是否与一组元素中的至少一个相等。例如,以下查询返回订单ID等于10248、或10249、或10250的订单:[代码]  BETWEEN这个谓词用于检查一个值是否在指定的范围内,包括两个指定的边界值。例如,以下查询返回订单ID在10300到10310之间的所有订单:[代码]  LI Read More
posted @ 2010-12-18 16:57 宁静月光 Views(487) Comments(0) Diggs(0) Edit
OVER子句用于为行为定义一个窗口(windows),以便进行特定的运算。可以把行的窗口简单地认为是运算将要操作的一个行的集合。例如,聚合函数和排名函数都是可以支持OVER子句的运算类型。由于OVER子句为这些函数提供了一个行的窗口,所以这些函数也称之为开窗函数。  聚合函数的要点就是要对一组值进行聚合,聚合函数传统上一直以GROUP BY查询作为操作的上下文。在前面的“GROUP BY”子句的讨论中,我们知道在对数据进行分组以后,查询为每个组只返回一行;因此,也就是要限制所有的表达式为每个组只能返回一个值。  聚合开窗函数使用OVER子句提供窗口作为上下文,对窗口中的一组值进行操作,而不是使 Read More
posted @ 2010-12-18 16:10 宁静月光 Views(2905) Comments(0) Diggs(2) Edit
TOP选项是T-SQL特有的,用于限制查询返回的行数或百分比。当在查询中指定了ORDER BY子句时,TOP将依赖该子句来定义行和逻辑优先顺序。例如,如果要从Orders表返回最近的5个订单,则可以在SELECT子句中指定TOP(5),并在ORDER BY子句中指定orderdate DESC,如以下代码:[代码]  从逻辑查询处理的角度来看,TOP选项是作为SELECT阶段的一部分而处理的,紧接着DISTINCT子句处理之后(如果存在DISTINCT)。注意,当在查询中指定了TOP以后,ORDER BY子句就会起到双重作用。首先,作为SELECT处理阶段一部分的TOP选项要依靠ORDER B Read More
posted @ 2010-12-14 01:10 宁静月光 Views(425) Comments(0) Diggs(0) Edit
ORDER BY子句用于展示数据时对输出结果中的行进行排序。从逻辑查询处理来看,ORDER BY是最后处理的一个子句。下面的代码按照雇员ID和订单年份对输出结果进行排序:[代码]  理解SQL最重要的一点就是要明白表不保证是有序的,因为表是为了代表一个集合(如果有重复项,则是多集),而集合是无序的。这意味着,如果在查询表时不指定一个ORDER BY子句,那么虽然查询可以返回一个结果表,但SQL Server可以自由地按任意顺序对结果中的行进行排序。为了确保结果中的行按照一定的顺序进行排序,唯一的方法就是显示地指定一个ORDER BY子句。不过,如果指定了ORDER BY子句,查询结果将不符合表 Read More
posted @ 2010-12-14 00:07 宁静月光 Views(516) Comments(0) Diggs(0) Edit
SELECT子句用于指定需要在查询返回的结果集中包含的属性(列)。SELECT列表中的表达式可以直接基于正在查询的表的各个列,也可以在此基础上做进一步的处理。例如,在前面的代码中的SELECT列表就包含以下表达式:empid、YEAR(orderdate)、COUNT(*)。如果表达式直接引用了某个列(如empid),那么目标列的名称默认与原始列的名称一样。也可以选择为目标列分配自定义的名称,为此要使用AS子句(例如,empid AS employee_id)。当在表达式中进行了一定的处理(例如,YEAR(orderdate)),或者没有基于原始表的列(如调用CURRENT_TIMESTAMP Read More
posted @ 2010-12-13 23:38 宁静月光 Views(880) Comments(0) Diggs(0) Edit
HAVING子句用于指定对组进行过滤的谓词或逻辑表达式,这与WHERE阶段对单独的行进行过滤相对应。只有能让HAVING子句中的逻辑表达式为TRUE的组,HAVING阶段才会把这些组返回到下一个逻辑查询处理阶段。逻辑表达式计算结果为FALSE或UNKNOWN的组将被过滤掉。  因为HAVING子句是在对行进行分组后处理的,所以可以在逻辑表达式中引用聚合函数。例如,在下面所示的代码中,HAVING子句使用了逻辑表达式COUNT(*)1,意味着HAVING阶段过滤器只保留包含多行的组(雇员和订单年份)。[代码]  前面提到GROUP BY阶段创建了16个雇员ID和订单年份组,其中有7个组只包含1 Read More
posted @ 2010-12-12 10:17 宁静月光 Views(596) Comments(0) Diggs(1) Edit
GROUP BY阶段可以将WHERE逻辑查询处理阶段返回的行按“组”进行组合。每个组由在GROUP BY子句中指定的各元素决定。例如,以下代码所示查询的GROUP BY子句就使用了empid和YEAR(orderdate)元素:[代码]  这意味着对于WHERE阶段返回的数据中出现的每个雇员ID和订单年份值的唯一组合,在GROUP BY阶段将会为其生成一个组。表达式YEAR(orderdate)会调用YEAR函数,只返回orderdate列的年份部分。  如果上面的代码没有GROUP BY子句,并且去掉COUNT(*) AS numorders字段,WHERE子句将返回31行数据,其中有16对 Read More
posted @ 2010-12-11 23:35 宁静月光 Views(711) Comments(0) Diggs(0) Edit