学习目标
- 理解查询机制
- 使用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 提供了一些内部函数,每个函数都实现不同的功能,不同类别的函数都可以和SELECT
、UPDATE
、INSERT
语句联合使用。
常用的有四类函数,分别是字符串函数、日期函数、数学函数、系统函数。
字符串函数
函数 | 功能 | 示例 |
CHARINDEX() | 返回指定字符串在原串中的位置 |
|