`

使用 SELECT

阅读更多

第一章 SELECT

一、使用SELECT

1、使用SELECT

   SELECT可从数据库中读取数据列,从一或多列数据表中读取一或多笔数据列或行。它的基本语法如下:

SELECT 逗号分割的数据行名称列表FROM 数据表名称

2、查询处理的逻辑顺序

       T-SQL语法与其他程序语言较大的区别在于其执行的逻辑处理流程。大部分程序码执行流程都是依照程序码撰写的先后顺序执行,但在T-SQL的逻辑处理过程中,第一个处理的顺序为FROM字句,而SELECT栏位子句则是最后一个步骤,如下表所示。

(8)SELECT   (9) [DISTINCT]

 (11) [Top n] 传回结果列表[INTO 新数据表名称]

 (1) FROM 数据表

 (3) [INNER | LFT | RIGHT] JOIN 数据表 (2) ON <数据表JOIN的条件>

 (4) [WHERE <过滤条件>]

 (5) [GROUP BY <群组语法>]

 (6) [WITH {CUBE | ROLLUP}

 (7) [HAVING <过滤条件>]

(10) ORDER BY <排序列表> [ASC | DESC]]

       T-SQL执行之初,通常会先产生虚拟的数据表,也就是由步骤(1)取得执行此查询语法所需的全部数据,然后再通过步骤(2)(3)找出要参照的其他数据表,进而组成一个总的数据表。如此大的数据表并不是用户所需要的,一般在组成大数据表后,会再经过多个不同的步骤,例如,WHERE字句过滤所需的记录、GROUP BY字句群组过滤后的数据等,缩小要回传的数据量。若部分子句在查询语法中没有被指定,则对应的步骤会被省略。

       SQL Server支持UNICODE联盟定义的Unicode2.0标准(也成为UCS 2)。Unicode2.0是经由联盟成员一致同意而制定的标准。这个标准把每个字符关联到一个整数(数值由065536)。

       Unicode是将字码指标对应到字符的标准语法。由于Unicode主要设计为涵盖世界上所有语言的字符,所以不需要使用不同的字码页(Code Page)来处理不同的字符集。SQL Server 2005支持Unicode Standard 3.2版。

3、过滤数据(WHRE 子句)

       使用WHERE子句查询时,应注意以下事项:

(1)       当数据行的数据类型为charncharvarcharnvarchartextdatetimesmalldatetime等时,请记得前后加上单引号

(2)       当使用SELECT子句查询数据时,应尽量避免在内使用万用字符(*),传回所有数据行。并利用WHERE子句进一步限制查询结果,以确保所得的数据是有用的数据,降低传送过多数据所造成的负荷。

(3)       可以使用单引号()或双引号(“)括住字符串,但在此建议使用单引号括住字符串。当SET QUOTED IDENTIFIER选项设成ON时,双引号表示的是物件,就不允许将字符串括在其中。

3.1 使用万用字符

       LIKE关键字可查询符合指定模式(pattern)的字符串、日期或时间数值。通过规则运算符来包含可供比对的模式。模式包含了所要查询的字符/串,它可以包含四种万用字符的任意组合。

万用字符

意义

任何具有零或多个字符的字符串

-

任何单一字符

[]

指定范围中的任何单一字符(例如[a-f]或集合[abcdef]

[^]

不在指定范围中的任何单一字符(例如[^a-f]或集合[^abcdef]

使用时,请将万用字符与字符串括在单引号中,例如:

1LIKE ‘Mc%’:查询以字母Mc开头的所有字符串,如Mcsadfsad

2LIKE ‘_hery’:查询以字符串hery结尾、并且长度为5个字母的所有字符串,例如ahery

3LIKE ‘[M-Z]ing’:查询以字符串ing结尾,并以MZ之间的任何单一字母开头的字符串,如Ring

4LIKE ‘M[^C]%’:查询以字母M开头,但并未以字母C作为第二个字母的所有字符串,如Macsfdasf

       若万用字符没有与LIKE关键字搭配使用,则它们将被误解成常数,而非模式(pattern),也就说,它们只代表本身的数值。

3.2 使用逻辑运算符

       逻辑运算符有ANDORNOTANDOR用在WHERE子句中连接查询条件,NOT则是代表与布尔运算相反的结果。

(1)    AND:结合两个布尔运算符,并在两个运算符都是TRUE时,传回TRUE,当在陈述语句中使用一个以上的逻辑运算符时,会先评估AND运算符,可以使用小括号来变更运算的顺序。

(2)    OR:结合两个条件。如果任一布尔运算符是TRUE,便是TRUE。当在陈述语句中使用一个以上的逻辑运算符时,OR运算符会在AND运算符之后评估。此外,也可以使用小括号来变更运算的顺序。

(3)    NOT:反转任何其他布尔运算符的值。

当陈述语句中使用一个以上的逻辑运算符时,NOT会第一个计算,接下来是AND,最后才是OR。先处理算术及位运算符,接着才处理逻辑运算符。

3.3 取回未知的值

       NULL值表示是未知的值。NULL值与空值或零值不同。两个NULL值永远不会相等,因为每个NULL值都是未知的,两个NULL值之间、或是一个NULL与其他任何值的比较,都会传回未知。NULL值通常代表未知的、不适用的,或之后将要加入的数据。

       若要在查询中测试NULL值,请在WHERE子句中使用IS NULLIS NOT NULL。若要直观地以=NULL<>NULL来判断,可以更改连接设定ANSI_NULLSOFF,否则与=NULL<>NULL比较的结果为UNKNOWN,无法正确地判断。但建议使用默认的ANSI_NULLSON,并用IS运算符来判断,因为这是处理NULL的惯例。

4、集合数据与分组

       在一般的情况下,集合函数只会传回一个计算之后的值。使用集合函数的优点是在server端计算统计,等到数据统计出来之后,SQL Server只将结果传回给使用者,而不传回整个细节的结果集。

集合函数

语法定义

使用时限制

MINMAX

MIN[ALL|DISTINCT]运算式

MAX[ALL|DISTINCT]运算式

运算式不可以使用于bit数据类型

会忽略任何Null值,如果是字元数据行,MAX会在定序顺序中寻找最高值,而MIN反之。DISTINCTMAXMIN没意义,只适用于SQL-92相容性。

SUMAVG

AVG[ALL|DISTINCT]运算式

SUM[ALL|DISTINCT]运算式

只能使用在以下数据类型:Intsmallinttinyintdecimalnumericfloatrealmoneysmallmoney

COUNT

COUNT[ALL|DISTINCT]运算式

使用COUNT*)这个函数时要特别小心如果栏位值含有NULL的影响。几乎可以使用在任何数据类型,包括textntextimage

4.1 分组数据与HAVING指令

Group By 子句可将多个数据列结合成单一的数据列,并使用集合函数计算分组后的结果。当指定GROUP BY时,GROUP BY 清单应该包括 SELECT 子句栏位清单中,任何非经集合运算的数据行,否则,GROUP BY 运算式必须完全符合运取清单。

   使用Group By子句时,必须注意以下几点:

1SQL Server 会针对每一群组的数据计算出一个统计值;(2)如果SELECT子句中含有GROUP BY子句以及WHERE子句,则WHERE子句一定要放在GROUP BY子句之前;(3)在GROUP BY子句之后所列出的栏位内最好不要含有NULL值,因为GROUP BY子句会将所有NULL值归纳在同一组内;(4)如果想要利用分组后,集合函数的计算值来过滤,必须使用GROUP BY子句,并搭配HAVING子句限制传回的数据结果。

       当使用GROUP BY子句搭配集合函数来查询数据时,如果想要进一步限制查询后的结果,可以使用WHERE子句或HAVING子句。

       例如:

select vDepCode from HREmployee group by vDepCode HAVING COUNT(*)>1

4.2 利用附加指令产生额外集合数据

       SELECT语法中使用GROUP BY子句分组数据时,可以搭配ROLLUPCUBE运算符一起使用,以得到完整的统计信息。

4.2.1 使用GROUP BY指令与ROLLUP运算符

       通常在GROUP BY子句中使用两个以上的栏位搭配集合函数运算时,可以利用ROLLUP运算符整理出进一步的统计信息。

       GROUP BY子句之后加上CUBEROLLUP运算符时,必须注意一下几点(1SQL Server分组的规则为“由左至右”,分完组才会进行统计计算;(2GROUP BY子句之后最多不能超过10行。

例如:

select vDepCode,vEmpCode,count(vEmpCode) as empNumber

from HREmployee

group by vDepCode,vEmpCode

with ROLLUP

4.2.2 使用GROUP BY指令与CUBE运算符

       如果在GROUP BY子句中使用两个以上的栏位搭配集合函数运算,并且希望统计之后的结果包含所有群组可能的组合时,就可以利用CUBE运算符。

       例如:

select vDepCode,vEmpCode,count(vEmpCode) as empNumber

from HREmployee

group by vDepCode,vEmpCode

with CUBE

4.2.3 使用GROUPING函数

       可以使用GROUPING函数区别哪些值是由WITH CUBE或是WITH ROLLUP所产生出来,以判断由这两个指令所产生出来的新值,在使用GROUPING函数时,应注意(1)提供一个新栏位放置GROUPING函数;(2)回传1代表该栏位值是由WITH CUBE或是WITH ROLLUP所产生;(3)回传0代表明细数据。

       例如:

select vDepCode,GROUPING(vDepCode),

       vEmpCode,GROUPING(vEmpCode),

       count(vEmpCode) as empNumber

from   HREmployee

margin-top: 0cm; margin-right: 0cm; margin-left: 0cm; text-align

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics