用“问题”助推数据库原理SQL语言的模糊查询
2022-04-11朱秀英
摘要:数据库原理是数据库技术理论知识的基础课程,使用SQL语言可以完成数据库的结构化查询。文章主要围绕数据查询中的模糊查询展开讨论,并结合“问题式”教学方法来帮助学生如何根据查询条件的不同构造匹配串,继而完成查询操作。“问题式”方法在模糊查询的教学过程中,激发了学生的学习兴趣,开拓了他们的创新思维。
关键词:数据库;SQL;模糊查询;“问题式”教学
中图分类号:G642 文献标识码:A
文章编号:1009-3044(2022)05-0032-02
数据库原理是计算机专业的一门重要的必修课,具有理论性、实践性强的特点,其理论与应用相辅相成、相互依赖。课程的教学目标是让学生理解数据库系统(DBS)的基本理论概念,掌握数据库系统设计、查询、更新、优化的基本方法,具备利用现有的DBMS进行一定的数据库系统设计及应用开发能力。
SQL(Structured Query Language) ,即结构化查询语言,是数据库应用开发的标准语言[1]。熟练掌握SQL可以在数据库的实际应用开发时起到事半功倍的效果。SQL语言提供了SELECT语句进行数据库的查询,其中在查询时可以对指定的属性值进行字符串的匹配查询,即模糊查询。模糊查询是学生学习过程中较难理解掌握的知识点。传统的教学主要以教师的“灌输式”讲授方式为主,学生很难融会贯通地理解应用这部分内容[2]。
提问是能够引导学生进行思考的最直接的一种方式,在数据库原理课程的教学过程中教师根据教材的知识点提出相应问题,让学生在寻求,探索解决问题的思维活动中,掌握知识、发展智力、培养技能,进而引发学生的思考,提高学生的自主学习能力[3]。笔者结合多年来讲授数据库原理课程的教学实践,体会到模糊查询采用“问题式”教学来推动课堂,可以让学生在问题求解的过程中掌握理论知识,更能激发学生的学习兴趣,逐步形成主动提出问题、解决问题的学习习惯[4]。
下面介绍一下笔者在数据库原理课程中采用“问题式”教学方法在数据库原理SQL语言模糊查询中的应用。
1 SQL中模糊查询语句格式
在SQL中模糊查询一般用谓词LIKE来实现,其一般的查询语句格式如下[1]:
SELECT [ALL|DISTINCT]<目标列表达式>[,<目标列表达式>]…
FROM <表名或视图名>[,<表名或视图名>]…
WHERE 属性列 [NOT] LIKE‘匹配串’[ESCAPE‘换码字符’]
其中<匹配串>可以是一个完整的字符串,也可以是含有通配符的字符串,查询过程中可以实现查找指定属性值与<匹配串>相匹配的元组。针对不同的模糊查询问题,如何去构造查询“匹配串”?下面将以一个学生基本信息关系为例,进行相应的模糊问题设置及解答。
2 基于不同匹配模式进行“问题式”模糊查询
假定学生信息表(student)如表1所示。
(其中:Sno为学号,Sname为姓名,Ssex为性别,Sage为年龄,Sdept为专业,Class为班级)
SQL中通常“%”和“_”两种通配符来构造匹配串完成模糊查询,具体如何应用呢?
1)“%”:表示任意0个或多个字符,可匹配任意类型和长度的字符,授课中提出以下几类问题:
①如何查询某一姓(如姓 “张”)的同学的详细信息?
对于该问题,引导学生观察student表,姓名字段的元组值里,“张”姓同学的姓名中有两字的(张强)、有三字的(张雪丽),还有更多字的情况,让学生试着构造匹配串“张%”,继而写出查询语句:
SELECT *
FROM student
WHERE sname LIKE '张%'
②如何查询姓名中含有某一个字(如“雪”)的同学的详细信息?
对于这样的题目,让学生先观察表中的学生姓名,包含“雪”的姓名如“王丽雪”“张雪丽”,会发现“雪”字在姓名中的位置不确定,根据这个特点,构造出匹配串“%雪%”,可以写出查询语句:
SELECT *
FROM student
WHERE sname LIKE '%雪%'
③如何查询姓名中既有某字(如“雪”)又有另外某字(如“丽”)的同学的详细信息?
对于这个题目,学生根据自己的理解构造出匹配串“%雪%丽”,然后写出如下查询语句:
SELECT *
FROM student
WHERE sname LIKE '%雪%麗'
可是这样查询的结果只能搜索出“张雪丽”,但搜不出符合条件的“王丽雪”。此时将原问题再次向学生提出,并引导学生构造出匹配串“%雪%”“%丽%”,提醒学生用多条件查询完成查询语句:
SELECT *
FROM student
WHERE sname LIKE '%雪%' AND sname LIKE '%丽%'
2)“_”: 表示任意单个字符,可以匹配单个任意字符,常常用来限制表达式的字符长度。此时可以提出查询固定字符长度的同学信息的问题。
①如何查询姓名为三个字的姓张的同学信息?
对于固定长度的字符串构造时,提醒学生注意数据库字符集的类型,如果是ASCII时一个汉字需要两个“_”,是GBK时只需要一个“_”[1],一般采用后者。结合题意引导学生构造出匹配串“张_ _”,然后完成查询语句:
SELECT *
FROM student
WHERE sname LIKE ‘张_ _’
②如何查询姓名为三个字且中间一个字为“雪”的同学信息?
姓名长度为三个字且第二个字为“雪”,学生分析前面所学知识构造出匹配串“_雪_”,具体的查询语句:
SELECT *
FROM student
WHERE sname LIKE ‘_雪_’
3)“[ ] ”:表示括号内所列字符中的一个,指定一个字符、字符串或范围,要求所匹配对象为它们中的任意一个,可以提出如下问题:
①如何查询指定几个具体姓(如姓王、张、李)的同学信息?
根据题意学生会构造出匹配串“王%”“张%”“李%”,并写出相应的查询语句:
SELECT *
FROM student
WHERE sname LIKE '王%' or sname like '李%' or sname like ‘张%’
当然,上述查询语句能够实现查询问题,但是如何用“[ ]”来完成相同问题呢?将问题再次提出,引导学生构造出匹配串“[王张李]%”,书写查询语句:
SELECT *
FROM student
WHERE sname LIKE '[王李张]%'
②如何查询计算机专业学号连续(如学号尾号为01-09)的同学信息?
如果是查询一系列字符(01234、abcde之类的),可以使用“[ ]”内略写的形式来表达([0-4]、[a-e])。对照的学生信息表,根据计算机专业学生的学号信息构造出匹配串“201612060[1-9]”,具体的查询语句:
SELECT *
FROM student
WHERE sno LIKE '201612060[1-9]'
③如何查询不在指定的具体姓(如姓王、张、李)范围内的同学信息?
“[ ]” 表示括号内所列字符中的一个,那如何用“[ ]”表示不在制定的范围内呢?根据前面所学知识,学生会选用not like[ ]语句,除此之外,还可以用[^ ]来表示。 [^]:表示不在括号所列之内的单个字符,其取值和 [ ] 相同,但它要求所匹配对象为指定字符以外的任意一个字符。根据题意写出查询语句:
SELECT *
FROM student
WHERE sname like ‘[^王张李]%’
4)ESCAPE:换码字符,用来将查询内容中的通配符转义为普通字符。
如学生信息表所示,学生的班级信息本身就含有“_”,如果要查询班级信息(如信息_1)时如何构筑查询匹配串呢?当查询的字符串本身就含有通配字符“_”“%”时,需要使用ESCAPE‘<换码字符>’短语将通配符转义为普通字符的“_”“%”。所以对于查询“信息_1”构筑的匹配串为“‘信息\_1’ESCAPE‘\’”,由此写出查询语句:
SELECT *
FROM student
WHERE class like ‘信息\_1’ ESCAPE ‘\’
3 总结
通过“问题式”教学在数据库原理模糊查询中的应用,打破了传统 “灌输式”教学方法中学生被动接受的状况。教学中学生在求解问题的过程中,逐渐养成了独立思考、自主解决问题的好习惯,同时在整个教学活动中,不少学生能够主动提出新的思考问题,让大家一起解决,达到了一定的创新能力。通过用“问题”助推数据库原理SQL语言的模糊查询达到了良好的教学效果。
参考文献:
[1] 王珊,萨师煊.数据库系统概论[M]. 5版.北京:高等教育出版社,2014.
[2] 刘倩,冀亚丽,翁梅.数据库原理课程中SQL语言的检索分析[J].数字技术与应用,2012(10):104-105.
[3] 李成.启发式教学法在数据库原理与应用课程中的应用与研究[J].现代职业教育,2020(7):162-163.
[4] 刘婧.问题式教学在《数据库系统原理》教学中的应用探讨[J].中国成人教育,2011(6):134-135.
【通联编辑:王力】
收稿日期:2021-05-27
基金项目:淮北师范大学教研项目(2020xjxyj029);淮北师范大学教育信息化项目(2020xjyxxh001);淮北师范大学教研项目(2020xjxyj010);安徽省高等学校自然科学研究项目(KJ2020B17)
作者简介:朱秀英(1981—),女,山东淄博人,讲师,碩士,研究方向为计算机应用,GPS数据处理。