SQL Server查询基础(1)

SQL查询在日常开发中必不可少的,SQL语句写的好坏,尤其重要。本系列先以基础入门。慢慢深入。

注:本系列以读书笔记形式记录。

SELECT语句的元素

SELECT语句的目的是对表进行查询、应用一定的逻辑处理,并返回结果。按照不同的查询条件或排序返回不同的结果。

“逻辑查询处理”是指ANSI SQL定义的概念模型,规定了如何处理一个查询,以及如何取得最终的结果。

Microsoft SQL Server引擎并没有严格遵守逻辑查询处理,相反,在物理地处理一个查询时,它可以自由地调整处理阶段的顺序,只要最终结果能够和逻辑查询处理规定保持一到致。SQL Server可以在查询的物理处理中采用很多快捷的方式。

为了更加直观的描述逻辑查询和各种SELECT查询子名。下面看一句SQL脚本。

示例脚本1-1:

Select empid,YEAR(orderdate)As orderyear,COUNT(*) As numorders
From Sales.Orders
Where custid=71 
Group By empid,YEAR(orderdate)
Having COUNT(*)>1
Order by empid,orderyear
介绍这个语句之前,首先介绍每个查询子名的逻辑处理顺序。
示例脚本1-2:
   1:  From
   2:  Where
   3:  Group by
   4:  Having
   5:  Select 
   6:  Order by

以上是SQL子句逻辑处理顺序。

注意:Order by是唯一一个在Select以后执行的逻辑子句。

现在分析上面的SQL脚本。

1.从Sales.Orders表中查询数据。

2.对订单进行过渡,只保留客户ID为71的记录。

3.按雇员的ID和订单年份对订单进行分组。

4.对分组数据(雇员ID和订单年份)进行过渡,只保留具有多个 订单的分组。

5.选择每个分组的雇员ID、订单年份,以及订单数量。

6.按照雇员ID和订单年份对输出结果进行排序。

我们不能按照逻辑顺序来编写SQL脚本,必须从SELECT开始写起。

FROM子句

From子名是在逻辑处理阶段第一个要处理的查询子句。它用于指定要查询的表名,以及对这些表进行操作的表运算符(暂时不介绍运算符)。

示例脚本1-1指定对Sales数据库架构中的Orders表进行查询。

捕获

WHERE子句

在Where子句中,可以指定一个条件或多个条件,过渡由From阶段返回的行,只有满足条件的才返回行。示例脚本1-1只保留ID为71的客户的订单。

Where子句对查询性能有重要影响。在过渡表达式的基础上,SQL Server会计算使用什么索引来访问请求的数据。与扫描整个表相对,通过使用索引,有时可以大幅减少SQL Server在获取请求的数据时付出的代价。

GROUP BY子句

Group by 可以净前面的逻辑查询处理返回的行按“组”进行组合。

示例脚本1-1是通过每个雇员ID及订单年份进行分组。

如果查询涉及到分组,那么Group  by阶段之后的所有阶段(包括Having、Select、Order by)的操作对象都是组,而不是单独的行。每个组最终也表示 为查询结果集中的一行。

如果查询涉及到分组,From前面的要显示的元素名必须要在Group by后面写出元素名名。但是如果使用聚合函数(Count、Sum、Avg、Min、Max)就不必写这些元素名。

HAVING子句

Having子句用于指定对组进行过滤的条件,这与Where阶段对单独的行进行过滤相对就。

因为Having子句是在对行进行分组后的处理。可以可以在逻辑表达中引用聚合函数。示例脚本1-1Having子句中使用了逻辑表达式Count(*)>1,意味着Having只保留多行的组。

SELECT子句

Select子句用于指定需要在查询返回结果中包含的列。Select列表中的表达式可以直接基于正在查询的各个列,也可以在此基础上进一步的处理。示例脚本1-1empid,YEAR(orderdate)As orderyear。别名除了使用As以外,T-Sql还支持<别名>=<表达式>和<表达式> 中间是空格<别名>。

就是因为这样别名定义方式不同,就有这么个情况,如果在Select列表中的两个列名之间忘记指定一个逗号,执行起来也不会失败。相反,Sql Server会认为第二个是第一个列名的别名。示例:

Select Orderid Custid From Sales.OrderValues

查询出来的结果是Orderid ,但是名字确是Custid 。以后写SQL语句一定要仔细,这个错误很难查出来。

Select子句是在From、Where、Group by、Having子句后处理的。

ORDER BY子句

Order by子句用手 展示数据时对输出的数据进行排序。从逻辑查询处理来看,Order by是最后一个的一个子句。

如果不指定Order by子句,查询结果的顺序是自由排序的。可以显示的指定查询结果排序Order by 元素名 Desc或Order by 元素名 ASC(Asc是升序、Desc是降序)

posted @ 2011-05-20 16:10  TC-MrLee  阅读(584)  评论(1编辑  收藏  举报