第一章 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是经由联盟成员一致同意而制定的标准。这个标准把每个字符关联到一个整数(数值由0到65536)。
Unicode是将字码指标对应到字符的标准语法。由于Unicode主要设计为涵盖世界上所有语言的字符,所以不需要使用不同的字码页(Code Page)来处理不同的字符集。SQL Server 2005支持Unicode Standard 3.2版。
3、过滤数据(WHRE 子句)
使用WHERE子句查询时,应注意以下事项:
(1) 当数据行的数据类型为char、nchar、varchar、nvarchar、text、datetime、smalldatetime等时,请记得前后加上单引号
(2) 当使用SELECT子句查询数据时,应尽量避免在内使用万用字符(*),传回所有数据行。并利用WHERE子句进一步限制查询结果,以确保所得的数据是有用的数据,降低传送过多数据所造成的负荷。
(3) 可以使用单引号(’)或双引号(“)括住字符串,但在此建议使用单引号括住字符串。当SET QUOTED IDENTIFIER选项设成ON时,双引号表示的是物件,就不允许将字符串括在其中。
3.1 使用万用字符
LIKE关键字可查询符合指定模式(pattern)的字符串、日期或时间数值。通过规则运算符来包含可供比对的模式。模式包含了所要查询的字符/串,它可以包含四种万用字符的任意组合。
万用字符
|
意义
|
%
|
任何具有零或多个字符的字符串
|
-
|
任何单一字符
|
[]
|
指定范围中的任何单一字符(例如[a-f]或集合[abcdef])
|
[^]
|
不在指定范围中的任何单一字符(例如[^a-f]或集合[^abcdef])
|
使用时,请将万用字符与字符串括在单引号中,例如:
(1)LIKE ‘Mc%’:查询以字母Mc开头的所有字符串,如Mcsadfsad。
(2)LIKE ‘_hery’:查询以字符串hery结尾、并且长度为5个字母的所有字符串,例如ahery。
(3)LIKE ‘[M-Z]ing’:查询以字符串ing结尾,并以M到Z之间的任何单一字母开头的字符串,如Ring。
(4)LIKE ‘M[^C]%’:查询以字母M开头,但并未以字母C作为第二个字母的所有字符串,如Macsfdasf。
若万用字符没有与LIKE关键字搭配使用,则它们将被误解成常数,而非模式(pattern),也就说,它们只代表本身的数值。
3.2 使用逻辑运算符
逻辑运算符有AND、OR及NOT。AND与OR用在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 NULL或IS NOT NULL。若要直观地以=NULL或<>NULL来判断,可以更改连接设定ANSI_NULLS为OFF,否则与=NULL或<>NULL比较的结果为UNKNOWN,无法正确地判断。但建议使用默认的ANSI_NULLS为ON,并用IS运算符来判断,因为这是处理NULL的惯例。
4、集合数据与分组
在一般的情况下,集合函数只会传回一个计算之后的值。使用集合函数的优点是在server端计算统计,等到数据统计出来之后,SQL Server只将结果传回给使用者,而不传回整个细节的结果集。
集合函数
|
语法定义
|
使用时限制
|
MIN或MAX
|
MIN([ALL|DISTINCT]运算式
MAX([ALL|DISTINCT]运算式
|
运算式不可以使用于bit数据类型
会忽略任何Null值,如果是字元数据行,MAX会在定序顺序中寻找最高值,而MIN反之。DISTINCT对MAX、MIN没意义,只适用于SQL-92相容性。
|
SUM或AVG
|
AVG([ALL|DISTINCT]运算式
SUM([ALL|DISTINCT]运算式
|
只能使用在以下数据类型:Int,smallint,tinyint,decimal,numeric,float,real,money,smallmoney
|
COUNT
|
COUNT([ALL|DISTINCT]运算式
|
使用COUNT(*)这个函数时要特别小心如果栏位值含有NULL的影响。几乎可以使用在任何数据类型,包括text、ntext、image。
|
4.1 分组数据与HAVING指令
Group By 子句可将多个数据列结合成单一的数据列,并使用集合函数计算分组后的结果。当指定GROUP BY时,GROUP BY 清单应该包括 SELECT 子句栏位清单中,任何非经集合运算的数据行,否则,GROUP BY 运算式必须完全符合运取清单。
使用Group By子句时,必须注意以下几点:
(1)SQL 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子句分组数据时,可以搭配ROLLUP和CUBE运算符一起使用,以得到完整的统计信息。
4.2.1 使用GROUP BY指令与ROLLUP运算符
通常在GROUP BY子句中使用两个以上的栏位搭配集合函数运算时,可以利用ROLLUP运算符整理出进一步的统计信息。
在GROUP BY子句之后加上CUBE或ROLLUP运算符时,必须注意一下几点(1)SQL Server分组的规则为“由左至右”,分完组才会进行统计计算;(2)GROUP 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
分享到:
相关推荐
1. 在 studentsdb 数据库中使用 SELECT 语句进行基本查询。 (1)在 student_info 表中,查询每个学生的学号、姓名、出生日期信息。 (2)查询 student_info 表学号为 0002 的学生的姓名和家庭住址。 (3)查询 ...
建立TCP、UDP单播、组播 创建服务器端与客户端,服务器端使用select机制接收客户端的请求,并交给线程池处理
1、使用select 完成简单的计算器 执行时人机交互输入两个数,a和b ,及运算符号,完成两个数的计算。
《unix网络编程》第8章最后例子,使用select的UDP和TCP回射程序
可以复制我的文件的代码到你自己的工程中,也可以使用我的文件替换掉你的image工程中的userAppInit.c文件。该代码实现了使用select监测串口是否接收到了数据,串口收发都已调通。
Select 语句的基本使用 Select 语句的基本使用 Select 语句的基本使用
使用Select控件实现联动效果的ASP实例 省市二级联动 安徽机电职业技术学院 陈伟
一个使用select实现的服务端包括数据包控制
使用select模型实现WebSocket实现IM功能,项目中带有测试的网页客户端。具体可查看 https://blog.csdn.net/qq_34950682/article/details/105148477
最近在开发im服务器 需要大并发链接 QT默认的是使用select模型的 这种轮询方式非常慢 在高并发连接 我们需要epoll才能发挥linux服务器的性能 而且使用简单 整个服务端代码架构无需修改 直接可以使用 只要在 main...
简单的控制台程序,全部代码用C语言实现,可直接运行。基于c/s模型设计,使用select函数,实现多对一的c/s模型,多个客户端可以向服务端发文件,先运行server.c再运行client.c
《unix网络编程》第六章,使用select的客户服务器程序
数据库技术与应用 使用Select子句设定查询目标列学习任务书1.doc 学习资料 复习资料 教学资源
在ADO(sql)中使用SELECT的语法之六-子查询的使用方法
TCP是一种面向连接的通信方式,一个TCP服务器难免会遇到同时处理多个用户的连接请求的问题,本文用一个简化的实例说明如何在一个TCP服务器程序中,使用select处理同时出现的多个客户连接,文章给出了程序源代码,...
范例2 选定单元格区域的方法 2-1 使用Select方法选定单元格区域.xlsm
VB使用select case选择法实现课程表查询,原以为这是一个数据库程序,后来发现是把查询的内容写入case语句中,主要练习Vb中的select case语句的用法,下载后,直接在VB6.0下编译即可看到效果。
美化HTML的select标签的原始样式,并且不影响原始select的事件方法调用。
摘要:Delphi源码,数据库应用,生成临时表 Delphi使用Select into生成临时表的源程序例子,临时表在日常编程中也是比较常见的,希望本程序对您的Delphi数据库编程技巧提供一些参考依据。