SQL Server 2005 技术内幕 TSQL查询学习笔记chapter1逻辑查询处理

逻辑查询处理的步骤序号

(8)SELECT (9)DISTINCT (11) <TOP_specification> <select_list>

(1)FROM <left_table>

(3)<join_type> JOIN <right_table>

(2)ON <join_condition>

(4)WHERE <where_condition>

(5)GROUP BY <group_by_list>

(6)WITH {cube|rollup}

(7)HAVING <having_condition>

(10)ORDER BY <order_by_list>

各个步骤分析(查询语句未涉及的步骤将跳过)

(1) FROM: From子句中的左右表(如果有2个表的话,甚至涉及多表查询)执行笛卡尔积(交叉联接),生成VT1(虚拟表1)

(2) ON:VT1应用ON筛选器,只有join_conditionTrue,才被插入VT2

(3) OUTER:涉及外部联接,保留表的数据(非保留表为NULL)插入VT2生成VT3

(4) Where:VT3执行Where筛选器,只有where_conditionTRUE,才被插入VT4

(5) GROUP BY:VT4分组,得到VT5

(6) 把超值插入VT5,生成VT6

(7) HAVING: VT6执行Having筛选器,只有Having_conditionTRUE,才被插入VT7

(8) SELECT:产生VT8

(9) DISTINCT: 删除重复行,产生VT9(不能和group by同用,既然都分组了,再用distinct就多余了)

(10)ORDER BY:排序,生成游标(VT10)

(11)TOP:生成VT11,返回结果表

SQL重要特性三值逻辑(True,False,Unknown)

1:NULL值通常表示丢失或不相关的值,当比较NULL值和另外的值(可能也是null),逻辑结果总是UNKNOWN.我们都知道 not true=false,not false=true,not unknown还是unknown!

2:筛选器(ON,HAVING,WHERE)UNKNOWN当作false处理.举个例子:2null进行比较,由于逻辑结果为unknown,所以在筛选器中一个null不等于另外的null.

3:CHECK约束将unknown当做true处理.举个例子:col1列约束值>0,当插入null值的时候,(null>0)这样的逻辑结果为unknown(前面黑色注明处已说明!),check将其当做true处理,所以可以插入null的值.

4:unique约束,group by子句,order by子句将null视为相等

理解同时操作

testdb的数据定义语言(DDL)和示例数据

use tempdb

if object_id('testdb') is not null

drop table testdb;

GO

create table testdb(

    c1 int,

    c2 int

)

insert into testdb(c1,c2) values(1,100);

insert into testdb(c1,c2) values(2,200);

insert into testdb(c1,c2) values(3,300);

在大多数编程语言中,交换2个数可能需要用到第三个数.对于下面的操作

update testdb set c1=c2,c2=c1

(已交换2列数据)

就好象同时操作,sql语句未完成前是不会修改表中数据的.

update testdb set c1=c1+(select max(c1) from testdb);

所以也不用担心,max(c1)会持续变化!

请使用浏览器的分享功能分享到微信等