CSS入门经典-知识点摘录



Width属性的“收缩”和“扩展”适应

所有带width属性的元素都有一个默认的auto值,但在使用auto宽度时并不是所有元素都具有相同的效果。例如,<table>元素只是水平扩展以容纳其中的数据,这种方法称为“收缩适应”。另一方面,<div>元素则尽可能水平扩展其宽度,这种方法称为“扩展适应”。

Read More

EXISTS与IN的比较



Exists

根据子查询是否返回行,该谓词返回truefalse,不同于其他谓词和逻辑表达式,无论输入子查询是否返回行,Exists都不会返回unknown。如果子查询的筛选器为某一行返回unknown,则该行不返回。在筛选器中,unknown被认为类似于false,换句话说,当输入子查询包含一个筛选器时,只要该筛选器至少为一行得到true,则Exists将返回true

 

Exists谓词的子查询中,Exists只关心行是否存在,不关心特定属性,优化器将忽略子查询中的select列表。

 

在SQL SERVER 2000之前的版本,两者其实是有区别的,优化器会为他们生成不同的执行计划,而且EXISTS的性能更好,因为它具有短路功能.在SQL SERVER 2000及之后的版本,优化器通常会为两逻辑等价的查询生成相同的计划.

Read More

Math.Round()——面试题小结



今天面试,碰到一道题,关于Math.Round();也许做应用做久了,脑子不怎么转了,呵呵。

之前竟然没用过这个方法,可能看到过,忘了。。。。。一时想不起来,只猜是四舍五入的,后来还是做错了。

Read More

SQLServer如何处理到达数据库引擎的查询





当一个查询到达数据库引擎时,SQL SERVER执行两个主要的步骤来产生期望的查询结果。第一步是查询编译,它生成查询计划,第二步执行这个查询计划。

 

SQL SERVER 2005中的查询编译由三个步骤组成:分析、代数化查询优化。完成这些步骤后,编译器把经过优化的查询计划保存到过程缓存中。在这里,执行引擎把该计划转换为可执行的形式,然后执行其中的步骤以生成查询结果。如果今后再次执行相同的查询或存储过程时,过程缓存已经包含了该计划,则跳过编译步骤,直接重用缓存的计划来执行该查询或存储过程。

 

关于SQL Server**的优化

SQL SERVER并不优化批处理中的每条语句。只优化那些访问表而且可能生成多个执行计划的语句。SQL SERVER优化所有DML(数据操作语言)语句,即SELECT DELECTUPDATE语句。除了DML,其他一些T-SQL语句也会被优化,CREATE INDEX便是其中之一,只有被优化过的语句才会生成查询计划。

 

关于SQL**中的分组

GROUP BYHAVING之类显式子句并不是使SELECT列表被分组的唯一因素。根据SQL的规定,只要出现绑定到特定列表的聚合函数,即使没有GROUP BYHAVING子句,也会使SELECT列表分组。下面是一个简单的示例:

SELECT c1,MAX(c2) FROM dbo.T1;

这是一个分组SELECT因为查询中包含了一个MAX聚合。又因为它是一个分组SELECT,在其中使用非聚集的列c1是不合法的,所以该查询不正确。



版权声明:本文为博主原创文章,未经博主允许不得转载。


SQLServer同时操作(all-in-once)特性



Select列表中创建的别名不能在Select子句之前执行的子句中使用。实际上,表达式别名甚至不能用于Select列表的其他表达式。该限制是由于SQL的另一个独有的特性,即同时操作(all-at-once operation)。例如,在下面这个Select列表中,计算表达式的逻辑顺序无关紧要,而且具有不确定性

Select c1+1 As e1,c2+1 As e2.

因此,不支持下面这个表达式:

Select c1+1 As e1,e1+1 As e2.

你只能在Select列表后面的步骤(Order By步骤)中使用列的别名。

 

理解:同时操作(all-at-once operation)

我们在大多数编程环境下,交换两个变量的值,通常会使用一个临时变量:

//假设有两个已赋值的int型变量ab

int temp;

temp=a;   a=b; b=temp;

当然只是通常的做法,你也可以运用逻辑运算符:

a = a ^ b;

b = b ^ a;

a = b ^ a;

或者:b = a + (a = b) * 0;

但,在SQL中交换列值可以使用下面的语句:

Update dbo.T1 Set c1=c2,c2=c1;

你应该假设所有操作同时发生,而事实上,在更新完成之前并不会修改表(可以理解为更新过程中表中的记录被锁定),而在计算出所有结果之后替换了现有表中的源数据

所以,下面的更新语句:

Update dbo.T1 Set c1=c1+(Select Max(c1) From dbo.T1);

该更新将影响T1表中的所有行,为C1列加上更新开始时T1中的最大的c1值。此时可以认为更新开始后表中的记录被锁住,数据库在后台处理、计算数据。计算完所有数据之后,将一次性替换所有数据。所以你不用担心最大的c1值会随着操作进行而持续变化,可以理解为操作在瞬间发生了。



版权声明:本文为博主原创文章,未经博主允许不得转载。


SQLServer执行逻辑查询时,SQL被解析的步骤



以下这段对SQL Server执行逻辑查询时,SQL被解析的步骤。摘自《SQL Server 2005技术内幕 T-SQL查询》。这是一本非常好的讲解SQL Server的书,整个SQL Server 2005技术内幕系列都是,个人强烈推荐。

 

我一直认为,学好任何一种技术,没有什么比学好它的基础知识和底层原理更重要。如果你相信有“捷径”,那么这就是唯一的“捷径”。了解这些,有助于你更快地掌握技术最本质的核心。

我真希望早点看到那些好书,也希望看到这篇文章的你,能有点收获,多读好书,少走一些弯路。

 

他山之石可以攻玉!

 



以上步骤从1-11按顺序被执行,如果没有将跳过相应步骤;

以上每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表仅用于查询器内部使用,对调用者或外部查询不可用,只有最后一步生成的表才会返回给调用者。

 

逻辑查询处理阶段:

1.       From:对From子句中的前两个表(left_tableright_table)执行笛卡尔积[交叉联结],生成虚拟表VT1.

2.       On:VT1应用On筛选器,只有那些使<join_condition>为真的行才被插入VT2

3.       Outer(Join):如果指定了OUTER Join(相对于Cross JoinInner Join),保留表中未找到匹配的行将作为外部行添加到VT2,生成T3。如果From子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表为止。

4.       Where:对VT3应用WHERE筛选器,只有<where_condition>True的行才被插入VT4

5.       Group By:按Group By子句中的列列表对VT4中的行分组,生成VT5.

6.       CUBE|ROLLUP:把超组插入到VT5,生成VT6.

7.       Having:对VT6应用Having筛选器。只有<having_condition>true的组才会被插入VT7

8.       Select:处理select列表,产生VT8

9.       Distinct:将重复的行从VT8中移除,产生VT9.

10.   Order By:将VT9中的行按Order By子句中的列列表排序,生成一个游标(VT10)

11.   Top:从VC10的开始处选择指定数量或比例的行,生成表VT11,并返回给调用者。



版权声明:本文为博主原创文章,未经博主允许不得转载。