版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单元4MySQL数据高级查询课程名称:MYSQL数据库应用课程类别:必修适用专业:计算机技术类相关专业总学时:64学时(其中理论31学时,实践33学时)总学分:4.0学分本章学时:12学时(其中理论6学时,实践6学时)学情分析:学生已完成单元三的学习,掌握了去除重复、分页、合并、排序、模糊匹配等基本查询技巧,能够对单表数据进行灵活加工。但学生对查询的理解还局限于单张表,尚不理解“多张表之间的数据如何关联查询”。在单元二建库建表时,学生已经创建了学生信息表、班级信息表、成绩表等多张相互关联的表,但对表之间的关联关系缺乏系统认识。本单元将学习多表连接查询、子查询和分组查询等高级查询技术,这是SQL查询能力的核心进阶,也是后续视图、存储过程等知识的基础。高级查询逻辑较复杂,学生容易出现连接条件错误、子查询理解困难、分组聚合混淆等问题,需要借助图示和案例循序渐进地讲解。材料清单《MYSQL数据库应用技术与实战(微课版)》教材。配套PPT。代码及SQL脚本。引导性提问。探究性问题。拓展性问题。教学目标与基本要求教学目标先掌握内连接、外连接、交叉连接和自连接等多表连接查询方法,然后掌握带比较运算符、IN、EXISTS、ANY、ALL关键字的子查询编写方法,最后掌握分组查询与聚合函数、GROUP_CONCAT函数以及HAVING子句的使用。基本要求掌握内连接查询的编写方法掌握外连接查询的编写方法掌握交叉连接查询的编写方法掌握自连接查询的编写方法掌握带比较运算符的子查询编写方法掌握带IN/EXISTS/ANY/ALL关键字的子查询编写方法掌握GROUPBY分组查询与聚合函数的结合使用掌握HAVING子句的使用方法问题引导性提问引导性提问需要教师根据教材内容和学生实际水平,提出问题,启发引导学生思考解决问题,帮助学生理解掌握知识,提升专业实践能力。在教务系统中,学生信息存储在stuinfo表中,班级名称存储在classinfo表中,如果要在一条查询结果中同时显示学生姓名和班级名称,应该如何实现?内连接和外连接有什么区别?在什么情况下使用左外连接,什么情况下使用右外连接?子查询与连接查询相比有什么优缺点?在什么场景下更适合使用子查询?HAVING和WHERE都可以对数据进行筛选,它们有什么区别?探究性问题探究性问题需要教师深入钻研教材的基础上精心设计,提问的角度或者在引导性提问的基础上,从重点、难点问题切入,进行插入式提问。或者是对引导式提问中尚未涉及但在课文中又是重要的问题加以设问。多表连接查询时,如果忘记写连接条件,会产生什么结果?什么是笛卡尔积?EXISTS和IN在实现子查询时有什么区别?在数据量较大的情况下,哪个效率更高?ANY和ALL关键字在使用比较运算符的子查询中分别表示什么含义?GROUPBY分组后,SELECT后面的字段有什么限制?为什么不能随意选择未分组的字段?拓展性问题拓展性问题需要教师深刻理解教材的意义、学生的学习动态后,根据学生学习层次,提出切实可行的关乎实际的可操作问题。亦可以提供拓展资料供学生研习探讨,完成拓展性问题。在实际项目中,三表及以上的连接查询如何分析表之间的关联关系?连接顺序会影响查询结果吗?自连接查询在员工表中实现“查询每个员工的直属领导姓名”时是如何工作的?分组查询常用于统计报表,如何实现“查询每个班级的总人数并只显示人数大于30的班级”?这与HAVING有什么关系?主要知识点、重点与难点主要知识点多表连接查询(内连接/外连接/交叉连接/自连接)子查询(带比较运算符/IN/EXISTS/ANY/ALL)分组查询(GROUPBY)聚合函数(COUNT/SUM/AVG/MAX/MIN)GROUP_CONCAT函数HAVING子句与WHERE子句的区别重点内连接查询(INNERJOIN)的编写与连接条件的设置左外连接(LEFTJOIN)和右外连接(RIGHTJOIN)的区别子查询中IN、EXISTS、ANY、ALL关键字的使用GROUPBY分组查询与聚合函数的结合使用HAVING子句对分组结果的筛选难点多表连接查询中连接条件的分析与编写三张及以上表的连接查询EXISTS与IN、ANY与ALL的区别与选择HAVING子句与WHERE子句的区别GROUPBY分组后SELECT字段的限制教学过程设计第一次课(4课时:理论2学时+实践2学时)理论教学(2课时,80分钟)第1课时多表连接查询概述与内连接(40分钟)1.课堂导入(5分钟)回顾单元三的单表查询。提问:“在单元二我们创建了stuinfo、classinfo、stuscore等多张表,学生信息表中有classid字段,班级信息表中有id字段,它们之间存在关联。如果班主任想看每个学生的姓名和所在班级名称,班级名称在classinfo表中,学生姓名在stuinfo表中,单表查询能实现吗?”由此引出本课主题——多表连接查询。2.多表连接查询概述(10分钟)讲解多表连接查询的概念:查询的数据来源于多张表,通过表之间的关联字段(连接条件)将多张表的数据组合在一起显示。(1)笛卡尔积:当两张表连接时没有任何连接条件,会得到两张表所有记录的组合,即笛卡尔积。例如学生表有20条记录、班级表有10条记录,无条件的连接会得到200条记录,其中绝大多数是无意义的。因此连接查询必须指定连接条件。(2)连接条件:一般通过外键字段与主键字段的等值比较来建立关联,如stuinfo.classid=classinfo.id。(3)连接类型分类:内连接(INNERJOIN)、外连接(LEFTJOIN/RIGHTJOIN)、交叉连接(CROSSJOIN)、自连接。通过图示(韦恩图)直观展示内连接、左外连接、右外连接的结果集范围,帮助学生建立形象认知。3.内连接查询——INNERJOIN(15分钟)讲解内连接的概念:只返回两张表中满足连接条件的记录。语法格式:SELECT字段列表FROM表1INNERJOIN表2ON连接条件;(1)示例:SELECTs.stuName,c.classNameFROMstuinfosINNERJOINclassinfocONs.classid=c.id;查询每个学生的姓名和所在班级名称。其中s和c是表的别名,用于区分不同表中的同名字段。(2)INNER关键字可以省略,直接写JOIN。(3)内连接的另一种写法:在WHERE子句中指定连接条件,SELECT字段列表FROM表1,表2WHERE连接条件;这种写法是隐式内连接,与显式INNERJOIN等价,但建议使用显式写法,结构更清晰。(4)三表连接示例:SELECTs.stuName,c.className,sc.scoreFROMstuinfosINNERJOINclassinfocONs.classid=c.idINNERJOINstuscorescONs.stuNo=sc.stuNo;演示多表连接时逐对指定连接条件的写法。强调:连接条件必须写清楚表与表的关联字段,字段名相同时必须使用“表名.字段名”或别名前缀进行区分。4.连接条件的注意事项(5分钟)(1)连接查询中,如果多个表存在同名字段,必须用“表别名.字段名”的形式指明字段来源,否则会报字段不明确错误。(2)连接条件中的字段类型应保持一致,一般为主外键关联。(3)内连接中,表的先后顺序不影响查询结果,可以互换。通过课堂提问检查学生是否理解:为什么必须写连接条件?如果不写会得到什么结果?5.课堂小结(5分钟)总结本课核心知识:多表连接查询通过连接条件将多张表的数据组合显示;不写连接条件会产生笛卡尔积;内连接(INNERJOIN...ON)只返回满足连接条件的记录,支持多表逐对连接;连接字段冲突时使用“表别名.字段名”区分。下节课学习外连接查询。第2课时外连接查询(40分钟)1.复习导入(5分钟)快速回顾内连接查询的语法和连接条件的写法。提问:“内连接只返回两边都匹配的记录。如果某位学生没有班级信息,或者某个班级没有任何学生,这些记录在内连接结果中会消失吗?如何让不匹配的记录也显示出来?”引出外连接查询。2.左外连接——LEFTJOIN(12分钟)讲解左外连接的概念:返回左表中的全部记录,以及右表中满足连接条件的记录;右表中没有匹配的记录,对应字段显示为NULL。语法格式:SELECT字段列表FROM表1LEFTJOIN表2ON连接条件;(1)示例:SELECTs.stuName,c.classNameFROMstuinfosLEFTJOINclassinfocONs.classid=c.id;左表stuinfo中的所有学生都会显示,即使某学生的classid在classinfo中没有对应的班级,其班级名称显示为NULL。(2)理解要点:LEFTJOIN以左表为基准,左表记录全部保留。适合“以左表为主,右表信息可有可无”的查询场景。3.右外连接——RIGHTJOIN(10分钟)讲解右外连接的概念:返回右表中的全部记录,以及左表中满足连接条件的记录;左表中没有匹配的记录,对应字段显示为NULL。语法格式:SELECT字段列表FROM表1RIGHTJOIN表2ON连接条件;(1)示例:SELECTs.stuName,c.classNameFROMstuinfosRIGHTJOINclassinfocONs.classid=c.id;右表classinfo中的所有班级都会显示,即使某个班级没有任何学生,其学生姓名字段显示为NULL。(2)RIGHTJOIN以右表为基准,右表记录全部保留。LEFTJOIN和RIGHTJOIN可以通过交换表的书写位置互相转换。4.左外连接与右外连接对比(8分钟)通过同一业务需求分别使用LEFTJOIN和RIGHTJOIN查询,对比执行结果:(1)查询所有学生的姓名和班级名称(没有班级的学生也要显示):SELECTs.stuName,c.classNameFROMstuinfosLEFTJOINclassinfocONs.classid=c.id;(2)查询所有班级名称和学生姓名(没有学生的班级也要显示):SELECTs.stuName,c.classNameFROMclassinfocLEFTJOINstuinfosONs.classid=c.id;即RIGHTJOINstuinfo。(3)总结:判断使用LEFTJOIN还是RIGHTJOIN的关键是“以哪张表为基准”,实际开发中习惯统一使用LEFTJOIN,通过调整表的顺序实现相同效果。强调:NULL值表示没有匹配到对应记录,查询时可用ISNULL判断。5.任务书4.1讲解与课堂小结(5分钟)任务书4.1要求完成教务系统学生管理模块的查询——交叉连接查询学生基本信息与班级信息;查询学生考试成绩信息(三表连接);左外连接与右外连接对比练习。简要说明任务要求,重点提示三表连接的连接条件分析方法和左右外连接对比练习的目的。总结本课核心知识:LEFTJOIN以左表为基准保留左表全部记录,RIGHTJOIN以右表为基准保留右表全部记录,未匹配字段显示NULL;左右外连接可通过交换表位置互相转换;实际开发中习惯统一使用LEFTJOIN。实践教学(2课时,80分钟)1.任务导入(5分钟)明确本节课的实践任务:完成任务书4.1,包括交叉连接查询学生基本信息与班级信息、查询学生考试成绩信息(三表连接)、左外连接与右外连接对比练习。本节课首次接触多表查询,要求学生先理解表之间的关联关系,再编写连接语句。2.任务书4.1讲解(5分钟)讲解任务书4.1的要求:先分析stuinfo、classinfo、stuscore三张表之间的关联字段——stuinfo.classid关联classinfo.id,stuinfo.stuNo关联stuscore.stuNo;再依次完成交叉连接、三表连接、左右外连接对比三个查询任务。3.交叉连接查询学生基本信息与班级信息(20分钟)演示交叉连接查询:SELECTs.stuName,c.classNameFROMstuinfosCROSSJOINclassinfoc;观察结果中的记录数(学生数×班级数),理解笛卡尔积的含义。再演示带条件的交叉连接与内连接的等价关系:SELECTs.stuName,c.classNameFROMstuinfosCROSSJOINclassinfocWHEREs.classid=c.id;与INNERJOIN结果一致。学生自主完成交叉连接练习,巡回指导,重点关注:是否理解笛卡尔积的产生原因、交叉连接与内连接的区别。要求截图保存执行结果。4.查询学生考试成绩信息(三表连接)(20分钟)演示三表连接查询:SELECTs.stuName,c.className,sc.subject,sc.scoreFROMstuinfosINNERJOINclassinfocONs.classid=c.idINNERJOINstuscorescONs.stuNo=sc.stuNo;讲解三表连接的编写思路:先确定三张表之间的两对关联字段,然后逐对指定连接条件。强调连接条件的顺序和写法,字段冲突时必须使用表别名前缀。学生自主完成三表连接查询,巡回指导,重点关注:两对连接条件是否写全、同名字段是否使用别名区分。要求截图保存执行结果。5.左外连接与右外连接对比练习(20分钟)演示左外连接:SELECTs.stuName,c.classNameFROMstuinfosLEFTJOINclassinfocONs.classid=c.id;观察没有班级的学生记录,班级名称显示为NULL。演示右外连接:SELECTs.stuName,c.classNameFROMclassinfocRIGHTJOINstuinfosONs.classid=c.id;对比两种写法结果是否一致。再演示以班级为基准的左外连接:SELECTc.className,s.stuNameFROMclassinfocLEFTJOINstuinfosONs.classid=c.id;观察没有学生的班级记录。学生自主完成左右外连接对比练习,巡回指导,重点关注:基准表的选择、NULL值的理解。要求截图保存执行结果。6.课堂小结(10分钟)总结本节课实践内容:交叉连接产生笛卡尔积,加WHERE条件后与内连接等价;三表连接逐对指定连接条件;左外连接保留左表全部记录、右外连接保留右表全部记录,未匹配字段为NULL。强调:连接查询是本单元的核心技能,连接条件写错会导致结果错误或产生笛卡尔积,编写时务必先分析表之间的关联关系。要求学生在课后复习连接查询的语法,为子查询学习做准备。第二次课(4课时:理论2学时+实践2学时)理论教学(2课时,80分钟)第3课时子查询(一):比较运算符与IN(40分钟)1.复习导入(5分钟)回顾连接查询。提问:“连接查询可以查询多表数据,但如果查询的条件本身需要先计算得到,例如‘查询成绩高于平均分的学生’,平均分需要先统计出来,用连接查询怎么写?有没有更简洁的方法?”引出本课主题——子查询。2.子查询概述(5分钟)讲解子查询的概念:子查询就是嵌套在SELECT、INSERT、UPDATE、DELETE等语句中的查询,先执行内层子查询得到结果,再作为外层查询的条件或数据来源。子查询通常写在WHERE子句中,配合比较运算符或关键字使用。(1)子查询的执行顺序:先执行内层查询,将结果交给外层查询使用。(2)子查询的分类:按返回结果分为单行单列(标量子查询,返回一个值)、多行单列(返回一列多个值)、多行多列(作为临时表使用)。3.带比较运算符的子查询(12分钟)讲解带比较运算符(=、>、<、>=、<=、<>)的子查询:内层子查询返回一个值,外层查询将该值与子查询结果进行比较。(1)示例:SELECT*FROMstuscoreWHEREscore>(SELECTAVG(score)FROMstuscore);查询成绩高于平均分的学生成绩记录。(2)示例:SELECT*FROMstuinfoWHEREclassid=(SELECTidFROMclassinfoWHEREclassName=‘计科2101班’);查询计科2101班的学生信息。(3)强调:使用比较运算符时,子查询必须返回单行单列(一个值),否则会报错。子查询的结果可以作为外层查询的条件值,也可以出现在SELECT字段列表中。4.带IN关键字的子查询(10分钟)讲解带IN关键字的子查询:内层子查询返回一列多个值,外层查询判断字段值是否在子查询结果集合中。语法格式:WHERE字段IN(子查询);(1)示例:SELECT*FROMstuinfoWHEREclassidIN(SELECTidFROMclassinfoWHEREid>=3);查询班级编号大于等于3的所有班级的学生信息。(2)与等值比较子查询的区别:比较运算符的子查询只返回一个值,IN的子查询可以返回多个值。(3)IN与NOTIN:WHERE字段NOTIN(子查询)表示字段值不在集合中的记录。5.任务书4.2相关讲解与课堂小结(8分钟)任务书4.2要求完成教务系统学生管理模块的查询——使用子查询根据科目查询考试成绩;根据学生姓名查询班主任信息。简要说明这两个任务都可以用带比较运算符或IN的子查询完成,提示分析“外层查询表”与“子查询表”的关联关系。总结本课核心知识:子查询先执行内层再执行外层;带比较运算符的子查询要求返回单个值;带IN的子查询要求返回一列多个值;子查询写在WHERE子句中作为查询条件。第4课时子查询(二):EXISTS、ANY、ALL与自连接(40分钟)1.复习导入(3分钟)回顾比较运算符和IN关键字的子查询。提问:“如果子查询的结果不需要具体数值,只需要判断‘是否存在满足条件的记录’,用什么关键字更合适?带比较运算符的子查询中,如何表示‘大于其中任何一个值’或‘大于所有值’?”引出EXISTS、ANY、ALL关键字。2.带EXISTS关键字的子查询(10分钟)讲解EXISTS关键字:EXISTS只关心子查询是否有返回结果,只要子查询返回至少一条记录,EXISTS的值为真,外层查询执行。语法格式:WHEREEXISTS(子查询);(1)示例:SELECT*FROMstuinfosWHEREEXISTS(SELECT1FROMstuscorescWHEREsc.stuNo=s.stuNo);查询有考试成绩记录的学生信息。(2)与IN的区别:IN是判断字段值是否在子查询结果集合中,先执行子查询再比较;EXISTS是判断子查询是否有记录,逐行执行外层查询并检查子查询。数据量大时EXISTS往往效率更高,但具体选择需要结合场景。(3)EXISTS与NOTEXISTS配合使用:查询没有考试成绩记录的学生。3.带ANY和ALL关键字的子查询(12分钟)讲解ANY和ALL关键字:它们必须与比较运算符配合使用,子查询返回一列多个值。(1)ANY:表示满足比较运算符条件的任意一个值即可。例如score>ANY(子查询)表示成绩大于子查询结果中的任意一个值,等价于“大于最小值”。(2)ALL:表示必须满足与所有值的比较。例如score>ALL(子查询)表示成绩大于子查询结果中的所有值,等价于“大于最大值”。(3)示例:SELECT*FROMstuscoreWHEREscore>ANY(SELECTscoreFROMstuscoreWHEREsubject=‘语文’);查询成绩大于语文成绩中任意一个值的记录。(4)示例:SELECT*FROMstuscoreWHEREscore>ALL(SELECTscoreFROMstuscoreWHEREsubject=‘语文’);查询成绩大于所有语文成绩的记录。强调:ANY等价于最小值比较(大于任意一个即大于最小值),ALL等价于最大值比较(大于所有即大于最大值),记忆技巧:ANY=任意、ALL=所有。4.自连接查询(10分钟)讲解自连接的概念:表与自身进行连接查询。语法上为同一张表起两个不同的别名,通过别名区分“左表”和“右表”,再按照连接查询的语法编写。(1)示例:查询学生的班主任信息——学生信息表中的辅导员或班主任字段与教师信息表关联。这里以教师表自身连接为例:SELECTa.teacherName,b.teacherNameFROMteacherinfoa,teacherinfobWHEREa.leaderId=b.id;查询每位教师的直属领导姓名。(2)自连接的原理:把一张表想象成两张结构相同的表,通过别名a和b区分,连接条件一般是表中某个字段(如leaderId)与另一个字段(如id)的关联。(3)强调:自连接必须使用别名,否则无法区分左右表;自连接本质上是内连接的特例,也可以写成JOIN形式。5.课堂小结(5分钟)总结本课核心知识:EXISTS判断子查询是否有结果,与IN的使用场景不同;ANY和ALL必须与比较运算符配合,ANY表示满足任意一个(等价于与最小值比较),ALL表示满足全部(等价于与最大值比较);自连接是表与自身的连接,必须使用两个不同的别名。下节课进入分组查询和聚合函数的学习。实践教学(2课时,80分钟)1.任务导入(5分钟)明确本节课的实践任务:完成任务书4.2,包括使用子查询根据科目查询考试成绩、根据学生姓名查询班主任信息、自连接查询练习。本节课重点训练子查询的编写思路——先分析内层查询的结果,再编写外层查询。2.子查询练习:根据科目查询考试成绩(20分钟)演示任务:使用子查询根据科目查询考试成绩。示例:SELECT*FROMstuscoreWHEREsubject=(SELECTsubjectFROMstuscoreWHEREscore=(SELECTMAX(score)FROMstuscore));逐层分析内层、中层、外层查询的含义。再演示一个更典型的任务:查询成绩高于平均分的所有记录——SELECT*FROMstuscoreWHEREscore>(SELECTAVG(score)FROMstuscore);学生自主完成子查询练习,巡回指导,重点关注:子查询是否返回了正确的行数和列数、比较运算符与子查询结果是否匹配。要求截图保存执行结果。3.根据学生姓名查询班主任信息(20分钟)讲解任务思路:学生姓名在stuinfo表中,班级编号也在stuinfo表中;班主任信息在teacherinfo表中,通过classinfo表的班主任字段与班级关联。因此需要先由学生姓名查到班级编号,再查班级对应的班主任。演示两层子查询:SELECT*FROMteacherinfoWHEREid=(SELECTheadTeacherFROMclassinfoWHEREid=(SELECTclassidFROMstuinfoWHEREstuName=‘张三’));演示使用连接查询完成相同需求,让学生对比子查询与连接查询两种实现方式的异同。学生自主完成任务,巡回指导,重点关注:嵌套子查询的层级关系、内层结果是否为单值。要求截图保存执行结果。4.自连接查询练习(20分钟)演示自连接查询:SELECTa.teacherNameAS教师姓名,b.teacherNameAS领导姓名FROMteacherinfoaLEFTJOINteacherinfobONa.leaderId=b.id;查询每位教师及其直属领导。讲解自连接的关键点:同一张表起两个别名a和b,leaderId字段与id字段建立关联,使用LEFTJOIN保证没有领导的教师也显示。学生自主完成自连接练习,巡回指导,重点关注:别名是否正确区分、连接条件是否对应。要求截图保存执行结果。5.课堂小结(15分钟)总结本节课实践内容:子查询先内后外的执行逻辑、比较运算符子查询与IN子查询的编写、多层嵌套子查询的分析方法、自连接的别名使用技巧。强调:子查询与连接查询可以解决同一类问题,实际开发中应根据可读性和性能选择。要求学生在课后练习用两种方式实现同一个查询,加深对高级查询的理解。第三次课(4课时:理论2学时+实践2学时)理论教学(2课时,80分钟)第5课时分组查询与聚合函数(40分钟)1.课堂导入(5分钟)提问:“教务系统中,教务处需要统计‘每个班级有多少名学生’‘各科目的平均分是多少’,这类统计需求用什么SQL实现?”引出本课主题——聚合函数和分组查询,这是数据统计与分析的核心技能。2.聚合函数(15分钟)讲解聚合函数的概念:对一组值进行计算并返回单个汇总值的函数,常用在SELECT字段列表或HAVING子句中。(1)COUNT():统计记录条数。COUNT(*)统计所有记录数,COUNT(字段名)统计该字段非NULL的记录数。示例:SELECTCOUNT(*)FROMstuinfo;统计学生总数。(2)SUM():求和。示例:SELECTSUM(score)FROMstuscoreWHEREsubject=‘语文’;统计语文成绩总和。(3)AVG():求平均值。示例:SELECTAVG(score)FROMstuscore;统计平均成绩。(4)MAX()/MIN():求最大值/最小值。示例:SELECTMAX(score),MIN(score)FROMstuscore;逐一演示各聚合函数的使用,强调AVG自动忽略NULL值,COUNT(字段)不统计NULL值。3.分组查询——GROUPBY(12分钟)讲解分组查询的概念:按照一个或多个字段对记录分组,再对每组数据使用聚合函数进行统计。语法格式:SELECT分组字段,聚合函数FROM表名GROUPBY分组字段;(1)示例:SELECTsubject,AVG(score)FROMstuscoreGROUPBYsubject;统计各科目的平均分。(2)示例:SELECTclassid,COUNT(*)FROMstuinfoGROUPBYclassid;统计各班级的学生人数。(3)强调:GROUPBY后面的字段是分组依据,SELECT字段列表中只能出现分组字段和聚合函数,其他字段不能直接出现在SELECT中,否则结果没有意义。(4)多字段分组:GROUPBY字段1,字段2先按字段1分组,再在每组内按字段2分组。4.课堂小结与任务书4.3讲解(8分钟)任务书4.3要求完成教务系统学生管理模块的统计——统计各科平均分和最高分;统计学生总分并排序;带HAVING条件的分组查询练习。简要说明任务要求,提示使用聚合函数与GROUPBY结合实现。总结本课核心知识:五大聚合函数COUNT/SUM/AVG/MAX/MIN的用法;GROUPBY按字段分组后与聚合函数结合统计;SELECT中只能出现分组字段和聚合函数。第6课时GROUP_CONCAT与HAVING子句(40分钟)1.复习导入(5分钟)回顾聚合函数和GROUPBY。提问:“统计每个班级的学生名单,希望把每个班级的所有学生姓名拼接成一列显示,用什么函数?分组后如果要筛选‘平均分大于80分的科目’,用WHERE能实现吗?”引出GROUP_CONCAT函数和HAVING子句。2.GROUP_CONCAT函数(8分钟)讲解GROUP_CONCAT函数的作用:将分组内指定字段的值拼接成一个字符串,多个值之间默认用英文逗号分隔。语法格式:GROUP_CONCAT(字段名)。(1)示例:SELECTclassid,GROUP_CONCAT(stuName)FROMstuinfoGROUPBYclassid;统计每个班级的学生姓名列表。(2)配合ORDERBY调整拼接顺序:GROUP_CONCAT(stuNameORDERBYstuNo)。(3)强调:GROUP_CONCAT必须与GROUPBY配合使用才有意义,它是分组统计中常用的辅助函数。3.HAVING子句与WHERE子句的区别(15分钟)讲解HAVING子句的作用:对GROUPBY分组后的结果进行筛选,一般与聚合函数配合使用。语法格式:SELECT分组字段,聚合函数FROM表名GROUPBY分组字段HAVING筛选条件;(1)示例:SELECTsubject,AVG(score)FROMstuscoreGROUPBYsubjectHAVINGAVG(score)>80;查询平均分大于80分的科目。(2)WHERE与HAVING的区别:WHERE在分组之前对原始记录进行筛选,不能使用聚合函数;HAVING在分组之后对分组结果进行筛选,可以使用聚合函数。执行顺序:WHERE先执行,再分组,最后HAVING筛选。(3)对比示例:WHERE筛选某科目的记录再统计,与HAVING筛选统计后的结果,两者语义不同。SELECTsubject,COUNT(*)FROMstuscoreWHEREscore>60GROUPBYsubject;统计各科目及格人数;SELECTsubject,COUNT(*)FROMstuscoreGROUPBYsubjectHAVINGCOUNT(*)>10;查询考试人数大于10的科目。强调:聚合函数不能出现在WHERE子句中,这是SQL语法的硬性规定,出现此类需求时必须使用HAVING。4.综合查询示例(7分钟)演示一个综合统计查询,将本单元知识串联起来:查询各班级的平均分并按平均分降序排列,只显示平均分大于70分的班级——SELECTs.classid,AVG(sc.score)ASavgScoreFROMstuscorescINNERJOINstuinfosONsc.stuNo=s.stuNoGROUPBYs.classidHAVINGAVG(sc.score)>70ORDERBYavgScoreDESC;逐步分析语句的执行过程:连接查询→WHERE(本例无)→GROUPBY分组→HAVING筛选→SELECT统计→ORDERBY排序,帮助学生建立完整的查询执行顺序认知。5.单元总结(5分钟)总结本单元全部内容:多表连接查询(内连接/外连接/交叉连接/自连接)→子查询(比较运算符/IN/EXISTS/ANY/ALL)→分组查询与聚合函数(GROUPBY与COUNT/SUM/AVG/MAX/MIN)→GROUP_CONCAT函数→HAVING子句。强调:连接查询、子查询、分组统计是SQL高级查询的三大核心,也是期末考核的重点。提醒学生注意查询语句中关键字出现的顺序(SELECT→FROM→WHERE→GROUPBY→HAVING→ORDERBY→LIMIT),下节课将通过单元四综合练习进一步巩固。实践教学(2课时,80分钟)1.任务导入(5分钟)明确本节课的实践任务:完成任务书4.3(统计各科平均分和最高分、统计学生总分并排序、带HAVING条件的分组查询练习)以及单元四综合练习。本节课是单元四最后一次课,要求学生在完成任务后系统回顾本单元知识。2.统计各科平均分和最高分(20分钟)演示任务:SELECTsubject,AVG(score)AS平均分,MAX(score)AS最高分FROMstuscoreGROU
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 体育第九章武术教案
- 阅读语篇教学设计 The Violence of NatureThe Violence of Nature (教学设计)
- 2026时尚服饰品牌市场全景调研及创新方向与品牌发展投资分析报告
- 2026中国沼气供热行业市场现状供需分析及投资评估规划分析研究报告
- 生产法律法规清单更新指导书
- 2026中国有色金属行业市场供需分析投资评估现状规划研究发展趋势报告
- 2025届新疆乌鲁木齐市沙依巴克区四年级数学第二学期期中质量检测试题(含答案)
- 生产工艺知识管理指导书
- 2026商业飞机零部件市场供需分析及航空制造投资评估规划研究报告
- 国家气瓶质量监督检验中心基地建设标准
- MIDASM32数字调音台说明书
- 10KV高压柜日常检查表模板
- 小学数学人教版五年级上册全册《新课预习单》(直接打印每生一份预习用)
- 子宫内膜癌的放射治疗
- 幼儿园教职工岗位安全培训
- 统编版小学六年级道德与法治上册 第二单元 我 学历案设计
- (人教2024版)九年级化学新教材新教材培训 课件(新标题、新框架、新内容、新理念、新思路)
- GB/T 44317-2024热塑性塑料内衬油管
- 酒店英语会话(第六版)教案全套 李永生 unit 1 Room Reservations -Unit 15 Handling Problems and Complaints
- DLT5196-2016 火力发电厂石灰石-石膏湿法烟气脱硫系统设计规程
- YYT 0294.1-2016 外科器械金属材料 第1部分:不锈钢
评论
0/150
提交评论