SQL Server数据库培训——Select语句构成元素

上一篇 / 下一篇  2011-03-31 14:27:25 / 个人分类:数据库

1.            Select语句构成元素

1.1         Select *

避免使用select *51Testing软件测试网p oCi*Z]QC;]

当你想在SELECT子句中列出所有的COLUMN,使用动态SQL列引用*是一个方便的方法.不幸的是,这是一个非常低效的方法.实际上,SQL在解析的过程中,会将’*依次转换成所有的列名,这个工作是通过查询数据字典完成的,这意味着将耗费更多的时间.51Testing软件测试网0an+G1wc/lr;\9X

1.2         Select语句中元素的执行顺序

为了描述逻辑查询处理和各种SELECT查询子句,我们使用以下事例为大家介绍。51Testing软件测试网 v[w V^8Z q

例:查询出加拿大市场的所有绑定1个以上手机的用户,并且按用户ID排序。

Xg,rL,bvD0i0

select ACCTID,count(*) numPhones51Testing软件测试网_ eE#W!tY"j!Z

from IFD_PHONE_LIST

?}W|?0

where NATION_CODE='CA'

*q@"|F K+o'e/^0

group by ACCTID51Testing软件测试网 Z3x3M'S-C

having count(*) >1

V9Yz,\8z.Zb-eR0

order by ACCTID

I A LY)?'L0}o)d'D$n0

执行顺序如下:51Testing软件测试网;T$fr$|JMedq#p

1.      FROM           51Testing软件测试网&in l&I v8H(s(_^Vs

2.      WHERE          

~/tKkp bW0

3.      GTOUP BY      51Testing软件测试网gE}&d?.Y#U

4.      HAVING51Testing软件测试网 Vh2sR[o~ {5b

5.      SELECT51Testing软件测试网e} LN&t}2V ?

6.      ORDER BY

r N6WAn}+}0

这条查询语句会完成以下功能51Testing软件测试网9]s[ Y1Ul

1.      IFD_PHONE_LIST表中查询数据行51Testing软件测试网,?'] TC5h2OC

2.      对表中数据进行过滤,只保留市场为CA的记录51Testing软件测试网`\)p],S d2Cc3e[!w

3.      按照用户ID对数据进行分组51Testing软件测试网$LR2`+rI]8U

4.      对分组后的数据进行过滤,只保留绑定多个手机的用户51Testing软件测试网x2r?y"y@ U

5.      返回每个分组用户ID和手机数目51Testing软件测试网j n/_3h+w

6.      按照用户ID对输出结果进行排序

'Yt%} GYY b0

所以如果sql改为51Testing软件测试网p$C)\q7E M/oY-k~U

select ACCTID,count(*) numPhones51Testing软件测试网lpW5{8\,@P1C

from IFD_PHONE_LIST

AGZ|2{%T_0

where NATION_CODE='CA'andnumPhones>151Testing软件测试网cPM(A,y/sY ?f

group by ACCTID

-hw T"i f]F"s0

having count(*) >1

)n[#m%gr(M`J0

order by ACCTID51Testing软件测试网3TR5E_ Y/EJ

那么该sql会报错,因为这时字段还没有起别名,该操作是在where语句执行后才会执行。

5za-y|6b4?nr B0

1.3         DISTINCT

SELECT指令可以查出我们想要的所有数据,但是在这些数据中可能有很多重复的值。

T [3Le B$Y@t0

当需要查询某个表格中有哪些不同的值,而每个值出现的次数并不重要,那么这时就可以使用DISTINCT51Testing软件测试网&@5}O%C6l5b#k@g

使用方法51Testing软件测试网~E2i r#H4JI1VW#e

SELECT DISTINCT 字段名 FROM “表格名51Testing软件测试网0d&H]X_8Z:p|

1.4         GROUP BY

Group by阶段可以将前面逻辑查询处理阶段返回的行按“组”进行组合。51Testing软件测试网 Y!ZlA%qr0t

例:查询某个用户的近6月账单

*oc-B0r.m,f}0

select CYCLE_START as CycleStart,51Testing软件测试网[-^W&k;y!N;p,V

               CYCLE_END as CycleEnd,

@q9EO%TY5`e0

               sum(TOLL_CHARGE) as TollCharge,

HhN"mC"B)I"Pwg0

               sum(Credit) as Credit,

YC$glN[&iV.P$p0

               sum(Debit) as Debit,51Testing软件测试网{/P(i&a0G:[ N+^JO K

               min(Due_Date) as DueDate

.Ht-?#B"l9X lV0

               from CYCLE_CALL_FEE_HISTORY

'VbW?{0

               where acctid = 39129 and cycle_start>='2010-1-1' and cycle_end<='2010-6-1'

P1EB%M7C@0

           group by CYCLE_START, CYCLE_END

+[ h"Yz/z)R _3RS0

因为聚合函数只为每个组返回一个值,所以一个元素如果不在group by里表中出现,就只能作为聚合函数(COUNT,SUM,AVG,MIN,MAX)的输入。但是所有的聚合函数都会忽略NULL值,只有一个例外COUNT*)。例如某列的值为3010NULL10.COUNT*)会返回4,而COUNT(列名)将返回3.51Testing软件测试网 H(Ir.H4p"U

1.5         ORDER BY

在一个表中的数据不一定是排序存放的。所以到需要排序时51Testing软件测试网0Cy,h9P(}F;l}?J

ORDER BY语句用于根据指定的列对结果集进行排序。51Testing软件测试网\m(?-z A4g[@

ORDER BY语句默认按照升序对记录进行排序。51Testing软件测试网 a2u1N9aL%nd0c{

如果您希望按照降序对记录进行排序,可以使用DESC关键字。51Testing软件测试网C(oO h6ZHS

1.6         IS NULL

当要查询一个字段为null的记录时,要使用is null而不是!= nul51Testing软件测试网 d Y(H8Y M'bO&k w t4gU

1.7         NOT

NOT运算符用于对搜索条件的布尔值求反。这里讨论NOT运算符的使用、应用场合及其与<>运算符的区别。

? [0q]O"UP7d0

其他运算符不同,表示否定的NOT运算符不能单独应用,而经常与其他运算符联合使用。例如,NOT IN运算符实际上就是IN运算符与NOT运算符的联合使用

e*a,X m/E8leW r0

:使用NOT运算符实现查询

q5g Z(@;moK3x0

SELECT TNAME, DNAME,AGE, TSEX FROM TEACHER  WHERE NOT DNAME='计算机' ORDER BY DNAME

Ab a!b BS8x\q"T0

NOT运算符对紧跟其后的条件取反,NOT DNAME=‘计算机’实际上就等价于DNAME<>‘计算机’或者DNAME!=‘计算机’。51Testing软件测试网AK&v @R n

需要强调一点,NULL值进行取反,结果仍是NULL.

:V vz|/vI}5AJ0

NULL值的取反51Testing软件测试网"k1|7f'PJ;w`

如下面的代码:51Testing软件测试网t"i X r8r-fk `1s

SELECT * FROM TEACHER WHERE NOT SAL >1500 OREDR BY SAL

T Z9z G&d*bfN+h0

上述实例代码实际上是查询所有工资不高于1500的教师信息,从结果中发现,工资为NULL的教师记录并没有包括在结果表中。因为当SALNULL时,“SAL >1500”的执行结果也为NULL,而NOT NULL的运算结果仍然为NULL,也就不满足查询条件。

6TI!J*bY VR,E0

1.8         Between And

使用BETWEEN...AND操作符可以选中排列于两值之间的数据。这些数据可以是数字,文字或是日期。在SQL使用相当于>=<=

Fh&~B4a/}9D0

1.9         Top

例:查询出前10掉记录51Testing软件测试网8r m/A!`O$~3u

select top 10 account_id,plan_id,status51Testing软件测试网&m&G-R[*G3Q

from account_extension

+cD(T*\d0

order by account_id

"W4rulI f:OX"b0

这里要注意执行顺序,查询出的数据会先进行排序再查出前10行记录

H.uvZU*H$w#z/I0

 

Gjv:p3h#~0

SQL Server 2005之前的传统SQL语句中,top语句是不支持局部变量的。此时可以使用Set RowCount,但是在SQL Server 2005/2008中,TOP通常执行得更快,所以应该用TOP关键字来取代Set RowCount

SB US0m0

Declare @percentage floatset

7krmPF%l"X-y0

@percentage=151Testing软件测试网B$JO.K/sp

select Top (@percentage) percent PName from [Demo_Top] order by PName

;tQ3I0hnd]!J0

例:利用toppercent分页51Testing软件测试网&VY^ {m s

查出前1%的数据51Testing软件测试网Zl4Q|}bw

select Top 1 percent OrderID from Orders order by OrderID

^J%}.nG5odz/f0

查出前2%的数据51Testing软件测试网"pSK5l-ef4n

select Top 2 percent * from Orders where OrderID not in

d#aE^6i3yfF3K FK*VJ0

( select Top 1 percent OrderID from Orders order by OrderID) order by OrderID51Testing软件测试网tK*s q6[1BImM

1.10     Table Partition

数据库结构和索引的是否合理在很大程度上影响了数据库的性能,但是随着数据库信息负载的增大,对数据库的性能也发生了很大的影响。可能我们的数据库在一开始有着很高的性能,但是随着数据存储量的急速增长—例如通话记录数据—数据的性能也受到了极大的影响,一个很明显的结果就是查询的反应会非常慢。在这个时候,除了你可以优化索引及查询外,你还可以建立分区表(Table Partition),在某些场合下提高数据库的性能,在SQL Server 2008中提供了向导形式来创建分区表。

3pqY(M@3nBg d0

例:在fact_sales表中针对date_id以月为单位做分区后执行以下语句。51Testing软件测试网q0Mb$le&`yQ

SELECT date_id, SUM(quantity*unit_price) AS total_price

cyHd.~+Lr;kO0

FROM fact_sales

cM{)h6P?ZR0

WHERE date_id BETWEEN 20080801 AND 2008083151Testing软件测试网;x@s2x*lTm

这时对date_id进行查询时,会从指定分区表内提取数据从而可以提高查询效率

I0U u1lJ8vfi0

1.11     OVER

确定在应用关联的开窗函数之前,行集的分区和排序

jMJ'bXj+woq*K0

PARTITION BY参数

O}P @4\-{#_Y;D0

将结果集分为多个分区。开窗函数分别应用于每个分区,并为每个分区重新启动计算。51Testing软件测试网!fz;d!qo_F

例:

5hU1^5i O[b%}0

select orderid,custid,val,51Testing软件测试网 _(q}#F'l(^4n8i

   sum(val) over() as totalvalue,51Testing软件测试网%w*nM7z mWZ#?

   sum(val) over(partition by custid) as custtotalval51Testing软件测试网ql#p7i_ G,OPY

from ordervalues51Testing软件测试网q'R_w%A$p.M+I| _

 

Jy.t'H9uU0

Over使用PARTITION BY,并且按照特定字段排序51Testing软件测试网X0V|ie$W![b

2

#l"|&^2z;g"yw0

select orderid,custid,val,51Testing软件测试网 \%\-Lz&SE.Z)ig

   row_number() over(partition by custid

^u(y3y-gn|0

                   order by val) as rownum

J D6} ^^H,fI0

from ordervalues

#CI T{9w2@X0

order by custid,val51Testing软件测试网x7ui2{0H z/s

 51Testing软件测试网6^*d4X(mxoF8@F*T


TAG:

 

评分:0

我来说两句

Open Toolbar