T-SQL 第一章

   在sql Server中负责生成实际工作计划的组件是查询优化器,
   以何种顺序访问表,使用那种方式访问和那个索引,应用那种连接计算都是由优化器来决定的。
   优化器生产多个有效执行计划,并选择其中成本最低的执行计划。
  
   优化器经常在它生成物理计划的时候走捷径,当然必须保证结果正确

逻辑查询处理的各个阶段
    sql不同于其他的编程语言的最明显的特征是处理代码的顺序。在大多数编程语言中,代码是按顺序被处理的。但在生气了中被处理的第一个是from子句。

第一章
 

   set nocount on;
use tempdb;
go
if OBJECT_ID('dbo.orders') is not null
  drop table dbo.Orders;
go
if OBJECT_ID ('dbo.Customers') is not null
  drop table dbo.Customers;
go
CREATE TABLE dbo.Customers
(
  customerid char(5) not null primary key,
  city varchar(10) not null
);
insert into dbo.Customers(customerid,city) values('FISSA','MADRID');
insert into dbo.Customers(customerid,city) values('FRNDO','MADRID');
insert into dbo.Customers(customerid,city) values('KRLOS','MADRID');
insert into dbo.Customers(customerid,city) values('MRPHS','Zion');
CREATE TABLE dbo.Orders
(
 orderid int not null PRIMARY KEY,
 customerid CHAR(5) NULL REFERENCES Customers(customerid)
);
insert into dbo.Orders(orderid,customerid) values(1,'FRNDO');
insert into dbo.Orders(orderid,customerid) values(2,'FRNDO');
insert into dbo.Orders(orderid,customerid) values(3,'KRLOS');
insert into dbo.Orders(orderid,customerid) values(4,'KRLOS');
insert into dbo.Orders(orderid,customerid) values(5,'KRLOS');
insert into dbo.Orders(orderid,customerid) values(6,'MRPHS');
insert into dbo.Orders(orderid,customerid) values(7,NULL);

逻辑查询详解
1   执行笛卡尔乘积(交叉连接)
  对于fromset nocount on;
use tempdb;
go
if OBJECT_ID('dbo.orders') is not null
  drop table dbo.Orders;
go
if OBJECT_ID ('dbo.Customers') is not null
  drop table dbo.Customers;
go
CREATE TABLE dbo.Customers
(
  customerid char(5) not null primary key,
  city varchar(10) not null
);
insert into dbo.Customers(customerid,city) values('FISSA','MADRID');
insert into dbo.Customers(customerid,city) values('FRNDO','MADRID');
insert into dbo.Customers(customerid,city) values('KRLOS','MADRID');
insert into dbo.Customers(customerid,city) values('MRPHS','Zion');
CREATE TABLE dbo.Orders
(
 orderid int not null PRIMARY KEY,
 customerid CHAR(5) NULL REFERENCES Customers(customerid)
);
insert into dbo.Orders(orderid,customerid) values(1,'FRNDO');
insert into dbo.Orders(orderid,customerid) values(2,'FRNDO');
insert into dbo.Orders(orderid,customerid) values(3,'KRLOS');
insert into dbo.Orders(orderid,customerid) values(4,'KRLOS');
insert into dbo.Orders(orderid,customerid) values(5,'KRLOS');
insert into dbo.Orders(orderid,customerid) values(6,'MRPHS');
insert into dbo.Orders(orderid,customerid) values(7,NULL);

列出sql查询出来自Madrid 且订单数少于3(包括0个订单)的消费者,并包含他们的订单数。查询结果按订单数排序,重小到大

select c.customerid, count(o.orderid) as numorders
from dbo.Customers as c
 LEFT OUTER JOIN dbo.Orders as o
on C.customerid = o.customerid
where c.city = 'Madrid'
Group by c.customerid
HAVING COUNT(O.orderid) < 3
order by numorders;

逻辑查询处理详解

1  执行笛卡尔乘积(交叉连接)

  对from字句的前两个表执行笛卡尔(交叉连接或未限定连接), 生成虚拟表VT1,

步处 1执行代码

from dbo.Customers as c
 LEFT OUTER JOIN dbo.Orders as o
on C.customerid = o.customerid

 

2 应用ON帅选

只有使连接条件为true的那些行才会包含在2返回的虚拟表VT2中

三值逻辑

在sql中的逻辑表达式的值可能包括TRUE FALSE UNKNOWN  他们被成为三值逻辑。是sql所特有的

sql中unknown逻辑值通常出现在包含null值的逻辑表达式中如 null > 42 .

否定的unknown还是 unknown (not unknown)

所有帅选器都吧unknown当作false来处理

check约束中unknown的值被当作true来处理

假设表中包含一个check约束,要求salary列的值必须大于0.向该列插入null的行时可以被接受。因为null > 0 等于unknown在check约束中被当作true一样

。UNIQUE约束,排序操作和分组操作认为两个null是相等的

如果表中有一列定义了unique约束 将无法向表中插入该列值为null的两行

group by 字句把所有的null值分在一组

order by 把所有的null值排列在一起

为事例查询应用2

on c.customerid = o.customerid

只有连接条件为true的行才会插入到vt2中

添加外部行

 与外部连接有关。通过指定一种外部连接 left。 right。full  可以把一个或者两个输入表标记为保留表。 把一个表标记为保留表表示你希望返回该表的所有行。左外部连接 把左表标记为保留表

DISTINCT 子句
  如果在在查询中指定啦DISTINCT子句,将从上一步返回的虚拟表中移除重复行,并生产虚拟表VT9
  如果使用啦group by 在使用DISTINCT是多余的,因为不会移除任何行。
步骤10  应用ORDER BY
  按ORDER BY 子句中的列 列表排序上一步返回的行,返回游标VC10.
这是第一步也是唯一一步可以使用select列表中的列的别名的步骤。
你可以按最后结果集中不存在的表达式排序。
ANSI SQL 1999 规定 如果指定了DISTINCT ORDER BY 子句中的表达式只能访问上一步返回的虚拟表。
建议少用DISTINCT

这一步不返回表而是返回游标 ,他的结果不能返回给表达式,只能返回给拥有方
如下面的查询无效
select  *
from (select orderid,customerid
   from dbo.orders order by orderid) as D;
在sql中 表达式中不允许使用代有ORDER BY 子句 而在T-sql中却是可以的
  所以要记住不要为表中的行建设任何特定的顺序,换句话说除非你确实需要有排序,否则不要指定ORDER BY. 排序是需要成本的 sql server需要执行有序索引扫描或使用排序运算符号
 order by 这一步认为两个null是相等的。

11 top选项
top 选项允许你指定要返回的行的数量

 这一步根据行的屋里顺序确定那些行属于被优先请求的。如果在子句中指定啦 ORDER BY 结果是确定的。

posted on 2012-05-23 00:44  361741352  阅读(169)  评论(0)    收藏  举报

导航