SQL Server2008多表数据查询的实现方式

2018-01-22 01:48杨浩宇
电脑与电信 2017年11期
关键词:平均分视图语句

杨浩宇

(昆明工业职业技术学院,云南 昆明 650302)

1 问题提出

数据查询作为数据库操作的重点,也一直是学习者的学习重点,多表查询则是其中不可回避的重点与难点。本文以一个学生数据库(Student)为例讨论几种实现多表查询的方式。

Studen中有三张表:stuinfo(学生信息表),用于存放学生基本信息;course(课程信息表),用于存放课程信息;score(成绩表)用于存放学生各课程的考试成绩,具体结构如下:

表1 学生信息表结构

表2 课程信息表结构

表3 成绩表结构

2 SQL语句查询实现多表查询

对于这三张表的多表查询主要集中在成绩的统计和查询上。

例如,查询学生每门课程的成绩,包括学号、姓名、课程名称和成绩信息,用SQL语句完成如下:

select d1.stuid,d1.name,d2.cid,d2.cname,d3.score

from stuinfo d1,course d2,score d3

where d1.stuid=d3.stuid and d2.cid=d3.cid

或者,查询每位学生所学课程的平均分,包括学号、姓名和平均分:

select d2.stuid,d2.name,AVG(d1.score)

from score d1,stuinfo d2

where d1.stuid=d2.stuid

group by d2.stuid,d2.name order byAVG(d1.score)desc

再如,统计各门课程的最高分、最低分和平均分:

select d2.cid,d2.cname,AVG(d1.score),MAX(d1.score),MIN(d1.score)

from score d1,course d2

where d1.cid=d2.cid

3 通过建立视图完成多表查询

在SQL Server8中除了用SQL语句完成这类问题,也可以用其它的数据库对象完成。以学生所学课程成绩查询为例,用如下语句建立一个叫做score1的视图,然后查看score1的数据来查看到位学生的各门课程成绩,而且,还可以再通过SQL语句对score1行和列进行选择统计数据。

create view score1

as

select d1.stuid,d1.name,d2.cid,d2.cname,d3.score

from stuinfo d1,course d2,score d3

where d1.stuid=d3.stuid and d2.cid=d3.cid

例如,查询每位学生学过的所有课程的平均分,对视图score1操作的SQL语句:

Select stuid,name,avg(score)from score1 group by stuid,name

图1 视图统计学生各科平均分

查询各门课程的最高分、最低分和平均分,通过对Score1视图的操作来完成SQL语句如下:select cid,cname,max(score),min(score),avg(score)from score1 group by cid,cname

可见,对比之前对多表查询的语句,视图查询简洁很多。

图2 视图查询结果

视图作为数据库中的一种对象,是一个虚拟表,视图一旦被建立,作用与表相同,但它并不保存任何数据,它的数据来自定义视图的查询所引用的表。视图可以使用户将焦点集中于感兴趣的数据,不必要的数据可以不出现在视图中,这也增加了数据的安全性;其次,视图可以减化操作,特别是对于对多表查询不熟悉的用户;第三,可以根据用户的需求定制数据,同时保持数据表的简洁性,又不会占用很多的存储空间,并且,在视图中同样可以对数据进行增删改的操作。

4 通过存储过程实现多表查询

除了视图,还可以用存储过程来完成对成绩的查询。创建名为p1的存储过程如下:

create procedure p1 as

select d1.stuid,d1.name,d2.cname,d3.score from stuinfo d1,course d2,score d3

where d1.stuid=d3.stuid and d2.cid=d3.cid

需要查看成绩的时候调用p1存储过程:exec p1就可以查看所有学生的各门课程成绩,如果需要针对某学生或某课程进行查询,则需要创建带参数的存储过程。

Create procedure p2(char(10))as

select d1.stuid,d1.name,d2.cname,d3.score from stuinfo d1,course d2,score d3

where d1.stuid=d3.stuid and d2.cid=d3.cid and d1.stuid=@sid

p2存储过程可以通过学号查询学生成绩调用语句:exec p2“2015020202”

5 结语

从上面三种实现多表数据查询的方法来看,SQL语句查询交互性强,查询灵活,但对于了解不多的用户来说,多表复杂查询会有一定的困难。视图的优点是可以防止未经许可的用户访问敏感数据;降低数据库的复杂度;结果更容易理解,获得数据更容易,应用程序的维护更加方便,但需要数据库设计者对数据操作有足够的了解和预见,否则可能会限制系统功能;存储过程的优势是可以包含逻辑控制语句和数据操作语句速度,模块化和封装能够加快系统运行,减少网络流量,但它的灵活性不如前两种方式。

[1]王永乐,徐书欣.S QLServer 2008数据库管理及应用[M].北京:清华大学出版社,2011.

[2]王勇.用关系数据库标准语言S QL实现数据查询(多表查询)的应用研究[J].计算机光盘软件与应用,2014(19):66-67.

猜你喜欢
平均分视图语句
重点:语句衔接
这样做合理吗
教你学会平均分
5.3 视图与投影
视图
Y—20重型运输机多视图
SA2型76毫米车载高炮多视图
平均分一半
如何搞定语句衔接题
作文语句实录