《MySQL数据库应用案例教程》651-5(马洁)教案 第8课 单表数据记录查询_第1页
《MySQL数据库应用案例教程》651-5(马洁)教案 第8课 单表数据记录查询_第2页
《MySQL数据库应用案例教程》651-5(马洁)教案 第8课 单表数据记录查询_第3页
《MySQL数据库应用案例教程》651-5(马洁)教案 第8课 单表数据记录查询_第4页
《MySQL数据库应用案例教程》651-5(马洁)教案 第8课 单表数据记录查询_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGE20PAGE20PAGE19PAGE19

课题单表数据记录查询课时2课时(90min)教学目标知识技能目标:(1)了解基本查询语句(2)掌握查询所有字段和指定字段的方法(3)掌握使用常用关键字实现简单查询的方法(4)掌握使用聚合函数结合GROUPBY实现分组查询的方法质目标:(1)了解我国文学名著,培养文化自信(2)懂得做事应脚踏实地、认真负责教学重难点教学重点:基本查询语句,使用不同方式进行查询教学难点:使用聚合函数结合GROUPBY实现分组查询的方法教学方法案例分析法、问答法、讨论法、讲授法、实践法教学用具电脑、投影仪、多媒体课件、教材教学设计第1节课:→→→传授新知(38min)第2节课:→传授新知(20min)→课堂实训(15min)→课堂小结(3min)→作业布置(2min)教学过程主要教学内容及步骤设计意图第一节课课前任务【教师】布置课前任务,和学生负责人取得联系,让其提醒同学通过文旌课堂APP或其他学习软件,预习本节课要学习的知识【学生】完成课前任务通过课前任务,使学生预习本节课要学习的知识,增加学生的学习兴趣考勤(2min)【教师】使用文旌课堂APP进行签到【学生】班干部报请假人员及原因培养学生的组织纪律性,掌握学生的出勤情况问题导入(5min)【教师】提出以下问题:如何查询数据库中所需的数据记录呢?通过问题导入,引导学生主动思考,激发学生的学习兴趣传授新知(38min)【教师】通过学生的回答引入要讲的知识,讲解基本查询语句和简单数据记录查询的相关知识7.1基本查询语句✈【教师】组织学生扫码观看“基本查询语句”视频(详见教材),让学生对基本格式有一个大致的了解单表查询是指从一张数据表中查询所需要的数据。本节首先简单认识一下基本查询语句。SELECT {*|<字段列表>} [ FROM<表1>,<表2>… [WHERE<表达式> [GROUPBY<groupbydefinition>] [HAVING<expression>[{<operator><expression>}…]] [ORDERBY<orderbydefinition>] [LIMIT[<offset>,]<rowcount>] ];上述各条子句的含义如下:{*|<字段列表>}:使用星号通配符或者字段列表表示要查询的字段,其中字段列表至少要包含一个字段名称,如果要查询多个字段,字段之间用逗号隔开,最后一个字段后不加逗号。FROM<表1>,<表2>…:表1和表2表示查询数据的来源,可以是单个或者多个。WHERE子句:可选,用于限定查询行必须满足的查询条件。GROUPBY<字段>:该子句表示按照指定的字段对查询出来的数据进行分组。ORDERBY<字段>:该子句表示按照什么样的顺序显示查询出来的数据,有两种情况:升序(ASC)和降序(DESC)。[LIMIT[<offset>,]<rowcount>]:表示每次显示的查询出来的数据条数。SELECT可选参数比较多,读者可能无法一下完全理解,后面将从最简单的语句开始,一步一步深入学习。7.2简单数据记录查询✈【教师】组织学生扫码观看“简单查询”视频(详见教材),让学生对基本查询有一个大致的了解简单数据记录查询主要包括:查询所有字段、查询指定字段、查询指定记录、多条件查询、排序查询等。本节将以第5章创建的goods表为操作对象,讲解简单数据记录查询的具体实现方法,如果表内还没有数据,执行以下语句在其中插入数据。INSERTINTOgoods(id,type,name,price,num,add_time)VALUES(1,'书籍','西游记',50.4,20,'2018-01-0113:40:40'),(2,'糖类','牛奶糖',7.5,200,'2018-02-0213:40:40'),(3,'糖类','水果糖',2.5,100,null),(4,'服饰','休闲西服',800,null,'2018-04-0413:40:40'),(5,'饮品','果汁',3,70,'2018-05-0513:40:40');7.2.1查询所有字段查询所有字段数据,是指从一张表中检索出所有记录,查询方式有两种,一种是使用通配符“*”,另一种是列出所有字段名,语法形式如下:SELECT{*|col_list}FROMtable_name;上述语句中,col_list表示数据表中的字段列表,如果表中字段有多个,字段之间需要使用逗号隔开,最后一个字段不加逗号。正如1.4.1节所述,SQL语言是高级的非过程化编程语言,用户使用查询语句时,应至少指明两点,一是查询什么,二是在什么位置查询。语句中的通配符“*”或“col_list”指明了需要查询的是数据表中的所有字段,而表名指明了查询位置。【实例7-1】使用通配符“*”查询goods表中所有数据,SQL语句及其执行结果如下。mysql>SELECT*FROMgoods;+++++++|id |type |name |price |num |add_time |+++++++|1|书籍 |西游记 |50.40 |20 |2018-01-0113:40:40 ||2|糖类 |牛奶糖 |7.50 |200 |2018-02-0213:40:40 ||3|糖类 |水果糖 |2.50 |100 |NULL ||4|服饰 |休闲西服 |800.00 |NULL |2018-04-0413:40:40 ||5|饮品 |果汁 |3.00 |70 |2018-05-0513:40:40 |+++++++5rowsinset(0.00sec)可以看出,使用通配符“*”可以返回数据表中所有列数据。通过在SELECT关键字后面列出所有字段名,也可以查询所有列数据,SQL语句如下,其查询结果与实例7-1的结果相同。SELECTid,type,name,price,num,add_timeFROMgoods;【知识库】一般使用通配符查询表中所有字段数据;而使用列出字段名的方式查询部分字段数据,具体方法将在7.2.2节介绍。7.2.2查询指定字段使用SELECT关键字也可以查询指定字段的数据,语法形式如下:SELECTcol_name1[,col_name2,……,col_namen]FROMtable_name;上述语句可以查询单个字段,也可以查询多个字段。当查询多个字段时,各个字段之间使用英文格式的逗号隔开,最后一个字段不加逗号;查询一个字段时也不需要加逗号。【实例7-2】从goods表中查询单个字段。执行SQL语句,查询goods表中的name字段数据,执行结果如下:mysql>SELECTnameFROMgoods;++|name|++|休闲西服||果汁||水果糖||牛奶糖||西游记|++5rowsinset(0.00sec)【实例7-3】从goods表中查询多个字段。执行SQL语句,查询goods表中的id和name字段数据,结果如下:mysql>SELECTid,nameFROMgoods;+++|id |name|+++|4|休闲西服||5|果汁||3|水果糖||2|牛奶糖||1|西游记|+++5rowsinset(0.00sec)7.2.3查询指定记录当用户需要查询数据库中符合一定条件的数据时,可以使用WHERE子句对表中的记录进行筛选,语法形式如下:SELECT{*|col_list}FROMtable_nameWHEREcondition;WHERE子句中可以使用多种条件判断符,如表7-1所示。✈【教师】通过多媒体展示“WHERE子句中可用的条件判断符”表格,介绍相关知识表7-1WHERE子句中可用的条件判断符条件判断符说明=相等<小于>大于<>(!=)不相等<=小于或者等于>=大于或者等于注:“<>”和“!=”功能相同。下面以其中的两个符号为例,简单介绍WHERE子句的应用。1.使用“=”符号查询【实例7-4】从goods表中查询id值为3的记录。SQL语句及其执行结果如下:mysql>SELECT*FROMgoodsWHEREid=3;+++++++|id |type |name|price |num |add_time |+++++++|3 |糖类 |水果糖|2.50 |100 |NULL |+++++++1rowinset(0.06sec)判断符既可以用于比较数值,也可以用于比较字符串。【实例7-5】从goods表中查询type值为“糖类”的记录。SQL语句及其执行结果如下:mysql>SELECT*FROMgoodsWHEREtype='糖类';+++++++|id |type|name|price|num|add_time |+++++++|2 |糖类|牛奶糖|7.50|200 |2018-02-0213:40:40 ||3 |糖类|水果糖|2.50|100 |NULL |+++++++2rowsinset(0.00sec)可以看出,表中type值为“糖类”的记录全被查询出来了。2.使用“>=”符号查询【实例7-6】从goods表中查询num值大于等于100的记录。SQL语句及其执行结果如下:mysql>SELECT*FROMgoodsWHEREnum>=100;+++++++|id |type |name |price |num |add_time |+++++++|2|糖类 |牛奶糖 |7.50 |200 |2018-02-0213:40:40 ||3|糖类 |水果糖 |2.50 |100 |NULL |+++++++2rowsinset(0.00sec)可以看出,表中num值大于等于100的记录全被查询出来了。7.2.4多条件查询1.使用AND关键字查询MySQL支持多条件查询,如果条件之间使用AND关键字连接,那么只有符合所有条件的记录才会被返回。【实例7-7】从goods表中查询price值大于50,并且id值大于3的记录。SQL语句及其执行结果如下:mysql>SELECT*FROMgoodsWHEREprice>50ANDid>3;+++++++|id |type |name |price|num |add_time |+++++++|4 |服饰 |休闲西服 |800.00|NULL |2018-04-0413:40:40 |+++++++1rowinset(0.06sec)【提示】上例中的WHERE子句中只包含了一个AND关键字,实际上可以添加多个筛选条件,增加一个条件的同时需要增加一个AND关键字。2.使用OR关键字查询如果多条件查询中的条件使用OR关键字连接,表示只需要符合所有条件中的一个条件,此记录就会被返回。【实例7-8】从goods表中查询type值为“糖类”或者“书籍”的记录。SQL语句及其执行结果如下:mysql>SELECT*FROMgoodsWHEREtype='糖类'ORtype='书籍';+++++++|id |type |name|price |num |add_time |+++++++|1|书籍 |西游记|50.40 |20 |2018-01-0113:40:40 ||2|糖类 |牛奶糖|7.50 |200 |2018-02-0213:40:40 ||3|糖类 |水果糖|2.50 |100 |NULL |+++++++3rowsinset(0.00sec)【提示】AND关键字可以使用符号“&&”代替;OR关键字可以使用符号“||”代替。3.使用IN关键字查询使用IN关键字可以查询字段值等于指定集合中任意一个值的记录,语法形式如下:SELECT{*|col_list}FROMtable_nameWHEREcol_nameIN(value1,value2,……valuen);上述语句中,指定集合包含在括号中,值之间使用逗号隔开。【实例7-9】执行SQL语句,查询goods表中id值为1和3的记录,结果如下:mysql>SELECT*FROMgoodsWHEREidIN(1,3);+++++++|id |type |name |price |num |add_time |+++++++|1|书籍 |西游记 |50.40 |20 |2018-01-0113:40:40 ||3|糖类 |水果糖 |2.50 |100 |NULL |+++++++2rowsinset(0.01sec)此类操作也可以使用OR关键字实现,SQL语句如下。SELECT*FROMgoodsWHEREid=1ORid=7;【提示】OR关键字和IN关键字可以实现相同的功能,但IN关键字可以使查询语句更加简洁,并且IN关键字的执行速度比OR关键字快。另外,IN关键字还可以与NOT关键字配合使用,作用是查询字段值不在指定集合中的记录。【实例7-10】执行SQL语句,查询goods表中id值不为1和3的记录,结果如下:mysql>SELECT*FROMgoodsWHEREidNOTIN(1,3);+++++++|id |type |name|price |num |add_time |+++++++|2|糖类 |牛奶糖|7.50 |200 |2018-02-0213:40:40 ||4|服饰 |休闲西服|800.00 |NULL |2018-04-0413:40:40 ||5|饮品 |果汁|3.00 |70 |2018-05-0513:40:40 |+++++++3rowsinset(0.00sec)7.2.5查询空值MySQL提供ISNULL关键字,用于查询字段值为NULL的记录,语法形式如下:SELECT{*|col_list}FROMtable_nameWHEREcol_nameISNULL;【实例7-11】执行SQL语句,查询goods表中num值为NULL的记录,结果如下:mysql>SELECT*FROMgoodsWHEREnumISNULL;+++++++|id |type |name |price|num|add_time |+++++++|4|服饰 |休闲西服 |800.00|NULL|2018-04-0413:40:40 |+++++++1rowinset(0.02sec)ISNULL也可以和NOT关键字配合使用,用于查询字段值不为NULL的记录。【实例7-12】执行SQL语句,查询goods表中num值不为NULL的记录,结果如下:mysql>SELECT*FROMgoodsWHEREnumISNOTNULL;+++++++|id |type |name |price |num |add_time |+++++++|1|书籍 |西游记 |50.40 |20 |2018-01-0113:40:40 ||2|糖类 |牛奶糖 |7.50 |200 |2018-02-0213:40:40 ||3|糖类 |水果糖 |2.50 |100 |NULL ||5|饮品 |果汁 |3.00 |70 |2018-05-0513:40:40 |+++++++4rowsinset(0.00sec)需要注意的是,如果某些字段值为NULL,在将这些字段与其他值进行比较时,就会返回不准确的数据。【实例

7-13】执行SQL语句,查询goods表中num值不等于100的记录,查询结果如下:mysql>SELECT*FROMgoodsWHEREnum<>100;+++++++|id |type |name |price |num |add_time |+++++++|1|书籍 |西游记 |50.40 |20 |2018-01-0113:40:40 ||2|糖类 |牛奶糖 |7.50 |200 |2018-02-0213:40:40 ||5|饮品 |果汁 |3.00 |70 |2018-05-0513:40:40 |+++++++3rowsinset(0.00sec)按照平常的理解,字段值为NULL时,也符合不等于100的条件,但是在MySQL中,值为NULL就表示该字段还没有进行任何的赋值操作,它的值是未知的,所以无法与其他类型的值进行比较。7.2.6查询结果不重复通过前面的学习可以知道,如果要查询goods表中商品的种类,直接查询表示“种类”的字段即可。【实例7-14】执行SQL语句,查询goods表中字段type的值,结果如下。mysql>SELECTtypeFROMgoods;++|type |++|书籍 ||糖类 ||糖类 ||服饰 ||饮品 |++5rowsinset(0.00sec)可以看到查询结果返回了5条记录,其中有重复的值。为了更方便地分析商品种类,最好能将重复的值去掉。为此,MySQL提供了DISTINCT关键字,使查询结果不重复。其语法形式如下:SELECTDISTINCTcol_listFROMtable_name;【实例7-15】执行SQL语句,查询goods表中字段type不重复的值,结果如下:mysql>SELECTDISTINCTtypeFROMgoods;++|type |++|书籍 ||糖类 ||服饰 ||饮品 |++4rowsinset(0.04sec)可以看到,此次查询结果只返回了4条记录的type值,且没有重复值。7.2.7范围查询MySQL提供BETWEENAND关键字,用于查询字段值在某个范围内的记录,语法形式为:SELECT{*|col_list}FROMtable_nameWHEREcol_nameaBETWEENvalue1ANDvalue2;上述语句中,col_namea为要限定值范围的字段,value1为开始值,value2为结束值。【实例7-16】执行SQL语句,查询goods表中price值为2.5到50的商品名称和价格,结果如下:mysql>SELECTname,priceFROMgoodsWHEREpriceBETWEEN2.5AND50;+++|name |price |+++|牛奶糖 |7.50 ||水果糖 |2.50 ||果汁 |3.00 |+++3rowsinset(0.00sec)BETWEENAND关键字可以配合NOT关键字,用于查询字段值不在某个范围内的记录。【实例7-17】执行SQL语句,查询goods表中price值不在2.5和50之间的商品名称和价格,结果如下:mysql>SELECTname,priceFROMgoodsWHEREpriceNOTBETWEEN2.5AND50;+++|name |price |+++|西游记 |50.40 ||休闲西服 |800.00 |+++2rowsinset(0.00sec)由实例7-16和实例7-17的查询结果可以看出,使用BETWEENAND关键字进行查询,查询结果包括范围内的所有值,也包括开始值和结束值。使用BETWEENAND关键字和NOT关键字进行查询,查询结果不包括开始值和结束值。7.2.8字符匹配查询使用LIKE关键字的查询又称为模糊查询,通常用于查询字段值包含某些字符的记录,语法形式如下:SELECT{*|col_list}FROMtable_nameWHEREcol_nameaLIKEvalueb;上述语句中,valueb表示要匹配的字符。LIKE关键字一般与通配符“%”或者“_”配合使用,如果字段col_namea中的值包含valueb,此条记录就会被返回。通配符可以放在字符前,也可以放在字符后,还可以同时放在字符前后。1.通配符“%”通配符“%”可以匹配任意长度的字符,可以是0个,也可以是1个或多个。【实例7-18】执行SQL语句,查询goods表中name值以“果”开头的记录,结果如下:mysql>SELECT*FROMgoodsWHEREnameLIKE'果%';+++++++|id |type|name |price |num |add_time |+++++++|5|饮品|果汁 |3.00 |70 |2018-05-0513:40:40 |+++++++1rowinset(0.00sec)执行以下语句,可查询goods表中name值以“糖”结尾的记录。SELECT*FROMgoodsWHEREnameLIKE'%糖';执行以下语句,可查询goods表中name值包含“游”的记录。SELECT*FROMgoodsWHEREnameLIKE'%游%';执行以下语句,可查询goods表中name值以“休”开头,以“服”结尾的记录。SELECT*FROMgoodsWHEREnameLIKE'休%服';通过以上多个语句可以看出,通配符“%”可以出现在匹配字符的任意位置,并且可以匹配任意数目的字符。2.通配符“_”通配符“_”的使用方法与通配符“%”类似,都可以出现在匹配字符的任意位置,但通配符“_”只能匹配一个字符。【实例7-19】执行SQL语句,查询goods表中name值以“西”开头,“西”后有两个字符的记录,结果如下所示。mysql>SELECT*FROMgoodsWHEREnameLIKE'西__';+++++++|id |type|name |price |num |add_time |+++++++|1|书籍|西游记 |50.40 |20 |2018-01-0113:40:40 |+++++++1rowinset(0.00sec)如果要查询goods表中name值以“西”开头,“西”后有一个字符的记录,则执行以下语句即可。SELECT*FROMgoodsWHEREnameLIKE'西_';【提示】可以在表中插入一个name值为“西瓜”的记录,试试查询结果。7.2.9排序查询使用前面的方法查询到的结果是按照记录在表中的默认顺序进行排列的。如果需要将查询结果按照指定的顺序排列,可以使用ORDERBY关键字。语法形式如下:SELECT{*|col_list}FROMtable_nameORDERBYcol_namea[ASC|DESC];上述语句的意义是,按照字段col_namea对查询记录进行排序,col_namea可以为一个或多个字段,当有多个字段时,各字段之间使用英文逗号隔开。字段后的参数ASC代表按照升序进行排序,DESC代表按照降序进行排序,如果没有ASC或者DESC,默认按照升序排序。1.单字段排序在排序之前最好将有空值的记录补充完整,否则,空值记录将被排在最前面。【实例7-20】执行SQL语句,查询goods表中id、name和add_time字段的数据,并按照add_time字段值进行排序,结果如下:mysql>SELECTid,name,add_timeFROMgoodsORDERBYadd_time;++++|id |name|add_time |++++|1|西游记|2018-01-0113:40:40 ||2|牛奶糖|2018-02-0213:40:40 ||4|休闲西服|2018-04-0413:40:40 ||5|果汁|2018-05-0513:40:40 ||3|水果糖|2018-06-0911:20:55 |++++5rowsinset(0.00sec)2.多字段排序有些情况下,可能需要使用多个字段作为排序条件对查询结果进行排序。为查看查询结果,此处将第5条记录的price值改为2.5(与第3条记录值相同)。【实例7-21】执行SQL语句,查询goods表中所有记录,并按照price和num字段值进行排序,结果如下:mysql>SELECT*FROMgoodsORDERBYprice,num;+++++++|id |type|name|price |num |add_time |+++++++|5|饮品|果汁|2.50|70 |2018-05-0513:40:40 ||3|糖类|水果糖|2.50|100 |2018-06-0911:20:55 ||2|糖类|牛奶糖|7.50|200 |2018-02-0213:40:40 ||1|书籍|西游记|50.40|20 |2018-01-0113:40:40 ||4|服饰|休闲西服|800.00 |10 |2018-04-0413:40:40 |+++++++5rowsinset(0.00sec)由查询结果可以看出,系统会首先按照price字段值进行排序,对于price字段值相同的记录,再按照num字段值进行排序。3.降序排序如果需要对查询结果进行降序排序,可以使用DESC关键字。【实例7-22】执行SQL语句,将goods表中所有记录查询出来,并按照price字段降序排序,结果如下:mysql>SELECT*FROMgoodsORDERBYpriceDESC;+++++++|id |type|name|price |num |add_time |+++++++|4|服饰|休闲西服|800.00 |10 |2018-04-0413:40:40 ||1|书籍|西游记|50.40 |20 |2018-01-0113:40:40 ||2|糖类|牛奶糖|7.50 |200 |2018-02-0213:40:40 ||3|糖类|水果糖|2.50 |100 |2018-06-0911:20:55 ||5|饮品|果汁|2.50 |70 |2018-05-0513:40:40 |+++++++5rowsinset(0.00sec)在按照多字段排序时,也可以使用DESC关键字进行降序排序。【实例7-23】执行SQL语句,查询goods表中所有记录,并按照price字段和num字段进行排序,结果如下:mysql>SELECT*FROMgoodsORDERBYpriceDESC,num;+++++++|id |type|name|price |num |add_time |+++++++|4|服饰|休闲西服|800.00 |10 |2018-04-0413:40:40 ||1|书籍|西游记|50.40 |20 |2018-01-0113:40:40 ||2|糖类|牛奶糖|7.50 |200 |2018-02-0213:40:40 ||5|饮品|果汁|2.50 |70 |2018-05-0513:40:40 ||3|糖类|水果糖|2.50 |100 |2018-06-0911:20:55 |+++++++5rowsinset(0.00sec)由以上查询结果可以看出,查询结果按照price字段进行了降序排序,而按照num字段进行了升序排序。因此,如果需要按照多个字段进行降序排序,必须在每个字段后加上DESC关键字。7.2.10限制查询结果的数量实际应用中,数据库中的数据量通常是很大的,一般不会一次性将所有数据查询出来,此时就需要使用LIMIT关键字来限制查询结果的数量。语法形式如下:SELECT{*|col_list}FROMtable_nameLIMIT[offset_start,]row_count;上述语句中,“offset_start”表示起始位置,用于指定查询从哪一行开始,如果不指定,默认为0,从表的第一行记录开始查询;row_count表示查询出来的记录条数。接下来通过实例了解一下不指定起始位置,直接限制查询结果数量的情况。【实例7-24】执行SQL语句,将goods表中的前3条记录查询出来,结果如下:mysql>SELECT*FROMgoodsLIMIT3;+++++++|id |type|name|price |num |add_time |+++++++|1|书籍|西游记|50.40 |20 |2018-01-0113:40:40 ||2|糖类|牛奶糖|7.50 |200 |2018-02-0213:40:40 ||3|糖类|水果糖|2.50 |100 |2018-06-0911:20:55 |+++++++3rowsinset(0.00sec)如果指定起始位置(从0开始),则系统会从起始位置开始查询,返回总条数为显示条数的记录。【实例7-25】执行SQL语句,返回goods表中从第3条记录开始,总条数为3的记录,结果如下:mysql>SELECT*FROMgoodsLIMIT2,3;+++++++|id |type|name|price |num |add_time |+++++++|3|糖类|水果糖|2.50 |100 |2018-06-0911:20:55 ||4|服饰|休闲西服|800.00 |10 |2018-04-0413:40:40 ||5|饮品|果汁|2.50 |70 |2018-05-0513:40:40 |+++++++3rowsinset(0.00sec)由查询结果可以看出,当起始位置为“2”时,MySQL会从表的第3条记录开始查询。7.2.11使用图形化工具筛选数据使用NavicatforMySQL也可以实现在查询数据时按照一定条件进行筛选,具体步骤如下:步骤

1进入NavicatforMySQL后,选择要操作的数据库,然后选中需要操作的表,此处为goods,单击“打开表”按钮。步骤2单击“筛选”按钮,打开筛选编辑区。步骤

3单击筛选编辑区左上角的“添加”文字,编辑区会添加一条以表的第一个字段为主体的栏目,此处为id,单击“id”文字,打开字段列表,用户可根据实际需求选择字段。……(详见教材)【学生】聆听、思考、记录通过教师的讲解和演示,使学生了解基本查询语句和简单数据记录查询的相关知识第二节课问题导入(5min)【教师】提出以下问题:在数据库中,通常需要进行一些数据汇总操作,如何对这些数据进行汇总呢?【学生】思考、举手回答通过问题导入,引导学生主动思考,激发学生的学习兴趣传授新知(20min)【教师】通过学生的回答引入新知,介绍聚合函数和分组数据记录查询的相关知识7.3聚合函数和分组数据记录查询在数据库中,通常需要进行一些数据汇总操作。比如,要统计汇总商品种类或者统计整个公司的员工数等,此时就用到了聚合函数。MySQL所支持的聚合函数一共有以下5种。COUNT()函数:计算表中记录的条数。SUM()函数:计算字段值的总和。AVG()函数:计算字段值的平均值。MAX()函数:查询表中字段值的最大值。MIN()函数:查询表中字段值的最小值。实际应用中,聚合函数通常与分组查询一起使用。分组查询就是按照某个字段对数据记录进行分组,比如前面用到的goods表,可以按照商品类别对记录进行分组,然后使用聚合函数统计每个类别下的商品数量。7.3.1使用聚合函数查询使用聚合函数查询的基本语法形式如下:SELECTfunction(*|col_num)FROMtable_nameWHERECONDITION本节依然以db_shop数据库中的goods表为例进行操作,在操作之前,先执行以下语句,向数据表中追加5条记录。INSERTINTOgoods(id,type,name,price,num,add_time)VALUES(6,'书籍','论语',109,50,'2018-01-0313:40:40'),(7,'水果','西瓜',1.5,null,'2018-02-0513:40:40'),(8,'水果','苹果',3,100,'2018-03-0513:40:40'),(9,'服饰','牛仔裤',120,10,'2018-05-0413:40:40'),(10,'书籍','红楼梦',50.5,15,'2018-05-0613:40:40');1.COUNT()函数COUNT()函数用于统计数据记录条数,用于返回表中记录的条数,或者符合特定条件的记录条数。其使用方法有以下两种:COUNT(*):计算表中总的记录数,不管表字段中是否包含NULL值。COUNT(col_name):计算表中指定字段的记录数,在具体统计时将忽略NULL值。下面通过具体实例说明COUNT()函数的应用。【实例7-26】执行SQL语句,查询goods表中总的记录条数,执行结果如下。mysql>SELECTCOUNT(*)ASgoods_numFROMgoods;++|goods_num |++|10 |++1rowinset(0.06sec)由查询结果可以看出,COUNT(*)函数返回goods表中总的记录条数,返回的总数名称为goods_num。【提示】上述语句中使用AS关键字为字段取别名为goods_num,使得查询结果简单明了,AS关键字可省略。使用AS关键字不仅可以为字段取别名,还可为表取别名,其使用非常灵活。后面将多处用到该关键字,读者可留意其用法。【实例7-27】执行SQL语句,查询goods表中有库存(num值不为NULL)的记录条数,执行结果如下。mysql>SELECTCOUNT(num)ASgoods_numFROMgoods;++|goods_num |++|9 |++1rowinset(0.01sec)由查询结果可以看出,表中有9条记录还有库存,num值为空的记录被忽略。2.SUM()函数SUM()函数是一个求总和的函数,用于返回指定字段值的总和,或符合特定条件的指定字段值总和,在具体计算时将忽略NULL值。其使用方法如下:SUM(col_name)下面通过具体实例说明SUM()函数的应用。【实例7-28】执行SQL语句,查询goods表中商品库存的总和,执行结果如下。mysql>SELECTSUM(num)goods_numFROMgoods;++|goods_num|++|575|++1rowinset(0.04sec)3.AVG()函数AVG()函数通过计算返回的行数和每一行数据的和,得到指定列数据的平均值,在具体计算时将忽略NULL值。AVG()函数与GROUPBY一起使用,可以计算每个分组的平均值。其使用方式如下:AVG(col_name)【实例7-29】执行SQL语句,查询goods表中每个商品类别的平均价格,执行结果如下。mysql>SELECTtype,AVG(price)FROMgoodsGROUPBYtype;+++|type|AVG(price) |+++|书籍|69.966667 ||服饰|460.000000 ||水果|2.250000 ||糖类|5.000000 ||饮品|2.500000 |+++5rowsinset(0.03sec)GROUPBY用于分组查询,7.3.2节中将会详细介绍其用法。4.MAX()函数和MIN()函数MAX()函数和MIN()函数是用于求最大值和最小值的函数,可返回指定字段中的最大值和最小值,或者符合特定条件的指定字段值中的最大值和最小值。其使用方法如下:MAX(col_name):该方式可以实现计算指定字段值中的最大值,在具体计算时将忽略NULL值。MIN(col_name):该方式可以实现计算指定字段值中的最小值,在具体计算时将忽略NULL值。下面通过具体实例说明这两个函数的应用。【实例7-30】执行SQL语句,查询goods表中商品的最高价格和最低价格,执行结果如下。mysql>SELECTMAX(price)maxpri,MIN(price)minpriFROMgoods;+++|maxpri |minpri |+++|800.00 |1.50 |+++1rowinset(0.04sec)由查询结果可以看出,goods表中商品的最高价格和最低价格分别是800和1.5。7.3.2分组查询分组查询是将查询结果按照某个或多个字段进行分组,MySQL使用GROUPBY语句对数据进行分组。GROUPBY从字面上理解就是“根据(BY)一定的规则进行分组(GROUP)”。它的工作原理是按照一定的规则将一个数据集合划分成若干个小的区域,然后针对这些区域的数据进行处理,语法形式如下:SELECT{*|col_list}aggregate_funcFROMtable_nameGROUPBYcol_namea[HAVINGcondition];上述语句中,aggregate_func表示聚合函数,GROUPBY关键字通常与聚合函数一起使用;col_namea表示按照字段col_namea对数据进行分组。1.简单分组查询将GROUPBY关键字与聚合函数COUNT()一起使用,可以查询每组的数量。【实例7-31】执行SQL语句,将goods表中的记录按照type字段(商品类别)进行分组,并统计每组的数量,结果如下:mysql>SELECTtype,count(*)FROMgoodsGROUPBYtype;+++|type|count(*) |+++|书籍|3 ||服饰|2 ||水果|2 ||糖类|2 ||饮品|1 |+++5rowsinset(0.02sec)如果需要将每种类型中包含的商品名称显示出来,可以使用group_concat()函数。【实例

7-32】执行SQL语句,将goods表中的记录按照type字段进行分组,并显示每组中的商品名称,结果如下:mysql>SELECTtype,group_concat(name)FROMgoodsGROUPBYtype;+++|type|group_concat(name) |+++|书籍|西游记,论语,红楼梦 ||服饰|休闲西服,牛仔裤 ||水果|西瓜,苹果 ||糖类|牛奶糖,水果糖 ||饮品|果汁 |+++5rowsinset(0.00sec)2.使用HAVING过滤分组后数据GROUPBY和HAVING一起使用,可以指定显示记录所需满足的条件,只有满足条件的分组才会被显示。【实例7-33】执行SQL语句,将goods表中的记录按照type字段分组并统计每组的数量,然后只取商品数量大于1的分组,结果如下:mysql>SELECTtype,count(*)FROMgoodsGROUPBYtypeHAVINGCOUNT(*)>1;+++|type|count(*) |+++|书籍|3 ||服饰|2 ||水果|2 ||糖类|2 |+++4rowsinset(0.06sec)✈【教师】随机邀请学生回答以下问题:WHERE子句和HAVING子句都具有按照条件筛选数据的功能,两者的区别有哪些?✈【学生】聆听、思考、回答✈【教师】总结学生的回答WHERE子句和HAVING子句都具有按照条件筛选数据的功能,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论