数据库复习—数据检索

  1. 创建数据库的目的是存储、查询和管理数据,能够实现数据查询是数据库的重要功能之一。在SQL Server 2005中,查询数据是通过SELECT语句实现的。
  2. SELECT语句能够从服务器的数据库中检索符合用户要求的数据,并以结果集的方式返回客户端。
5.1 利用select语句检索数据
  1. 该语句可以实现从一个或多个数据库中的一个或多个表中查询信息,并将结果显示为另外一个表的形式,称之为结果集(result set)。
    语法格式归纳如下:
    select select_list
    [into new_tabel]
    [from table_source]
    [where search_condition]
    [group by group_by_expression]
    [having search_condition]
    [order by order_expression[asc|desc]]

例5.1
查询表student中女生的相关信息。
select * from student
where sex=‘女’

例5.2
列出所有course的职员课程号、课程名和学分。
select courseno,cname,credit
from course

例5.3
查询表student中入学成绩在780分以上的学生的学号、姓名和电话信息。
select studentno,sname,phone
from student
where point<780

例5.4
查询表student中入学成绩在780分以上的学生的学号、姓名、电话和班级名称信息。在FROM子句中使用AS关键字为表指派一个临时名称。
select studentno,sname,phone,classname
from student as 学生,class as 班级
where point>780 and 班级.classno=学生.classno

5.1.2 利用where语句指定行
  1. where子句的主要功能是利用指定条件选择结果集中的行。
  2. 利用WHERE子句指定行时,条件表达式中的char、nchar、varchar、nvarchar、text、datetime、smalldatetime类型值要放到单引号内,数值类型的值直接出现在表达式中。
    例5.5
    在score表中显示期中、期末成绩都高于85分的学生学号、课程号和成绩。
    select studentno,courseno,usually,final
    from score
    where usually>=85 and final>=85

例5.6
查询选修课称号为c05109或c06108且期末成绩大于等于85分学生的学号、课程号和成绩。
select studentno,courseno,usually,final
from score
where(courseno=‘c05109’ or courseno=‘c06108’) and final>=85

例5.7
查询计算机学院的具有高级职称教师的教师号、姓名和从事专业。
select teacherno,tname,major
from teacher
where department=‘计算机学院’ and (prof=‘副教授’
or prof=‘教授’)

5.1.3 利用into子句生成新表

利用SELECT INTO 可将几个表或视图中的数据组合成一个表。也可用于创建一个包含选自链接服务器的数据的新表。
例5.8
利用SELECT…INTO创建新表。在teaching数据库中创建一个新表学生成绩 st_score,包括学生学号、姓名、课程号和期末成绩。
select student.studentno,student.sname,
courseno,final
into st_score
from student,score

5.2 数据过滤

限定查询返回的结果集,可以在WHERE子句中指定搜索条件来过滤数据。常用的过滤类型有比较运算、字符串运算、逻辑运算、指定范围或指定列值及未知值的运算。

5.2.1 空值查询

涉及空值的查询用NULL来表示。在列中允许存在被称为NULL的特殊数值,不同于数据库中的其他任何值。在SELECT语句中,WHERE子句通常会返回比较的计算结果为真的行。
where子句的通用格式如下:
column is not null

例5.9
查询数据库test01中“奖学金”表中获得奖学金的学生的学号、班级号、综合测评和班级名次情况。
update test01.dbo.奖学金 --将奖学金为0的列值替换为null
set 奖学金=null
where 奖学金=0
select 学号,班级编号,综合测评,班级名次
from 奖学金
where 奖学金 is not null

5.2.2 利用比较运算符查询
  1. 利用比较运算符可以让表中值与指定的值或表达式进行比较,也可以使用比较运算符来做条件检查。
  2. 比较运算符用来比较兼容数据类型的列或变量。字符串之间按排序规则规定的顺序比较大小。而日期时间类型数据的比较,日期时间越早,其值越小

例5.10
在student表中1989年以后出生的学生的学号、姓名、入学成绩和Email。

select studentno,sname,point,Email
from student
where year(birthday)>1989 --where birthday>‘1989-12-31’(另一种日期时间比较方法)

5.2.3 利用字符串运算符查询
  1. 使用通配符结合的LIKE搜索条件,通过进行字符串的比较来选择符合条件的行。
  2. 模式字符串中的所有字符都有意义,包括开头和结尾的空格。
  3. LIKE主要用于字符或日期时间类型数据。

例5.11
在student表中显示所有姓何或姓韩的学生的姓名、生日和Email。
select sname,birthday,Email
from student
where sname like ‘何%’ or sname like ‘韩%’

例5.12
在student表中显示手机号开始3位不是131的学生姓名、电话和Email。
select sname,phone,Email
from student
where phone not like’131%’

5.2.4 利用逻辑运算符查询

选择条件中的逻辑表达式,可以将对某两个值的比较看作一个子条件,多个子条件之间可以用逻辑运算符AND、OR、NOT连接,最终构成更为复杂的选择条件,要注意一些逻辑运算中存在如LIKE、IN、BETEEN、IS等运算的用法

例5.13
在student表中显示所有1989年或1月份出生的学生的姓名、生日和Email。
select sname,birthday,Email
from student
where year(birthday)==1989 or month(birthday)==1
(
select sname,birthday,Email
from student
where birthday like ‘%1989%’ or birthday like’%01%’
)

5.2.5 检索一定范围内的值

在WHERE子句中,使用BETWEEN搜索条件时,使用BETWEEN搜索条件相当于用AND连接两个比较条件,如“ x BETWEEN 10 AND 27” 相当于表达式“ x>=10 AND x<=27 ”。

例5.14
查询选修课程号为c05109 的学生学号和期末成绩,并且要求平时成绩在88到95之间。
select studentno,final
from score
where courseno=‘c05109’ and usually between 88 and 95

例5.15
查询选修课程号为c05103 的学生学号和总评成绩,并且要求期末成绩不在78到90之间。其中,总评成绩的计算公式为:
总评成绩 = Final 0.7+ usually0.3
select studentno,final0.7+usually0.3
from score
where courseno=‘c05103’ and final not between 78 and 90

5.2.6 利用列表值检索数据

在WHERE子句中,可以使用IN搜索条件检索指定值列表的匹配行。使用IN搜索条件时,使用IN搜索条件相当于用OR连接两个比较条件,如“ x IN(10,15)” 相当于表达式“ x=10 OR x=15 ”。

例5.16
查询学号分别为的0824113307、0925111109和0935222201的学生学号、课程号、平时成绩和期末成绩。
select studentno,courseno,usually,final
from score
where studentno in (‘0824113307’,‘0925111109’,‘0935222201’)

5.3 设置结果集格式
  1. 利用select语句描述结果集,包括结果集排序、消除重复行、更改列名以增加结果集的可读性、显示部分结果集等。
  2. 选择列表可定义SELECT 语句的结果集中的列,结果集中列的排列顺序与选择列表中表达式的排列顺序相同。
  3. 选择列表中的常见项目有:
  • 简单表达式:函数、变量、常量或表\视图中列的引用。
  • 子查询:对结果集的每一行求得单值的SELECT 语句。
  • 使用运算符创建的复杂表达式。
  • 使用“*”关键字将返回表中的所有列。
5.3.1 改变列名

为了阅读起来更加方便,可以用AS关键字实现给SELECT子句中的各项取别名,以增加结果集的可读性。
语法格式:
select 项的原名 as 别名
例5.17
在student表中查询出生日期在1989年以后的学生的学号、姓名、电话和年龄。
select studentno as ‘学号’,sname as ‘姓名’,phone as ‘手机号’,year(birthday) as ‘年龄’
from student
where birthday>‘1989-12-31’

5.3.2 利用order by子句排序
  1. 利用ORDOR BY子句可以对查询的结果进行升序(ASC)或降序(DESC)排列。排序可以依照某个属性的值,若属性值相等则根据第二个属性的值,依此类推。
  2. 利用ORDER BY子句进行排序,需要注意的事项和原则:
  • 默认情况下,结果集按照升序排列。
  • ORDER BY子句包含的列并不一定出现在选择列表中。
  • ORDER BY子句可以通过指定列名、函数值值和表达式的值进行排序。
  • ORDER BY子句不可以使用text、ntext或image类型的列。
  • 在 ORDER BY 子句可以同时指定多个排序项。
    例5.18
    在student表中查询学生的学号、姓名和入学成绩,并按照入学成绩的降序排列。
    select studentno,sname,point as ‘入学成绩’
    from student
    order by point desc

例5.19
在student表中查询学号大于0923000000的学生的学号、姓名、电话和Email,并按照姓名的升序排序。
select studentno,sname,phone,Email
from student
where studentno>‘0923000000’
order by sname asc

例5.20
在score表中查询总评成绩大于85的学生的课程号、和总评成绩学号,并先按照课程号的升序、再按照总评成绩的降序排列。
select courseno,usually0.2+final0.8 as ‘总评’,studentno
from score
where usually0.2+final0.8>85
order by courseno asc,usually0.2+final0.8 desc

5.3.4 利用top n输出前n行
  1. 输出SELECT语句的结果集时,还可以加上TOP n 选项指定返回结果集的前n 行,或者加上TOP n PERCENT返回结果集的一部分,n 为结果集中返回的行的百分比。
    例5.22
    从student表中查询入学成绩前5名的学生的学号、姓名、分数和电话。
    select top 5 studentno,sname,point,phone
    from student
    order by point desc

例5.23
利用SELECT 语句从student表中返回入学成绩排在前35%的学生的学号、姓名、分数和电话。
select top 35 percent studentno,sname,point,Email
from student
order by point desc

5.4 group by 子句和having子句
5.4.1 group by 子句的使用
  1. GROUP BY子句可以将查询结果按属性列或属性列组合在行的方向上进行分组,每组在属性列或属性列组合上具有相同的聚合值。
  2. 如果聚合函数没有使用 GROUP BY子句,则只为 SELECT语句报告一个聚合值。
  3. 将一列或多列定义成为一组,使组内所有的行在那些列中的数值相同。
  4. 出现在查询的SELECT 列表中的每一列都必须同时出现在GROUP BY子句中。
    5.24
    利用GROUP BY子句对score表数据分组,显示每个学生的学号和平均总评成绩。总评成绩计算公式如下:
    总评成绩=usually0.3+final0.7
    select studentno,round(avg(usually0.3+final0.7),2) as ‘平均分’
    from score
    group by studentno

例5.25
5.25 统计student表中的男女学生的人数。
select sex as ‘性别’,count(*) as ‘人数’
from student
group by sex

猜你喜欢

转载自blog.csdn.net/qq_37590544/article/details/88094732