4.1 t-sql 查询基础
4.1.1 查询和记录集
在讲解查询之前,有必要说明一下查询的机制和查询的结果。
查询是针对表中已经存在的数据行而言的,可以简单地理解为“筛选”,其过程如图。
学员编号学员姓名地址所在班级···
001张三1湖南长沙s201
002李四1湖北宜昌s203
003赵五1甘肃天水s202
004王六1山东菏泽s204
005张三2台湾新竹s205
006李四2香港九龙s206
007赵五2北京顺义s207
008王六2北京朝阳s208
009张三3四川绵阳s209
010李四3陕西临潼s210
011赵武3新疆噶什s211
查询结果如图
004王六1山东菏泽s204
005张三2台湾新竹s205
006李四2香港九龙s206
007赵五2北京顺义s207
数据表在接受查询请求的时候,可以简单地理解为它将逐行选取,判断是否符合查询的条件。如果符合就提取出来,然后把所有的被选择的行组织在一起,形成另外一个类似于表的结构,这便是查询的结果,通常叫做记录集(recordset)。
由于记录集的结构实际上和表的结构是相同的,都是由多行组成的,因此,在记录集上依然可以进行再次查询。
4.1.2 使用 select 语句进行查询
查询使用select语句,最简单的查询语句的格式可以表示为:
select from [where ] [order by [asc 或 desc]]
其中,where及条件是可选的,如果不限制,则查询返回所有行的数据项。
order by 是用来排序的,数据表中的记录是无序的,并不按照一定的次序存储,例如要按照学员的考试成绩排序以看到高分的情况,则需要按照分数列的值进行排序。
查询语句一般都在sql server management studio 的查询窗口中进行调试和运行,以下分别举例说明最基本的查询的不同情况。
1. 查询所有的数据行和列
把表中的所有行和列都列举出来比较简单,这时候需要使用“*”通配符来表示所有的列:
select * from students
2. 查询部分行列---条件查询
查询部分列需要例举不同的列名,而查询部分行需要使用where子句进行条件限制,例如:
select scode, sname, saddress from students where saddress = '河北'
以上的查询语句,香港虚拟主机,将只查询地址为“河北”的学员,并且只显示编号、姓名和地址列。
同理,以下的查询语句,则只要不是河北的学员都显示出来。
select scode, sname, saddress from students where saddress '河北'
3. 在查询中使用列名
as 子句可以用来改变结果集列的名称,也可以为组合或者计算出的列指定名称,还有一种情况是让标题列的信息更为易懂,例如把scode列名查询后显示为“学员编号”。
在t-sql中重新命名列名可以使用as子句,例如:
select scode as 学员编号, sname as 学员姓名,服务器空间, saddress as 学员地址 from students where saddress '河北'
还有一种情况是使用计算、合并得到新列的命名,例如,在查询northwind数据库的employees表中的数据时,需要把firstname和lastname字段合并成一个叫做“姓名”的字段,可以执行以下查询语句:
select firstname + '.' + lastname as '姓名' from employees
重新命名列名还有一种方法,就是采用“=”来命名,例如:
select '姓名' = firstname + '.' + lastname from employees
4. 查询空行
在sql语句中采用“is null”或者“is not null”来判断是否为空行,因此,如果要查询学员信息表中没有填写e-mail 信息的学员,可以使用以下查询语句:
select sname from students where semail is null
5. 在查询中使用常量列
有时候,需要将一些常量的默认信息添加到查询输出中,以方便统计或计算,例如查询学员信息的时候,学校名称统一都是“河北”,查询输出的语句为:
select 姓名=sname, 地址=saddress, '河北' as 学校名称 from students
查询输出多了一行学校名称,该列的所有的数据都是“河北”
6. 查询返回限制的行数
一些查询需要返回限制的行数,例如在测试的时候,如果数据库中有上万条记录,而只要检查前面10行数据是否有效就可以了,没有必要查询输出全部的数据,以提高查询速度,这时候就要用到限制返回行数的查询。
在t-sql中,限制行数使用top关键字来约束,例如要查询返回5位女生的姓名和地址信息。
select top 5 sname, saddress from students where sex = 0
还有一种情况是需要从表中按一定的百分比提取记录,这时候还需要用到percent关键字来限制,例如要提取20%的女生数据。
select top 20 percent sname, saddress from students where sex = 0
4.2 查询排序
如果需要按照一定的顺序排列查询语句选中的行,则需要使用order by子句,并且排序可以是升序(asc)或者降序(desc)。如果不指定asc或者desc,记录集按asc升序排列。
上面讲述过的sql语句,都可以在其后面再加上order by来进行排序。
例如,查询学员成绩的时候,如果把所有成绩都降低10%后加5分,美国空间,再按照及格成绩的高低来进行排序,sql语句如下:
select studentid as 学员编号, (score * 0.9 + 5) as 综合成绩 from score where (score * 0.9 + 5) order by score
以下是查询pubs数据库中的作者表和雇员表,然后合并查到的所有姓名信息,并按照姓名降序排列。
select au_lname + '.' + au_fname as emp from authors union
select fname + '.' + lname as emp from employee order by emp desc
还可以按照多个字段进行排序。例如要在学员成绩的基础上,再按照课程id进行排序的语句如下:
select studentid as 学员编号, score as 成绩 from score where score > 60 order by score, courseid
4.3 在查询中使用函数
于java语言的包类似,sql server 也提供了一些内部函数,不同类型的函数可以和sql server的select 语句联合使用,也可以于 update 和 insert 一起使用。
以下把函数分为4累,分别是字符串函数、日期函数、数字函数、系统函数。
4.3.1 字符串函数
字符串函数用于控制返回给用户的字符串,这些功能仅用于字符型数据。
函数名描述举例
charindex用来寻找一个指定的字符串在另一个字符串中的起始位置select charindex('accp', 'my accp course', 1)
返回:4
len返回传递给它的字符串长度
select len('sql server 课程')
返回:12
upper把传递给它的字符串转换为大写
select upper('sql server 课程')
返回:sql server 课程
ltrim清除字符左边的空格
select ltrim(' 周杰伦 ')返回:周杰伦 (后面的空格保留)
rtrim清除字符右边的空格
select rtrim(' 周杰伦 ')
返回:周杰伦 (前面的空格保留)
right从字符串右边返回指定数目的字符select right('买买提·图尔松', 3)
返回:图尔松
replace替换一个字符串中的字符select replace ('莫勒克切。杨克',‘克’,'兰')
返回:'莫勒克切。杨兰
stuff在一个字符串中,删除指定长度的字符,并在该位置插入一个新的字符串select stuff(‘abcdefg’,2,3,'我的音乐 我的世界')
返回:a我的新月我的世界efg
4.3.2 日期函数
日期函数用于操作日期值,我们不能直接对日期运用数学函数。例如,如果执行一个诸如“当前日期+1”的语句,sql server无法理解要增加的是一日、一月还是一年。
日期函数帮助提取日期值中的日、月以及年,以便分别操作它们。
函数名描述举例
getdate取得当前的系统日期select getdate()
返回:今天的日期
dateadd将指定的数值添加到指定的日期部分后的日期select dateadd(mm,4'01/01/99')
返回:以当前的日期格式返回05/01/99
datediff两个日期之间的指定日期部分的区别select datediff(mm, '01/01/99','05/01/99')
返回:4
datename日期中指定日期部分的字符串形式select datename(dw, '01/01/2000')
返回:saturday
datepart日期中指定日期部分的整数形式select datepart(day, '01/05/2000')
返回:15
4.3.3 数学函数
数学函数用于对数值进行代数运算。
函数名描述举例
abs取数值表达式的绝对值select abs(-43)
返回:43
ceiling取大于或等于指定数值,表达式的最小整数select ceiling(43.5)
返回:44
floor取小于或等于指定表达式的最大整数select floor(43.5)
返回:43
power取数值表达式的幂值select power(5,2)
返回:25
round将数值表达式四舍五入为指定精度select round(43.543,1)
返回43.5
sign对于正数返回+1,对于负数返回-1,对于0则返回0select sign(-43)
返回:-1
sqrt取浮点表达式的平方根select sqrt(9)
返回:3
4.3.4 系统函数
系统函数用来获取有关sql server中对象和设置的系统信息。
函数名描述举例
convert用来转变数据类型select convert(varchar(5),12345)
返回:字符串12345
current_user返回当前用户的名字select current_user
返回:你登录的用户名
datalength返回用于指定表达式的字节数select datalength('中国a联盟')
返回:5
host_name返回当前用户所登录的计算机名字select host_name()
返回:你所登录的计算机的名字
system_user返回当前所登录的用户名称select system_user
返回:你当前所登录的用户名
user_name从给定的用户id返回用户名select user_name(1)
返回:从任意数据库中返回“dbo”
上面所有这些函数,可以在t-sql中混合使用,得到符合特殊要求的查询输出。