学习目标

  • 理解查询机制
  • 使用SELECT语句进行条件查询
  • 掌握查询排序
  • 使用表达式、运算符和函数实现查询

查询机制

查询是针对表中已经存在的数据行而言的,可以简单地理解为“筛选”,将符合条件的数据抽取出来。
例如,从学生表中查询出所在班级=S202的记录集。
学生表

学生编号

学生姓名

地址

所在班级


001

张三

山东济南

S201

002

张三

山东青岛

S202

003

张三

山东潍坊

S203

004

张三

山东烟台

S202

005

张三

山东威海

S203

006

张三

山东济宁

S202

007

张三

山东淄博

S204

T-SQL语句

SELECT 学生编号,学生姓名, 地址, 所在班级
FROM 学生表
WHERE 所在班级='S202'

记录集

学生编号

学生姓名

地址

所在班级

002

张三

山东青岛

S202

004

张三

山东烟台

S202

006

张三

山东济宁

S202

数据表在接受查询请求时,可以理解为进行“逐行判断”,判断是否符合查询条件。如果符合就提取出来,然后把所有被选中的行组织在一起,形成另外一个类似于表的结构,即查询结果,通常叫作记录集(Record Set)。

由于记录集的结构和表结构类似,都是由行组成,因此在记录集上依然可以进行再次查询。

使用SELECT语句进行查询

语法

SELECT <列名>
FROM <表名>
[WHERE <查询条件表达式>]
[ORDER BY <排序的列名> [ASC 或 DESC]]

其中,WHERE条件是可以选的,若不限制,则查询返回所有行的数据项。ORDER BY是用来排序的。

查询所有的数据行和列

把表中的所有行和列都列举出来比较简单,这时候可以使用*来表示所有的列:

SELECT * FROM students

查询部分行或列

查词部分列需要列举不同的列名,而查询部分行需要使用WHERE子句进行条件限制。例如:

SELECT sno, sname, saddress
FROM students
WHERE saddress='山东威海'

以上的查询语句,将只查询地址为“山东威海”的学生,并且只显示编号、姓名和地址列。同理以下语句用来查询地址不是“山东威海”的学生信息。

SELECT sno, sname,saddress
FROM students
WHERE saddress <> '山东威海'

在查询中使用列的别名

AS子句可以用来改变结果集中列的名称,也可以为组合或者计算出的列指定名称,还有一种情况是让标题列的信息更易懂,例如,把SCode列名查询后显示为“学生编号”。例如:

SELECT sno AS 学生编号, sname AS 学生姓名, saddress AS 地址
FROM students
WHERE saddress <> '山东威海'

还有一种情况是为计算、合并得到的新列进行命名。例如,假设在某数据库的雇员表Employee中存在FirstName列和 LastName列,现在需要将这两列合并成一个叫作“姓名”的列,可以使用下面的查询语句。

SELECT FirstName+'.'+LastName AS 姓名
FROM Employees

重新命名列名还可以使用=,例如:

SELECT 姓名=FirstName +' .' + LastName
FROM Employees

查询空值

在SQL语句中采用IS NULL或者IS NOT NULL来判断是否为空,因此,如果要查询学生信息表中没有填写Email信息的学生,可以使用以下查询语句。

SELECT sname 
FROM students 
WHERE semail IS NULL

在查询中使用常量列

有时接,需要将一些常量的默认信息添加到查询的输出中,以方便统计或计算。例如,查询学生信息的时候,学校名称统一都是“威海职业学院”,查询语句如下:

SELECT 姓名=snmae, 地址=saddress, '威海职业学院' AS 学校名称
FROM students

查询就多了一列“学校名称”,该列的所有数据都是“威海职业学院”。

查询返回限制的行数

一些查询需要返回限制的行数。例如,在测试的时候,如果数据库中有上万条记录,而只要查前面十行数据是否有效就可以了,没有必要查询输出全部的数据,以提高查询速度,这时候就用到限制返回行数的查询。

在T-SQL中,限制行数使用TOP关键字来约束。例如,要查询返回众多学生记录中前五位女生的姓名和地址信息,查询语句如下。

SELECT TOP 5 sname, saddress
FROM students WHERE gender='女'

还有一种情况是需要从表中按一定的百分比提取记录,这时候还需要用到PERCENT 关键字来限制。例如,要提取20%的女生数据如下。

SELECT TOP 20 PERCENT sname, saddress
FROM Students WHERE gender='女'

查询排序

如果需要按照一定顺序排列查询语句选中的行,则需要使用ORDER BY子句,并且排来可升序(ASC)或者降序(DESC)、如果不指定ASC或者DESC,结果集按默认ASC升序排序。
上面讲述过的SQL语句,都可以在其后面再加上ORDER BY来进行排序。

例如,查询学生成绩的时候,如果把所有成绩都降低10%后加5分,再查询及格成绩并技绩高低来进行排列,SQL语句如下。

SELECT sno AS 学生编号,(grade*0.9+5) AS 综合成绩
FROM score
WHERE (grade*0.9+5)>60
ORDER BY score

还可以按照多个列进行排序。例如,要在学生成绩排序的基础上,再按照课程ID进行排序的语句如下。

SELECT sno AS 学生编号,cno AS 课程ID, grade AS 成绩
FROM score
WHERE grade >60
ORDER BY grage,cno

在查询中使用函数

SQL Sever 提供了一些内部函数,每个函数都实现不同的功能,不同类别的函数都可以和SELECTUPDATEINSERT语句联合使用。
常用的有四类函数,分别是字符串函数、日期函数、数学函数、系统函数。

字符串函数

函数

功能

示例

CHARINDEX()

返回指定字符串在原串中的位置

Select CHARINDEX('G', 'KING') 结果为4