有关于原理数据库原理课程中SQL语言检索

更新时间:2024-03-25 作者:用户投稿原创标记本站原创
摘要:含有group by子句的select语句是数据库原理课程中教学的重点,文章结合笔者多年的教学经验,从学生学习和实验时存在的常见问题入手,总结了教学过程中的一些具体做法和体会,旨在提高学生的学习兴趣,培养其自主学习的能力,进而优化教学效果。
关键词:数据库原理SQL语言group by子句教学研究
1007-9416(2012)10-0104-02
SQL表示Structured Query Language,即结构化的查询语言,它已经成为数据库应用的标准语言,也是最重要的计算机语言之一,掌握SQL可以在应用数据库的时候达到事半功倍的效果。SQL语言提供了select语句进行数据库的查询,该语句中的group by子句是数据库原理课程中教学的重点,也是学生学习上的难点。传统的教学方法重理论、轻实践,这部分内容的设置及讲授均以理论为主,忽略了它的应用性。这就导致学生对select语句采用一种死记硬背的学习方式,而难以融会贯通地理解应用。笔者结合数据库原理课程多年的教学实践,体会到这部分知识在讲授的时候应该结合具体的数据库管理系统[3],在讲解具体例子的时候不仅要给出SQL代码和结果表,而且还要给出中间处理的具体步骤及中间表,此外,还应该指明讲授的知识点和前后知识点的联系,只有这样教师才能够真正地把知识点讲深讲透,学生才可以真正地做到“知其所以然,知其所以用”。下面介绍一下笔者在数据库原理课程中关于group by子句的教学过程和体会。
1、理解select语句的执行过程
教师在讲解group by子句之前应先介绍一下select语句的执行过程,这样不仅有利于学生对group by子句的消化吸收,而且还能引导学生对相似知识点的举一反三。下面给出了在一个表中使用select语句时的整个过程:
第一步:使用from子句选择初始表;
第二步:使用where子句选择满足条件的行;
第三步:使用select子句选择需要列出的属性列;
第四步:使用group by子句将行分组;
第五步:使用集函数汇总每组的数据;
第六步:使用order by子句按照指定的属性列对结果表进行排序。
2、细化group by子句的处理过程
含有group by子句的select语句表示将查询结果表按某一列或多列值分组,值相等的为一组。教师在讲授的时候可以先从分组的目的入手,指出对查询结果分组是为了细化集函数的作用对象,如果未对查询结果分组,那么集函数将作用于整个查询结果。然后,教师再从未分组和已分组两个角度举例比较集函数的作用对象。
2.1 未分组情况举例
在引入group by子句之前,教师可以先给学生举这样的例子:查询选修了课程的学生人数。然后在sql server环境下演示,在查询分析器里面输入如下的sql代码:
select count(distinct sno) as number_of_students
from sc
之后运行,查看结果表。本例中用到的初始表和结果表如图1和图2所示。
最后,结合初始表和结果表,教师指出在这个例子中select语句里面没有包含group by子句,也即未对查询结果分组,那么集函数count()将作用于整个学生选课表sc,对整个表进行人数的统计。通过这个例子,学生对集函数的作用对象有了一个初步的认识,为后续细化集函数的作用对象做了铺垫。
2.2 已分组情况举例
接下来再举一个含有group by子句的例子:查询学生的学号、选课门数,所选课程的最低分和最高分。
select sno,count(cno) as number_of_courses,min(grade) as minimum_grade,max(grade) as maximum_grade
from sc
where not(sno=95005)
group by sno
order by sno
在这个例子中引入了group by子句,也即对查询结果进行了分组,其具体的执行过程如下:
首先执行where子句,将学号为95005的学生选课记录删除,得到中间表,如图3所示。
其次,执行group by子句,将学号字段上具有相同值的记录分为一组,一共创建了4组,如图4所示。
然后,集函数count(),min()和max()汇总了每个组中的数据,它们在结果表中为每个组形成了一个行。
最后,执行order by子句,按学号的升序对结果表进行排列,如图5所示。
通过这样两个例子的对比,学生对分组查询的执行过程就有了一个明确清晰的认识,从而为后续知识如视图、存储过程等的学习奠定了良好的基础。
3、分组查询时经常遇到的一种错误及解决方法
学习这部分知识点的时候,很多同学在上机练习时会遇到一种错误情况,下面举例说明。
例如:查询学生的学号、姓名和所选课程的平均成绩。
select student.sno as no,sname as name,g(grade) as erage_grade
from student,sc
where student.sno=sc.sno andnot(grade is null)
group by student.sno
如果按照上述的select语句执行,则会出现如源于:论文封面格式www.808so.com
图6所示的错误提示。
出现这样的错误提示是因为select语句将已汇总的数据与详细数据混在了一起。select语句不能既列出已汇总的数据又列出详细数据,其输出的结果表中每个列必须有相同数目的行。解决这一问题的方法可以采用将sname列添加到group by子句中,这样产生的sql代码就可以顺利运行了。
select student.sno as no,sname as name,g(grade) as erage_grade
from student,sc
where student.sno=sc.sno andnot(grade is null)
group by student.sno,sname
4、结语
含有group by子句的select语句是数据库原理课程中教学的重点,文章结合笔者多年的教学经验,从学生学习和实验时存在的常见问题入手,总结了教学过程中的一些具体做法和体会:(1)理解select语句的执行过程;(2)细化group by子句的处理过程;(3)解决实验时经常遇到的错误问题。实践证明,这些方法极大调动了学生学习的积极性与主动性,有效提高了他们的实际动手能力,在课堂内外都获得了良好的效果。
参考文献
王珊,萨师煊.数据库系统概论[M].北京:高等教育出版社,2006.
杜金莲.数据库原理课程教学改革探索[J].计算机教育,2011(13).
[3]叶霞,李俊山,李海龙.数据库原理及应用实践教学改革[J].计算机教育,2011(01).

点赞:21919 浏览:96861