SQL数据检索

1.1 检索数据

1.1.2 利用 SELECT … FROM 语句指定列

FROM 子句用于指明表名,视图名的 SELECT 语句的数据源列表。

『例』 查询表 student 中入学成绩在 780 分以上学生学号,姓名,电话和班级名称信息。在 FROM 子句中使用 AS 关键字为表指派一个临时名称

SELECT studentno, sname, phone, classname
from student as 学生,class as 班级
where point>780 and 班级.classno = 学生.classno

1.1.3 利用 where 子句指定行

where 子句的主要功能是利用制定的条件选择结果集中的行,符合条件的行出现在结果集中,不符合条件的行不出现在结果集中

『例』 在 score 表中显示期中期末成绩都高于 85 分的学生学号,课程号和成绩

select studentno, courseno, usually, final
from score
where usually >=85 and final>= 85

1.1.4 利用 into 子句生成新表

select into 将几个新表或视图中的数据组合成一个表,也可以用于创建一个包含选自连接服务器的数据的新表

『例』 利用 select into 创建新表。 在 teaching 数据库中创建一个新表学生成绩 st_score 包括学生学号,姓名。课程号和期末成绩

select student, studentno, student.sname,courseno,final
into st_score
from student, score
where(student.studentno = score.studentno)

1.2 数据过滤

1.2.1 空值查询

一个列值是空值或者不是空值,不能表示为 『= NULL』或 『< > NULL』,而要表示为『IS NULL』或者 『IS NOT NULL』

『例』 查询数据库 test01 中 jxjl6 表中获得奖学金的学生的学号,班级号,综合测评和奖学金情况『分析』获得奖学金 ,则 bursary 的值为一数值,即为 NOT NULL. 以此为查询条件

update test01.dbo.jx16
set bursary = null
where bursary = 0 /*将奖学金为0的列值替换为0*/
select studentno,classno,evaluation,bursary
from  jx16
where bursary is not null
order by bursary desc

1.2.2 利用比较运算符查询

『例』 查询 student 表中1998年以后出生的学生的学号、姓名、入学成绩和 E-Mail

select studentno sname point Email
from student
where year(birthday)>1998

1.2.3 利用字符串运算查询

结合通配符 like 搜索条件,通过字符串的比较来选择符合条件的行

『例』在 student 表中显示所有姓何或者姓韩的学生的姓名、生日、E-mail

select sname,birthday,E-mail
from student
where sname like '何 %' or sname like '韩 %'

在 student 表中显示手机号开始三位不是131的学生的姓名,电话和 E-mail

select sname, phone, email
from student
where phone not like '131%'

1.2.4 利用逻辑运算符查询

常用 『and、or、not』连接

『例』 在 student 表中显示所有 1999 年或 2月份出生的学生的姓名、生日和 E-mail

select sname, birthday, E-mail
from student
where birthday like '1999%' or birthday like '02 %'

1.2.5 检索一定范围内的值

在 where 子句中,使用 between 搜索条件检索指定范围内的行

『例』 查询选修课程号为 c05109 的学生号和期末成绩,并且要求平时成绩在 88~95 之间

select studentno, final
from score
where course = 'c05109' and usually between 88 and 95

查询选修课程号为 c05103 的学生学号和总评成绩,并且要求期末成绩不在 78~90 之间。其中总评成绩的计算公式为:总评 = final * 0.7 +usually * 0.3

select studentno final * 0.7 +usually * 0.3
from score
where course = 'c05103' and final not between78 and 90

1.2.6 利用列表检索数据

使用 in 搜索条件时,相当于用 or 连接两个比较条件,如 x in (10,15) 相当于表达式 x = 10 or x = 15

『例』 查询学号分别为 17123456789、12687947897、9896785674563 的学生学号、课程号、平时成绩、期末成绩

select studentno courseno usually final
from score
where studentno in ('17123456789','12687947897','9896785674563')

1.3 设置结果集格式

1.3.1 改变列名

『注』为了方便阅读,使用 AS 关键字给 select 子句中各项取别名

『例』 在 student 表中查询出生日期在 1998 年以后的学生的学号、姓名、电话和年龄

select studentno as '学号', sname as '姓名',phone as '手机号',year(getdate())-year(birthday()) as '年龄'
from student
where year(birthday)>1998

1.3.2 利用 order by 子句排序

『例』 在 student 表中查询学生的学号、姓名和入学成绩,并按照入学成绩的降序排列

『注』升序 asc 是默认值,而降序 desc 必须说明

select studentno, sname as '入学成绩'
from student
order by point desc

1.3.3 消除重复行

distinct 子句从结果集中除去重复的行

『例』 在 st_score 表中查询期末成绩中有高于 85 的同学学号和姓名,并按照姓名排序

select distinct studentno, sname
from st_score
where final >85
order by sname

1.4 group by 子句和 having 子句

1.4.1 group 子句

group by 子句可以将查询结果按属性列或属性列组合在行的方向上进行分组

『例』 利用 group by 子句对 score 表数据分组,显示每个学生的学号和平均总评成绩

select studentno, round(avg(usually*0.3 + final*0.7),2) as '平均分'
from score
group by studentno

1.4.2 group by 子句和 having 子句的联合使用

『注』having 子句是对group by 子句的进一步筛选

『例』 利用 group by 子句对 score 表数据分组,显示总评成绩高于 85 分的每个学生的学号和平均总评成绩

select studentno, round(avg(usually*0.3 + final*0.7),2) as '平均分'
from score
group by studentno
having avg(usually*0.3 + final *0.7)>85