SQL基础数据教程 2_第1页
SQL基础数据教程 2_第2页
SQL基础数据教程 2_第3页
SQL基础数据教程 2_第4页
SQL基础数据教程 2_第5页
已阅读5页,还剩92页未读 继续免费阅读

下载本文档

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

文档简介

任务5查询学生选课系统的单表数据——单表查询目录Contents学习目标5.1任务描述5.2知识准备5.2.1SELECT语句5.2.2简单查询5.2.3条件查询5.2.4聚合函数查询5.2.5分组查询5.2.6排序查询5.3任务实现5.4任务小结在任务4中,已经对scoredb数据库中的6张数据表department、student、course、teacher、score和teaching完成了数据的插入操作,每张表格中都存储了大量数据,若想从某一张数据表中精确的查找某条信息,例如查询王姓同学的学生信息,是否需要人工将每一条数据都筛选一遍呢?基于以上问题,本章将借助SELECT语句实现单表数据查询,从特定的单个数据表内精准检索出符合特定条件的数据列,并将这些数据呈现给用户。在本章节的学习过程中,要求学生熟练掌握书写查询语句的语法格式,透彻理解其背后的逻辑原理,还要求学生能够在已经创建好的数据表基础上,独立且准确地执行各类数据查询操作,切实将理论知识转化为实际的动手能力。查询学生选课系统的单表数据学习目标熟练掌握指定列的查询方法,并能灵活运用LIMIT子句实现对查询结果数量的精准限制,以满足特定的业务需求;全面精通WHERE子句在各种条件下的筛选查询技巧,能够根据不同的数据类型和复杂的逻辑关系,准确编写筛选条件,高效获取目标数据;深度掌握聚合函数与分组查询的有机结合运用,善于运用聚合函数对分组后的数据进行统计分析,从而挖掘出数据背后的潜在价值和规律。查询学生选课系统的单表数据5.1任务描述在数据库管理系统的日常运作里,单表查询是最基础且高频使用的操作之一。本章内容主要讲解在已经创建好的scoredb数据库中某张数据表实现数据查询,例如查询平均成绩大于60分学生的学号和平均成绩,SQL语句如下所示。SELECTAVG(grade),snoFROMscoreGROUPBYsnoHAVINGAVG(grade)>60;查询结果如图5-1所示。查询学生选课系统的单表数据5.1任务描述查询学生选课系统的单表数据图5-1查询平均成绩大于60分学生的学号和平均成绩借助SELECT语句,从特定的单个数据表内,精准检索出符合特定条件的数据列,并将这些数据呈现给用户,或者为后续的数据深度处理提供数据支撑。5.2知识准备在第4章创建的department、student、course、teacher、score和teaching这6张数据表内已存储了丰富的数据。当试图从这些已构建好的数据表中,检索出用户真正期望获取的信息时,SELECT语句无疑提供了极为有效的解决思路与实现途径。本章将对scoredb数据库中的各个数据表展开深入剖析。从最为基础的简单查询出发,逐步深入到带条件查询的精准数据筛选,再到分组查询的细致数据聚合,以及排序查询的有序数据呈现,进行全方位、详尽的讲解。查询学生选课系统的单表数据5.2.1SELECT语句SELECT查询作为SQL(结构化查询语言)中用于从数据库表中检索数据的基础语句,在数据查询操作中扮演着关键角色,以下是SELECT查询的语法格式。SELECT[ALL|DISTINCT]*|字段名1[[AS]新的字段名1][,字段名2,…]FROM表名或视图名[WHERE条件表达式][GROUPBY字段名1[,字段名2,…][ASC|DESC][HAVING条件表达式]][ORDERBY字段名1[ASC|DESC][,字段名2,…]][LIMIT[<起点>,]<行数>];查询学生选课系统的单表数据5.2.1SELECT语句下面对上述语法格式中的各个部分进行详细介绍。(1)SELECT:该关键字用于明确指定要从数据库表中检索的列,其中:①ALL与DISTINCT:可选关键字:ALL:返回所有记录(包括重复行);DISTINCT:仅返回唯一记录(去重),在最终的查询结果中,那些重复的行将会被自动剔除,保证数据的唯一性和简洁性。若省略该参数,默认值为ALL。②*、字段名1和[,字段名2,…]表示要查询的列,其中:*:代表选择表中的所有列;[,字段名2,…]:指部分列名,若查询的是多个列名,用英文逗号分隔。在实际使用中,上面两种情况可以灵活满足不同的查询需求。查询学生选课系统的单表数据5.2.1SELECT语句③[AS]新的字段名1表示为查询的列名起别名,其中:AS:定义别名的关键字,可省略;别名含空格时,需用英文单引号包裹;省略该参数则不使用别名。(2)FROM:指定要查询的数据源的关键字,可以是数据表或视图;(3)WHERE条件表达式:属于SQL查询语句中的可选子句,其中:①WHERE是用于指定查询筛选条件的关键字;②条件表达式为表示条件的句子(例如

id=1、nameLIKE'张三'

等);③若省略该参数,则表示不对查询结果设置任何筛选条件,会返回查询范围内的所有数据。(4)GROUPBY字段名1[,字段名2,…][ASC|DESC][HAVING条件表达式]]为可选字句,作用是按照指定的一个或多个列(属性)对查询结果集进行分组聚合,其中:查询学生选课系统的单表数据5.2.1SELECT语句①GROUPBY

是用于指定分组依据的关键字;②字段名1[,字段名2,...]

表示分组所依据的列名(可指定单个或多个列,多列时按列的顺序逐层分组);③ASC|DESC是可选的排序指令,用于指定分组结果的排序方式(ASC为升序,DESC为降序,省略时默认升序);④HAVING条件表达式1是可选的分组筛选条件子句,用于对分组后的结果进行筛选(区别于WHERE对原始数据的筛选);⑤通常情况下,HAVING子句需要与GROUPBY子句结合使用,通过该关键字可以过滤掉不满足特定条件的分组,使查询结果更加符合实际需求。⑥省略整个GROUPBY子句时,表示不对结果集进行分组,查询结果会以原始行的形式返回。查询学生选课系统的单表数据5.2.1SELECT语句(5)ORDERBY字段名1[ASC|DESC][,字段名2,…]:为可选子句,按照指定的一个或多个列(属性)对最终查询结果集进行排序,其中:①ORDERBY

是用于指定排序规则的关键字;②字段名1[,字段名2,...]

表示排序所依据的列名(可指定单个列,也可指定多个列,多列时按列的顺序依次排序,即先按第一列排,第一列值相同时再按第二列排,以此类推);③ASC|DESC是可选性,用于对查询结果按指定列排序,使数据呈现更具条理性,其中:ASC(Ascending):升序排序(如数字从小到大、字符串按字母顺序),是默认值,省略时自动按升序处理;DESC(Descending):降序排序(如数字从大到小、字符串按字母逆序);省略整个

ORDERBY

子句时,查询结果的顺序由数据库底层存储或执行计划决定,通常是无序的(不可依赖该默认顺序)。查询学生选课系统的单表数据5.2.1SELECT语句(6)LIMIT[起点,]行数:可选子句,用于限制返回的记录数。可以通过指定一个具体的数字,来精确控制结果集中包含的行数,避免获取过多不必要的数据。需要特别注意的是,上述语法格式虽然相对复杂,但其中带有[]的部分都是可以根据实际查询需求省略的。因此,对于初学者而言,可以先暂时去掉所有带有[]的查询子句,从最简单的查询语句入手进行学习,逐步掌握SELECT查询的使用技巧。此外,语法格式中子句的位置是固定的,不可随意更改,否则将会导致语法错误,影响查询的正常执行。查询学生选课系统的单表数据5.2.2简单查询单表查询中的简单查询主要是指从单个数据表中检索数据,帮助用户快速获取所需数据,是进一步学习条件查询、分组和排序查询的基础。1.所有列查询在SQL中,要从数据表的所有列中检索数据,可以使用SELECT语句,使用“*”通配符查询所有字段,FROM指定要查询的数据表的关键字,语法格式如下。SELECT*FROM表名;查询学生选课系统的单表数据5.2.2简单查询1.所有列查询【例5.1】查询library数据库中图书表(books)的所有信息,SQL语句如下。SELECT*FROMbooks;执行结果如图5-2所示。查询学生选课系统的单表数据图5-2图书表所有列查询结果5.2.2简单查询2.指定列查询指定列数据查询是根据用户的特定需求或数据库的实际应用场景,仅返回某张表中的部分字段,无需查询出表中的所有字段信息,只需在SELECT关键字后列出要查询的字段即可,SQL语句如下。SELECT字段名1,字段名2……字段名nFROM表名;注意:当SELECT后列出所有字段时,与使用“*”通配符的效果相同。查询学生选课系统的单表数据5.2.2简单查询2.指定列查询【例5.2】查询读者表(readers)中所有读者的“读者姓名(reader_name)”和“联系电话(phone)”,SQL语句如下。SELECTreader_name,phoneFROMreaders;执行结果如图5-3所示。查询学生选课系统的单表数据图5-3查询读者表的部分列5.2.2简单查询3.DISTINCT语句当执行SELECT语句时,若表中的某些字段未设置唯一性约束,那么这些字段很可能会出现重复值。为了获取不重复的数据,MySQL提供了DISTINCT关键字。该关键字的核心作用是返回唯一且不重复的记录,当在SELECT语句中使用DISTINCT关键字时,查询结果将仅包含不重复的值。具体而言,DISTINCT关键字通过对表中指定列的值进行比较,剔除重复的记录,仅保留唯一的记录,这对于从表中获取唯一值列表非常有效。例如,若有一个存储客户信息的表,希望获取所有不重复的城市列表,可使用“SELECTDISTINCTCityFROMCustomers;”这样的查询语句。查询学生选课系统的单表数据5.2.2简单查询3.DISTINCT语句需要注意的是,DISTINCT关键字仅适用于SELECT语句,不能用于INSERT、UPDATE或DELETE语句。此外,当应用于多个列时,DISTINCT关键字会综合考虑这些列的组合是否唯一,若多列组合产生了不同的结果,这些行将被视为不同,不会被去重处理。查询学生选课系统的单表数据5.2.2简单查询4.LIMIT语句在MySQL数据库中,LIMIT语句的主要功能是对查询结果集的数量进行限制。该关键字允许用户指定返回的记录数量,以及从哪一条记录开始返回,这对于优化查询性能或仅获取结果集的部分数据极为有用。通常情况下,LIMIT语句会与ORDERBY子句配合使用,以确保返回的记录按照特定顺序排列。LIMIT语句是MySQL中一个十分实用的功能,能帮助用户更高效地管理和检索数据。LIMIT子句可接受一个或两个参数,具体用法如下。查询学生选课系统的单表数据5.2.2简单查询4.LIMIT语句(1)不指定初始位置,语法格式如下。SELECT字段名1,字段名2,...FROM表名LIMITrow_count;其中row_count表示要返回的记录数。例如,LIMIT5表示返回数据表中前5条记录。查询学生选课系统的单表数据5.2.2简单查询4.LIMIT语句【例5.3】查询借阅记录表(borrow_records)中前2条记录的“记录号(recordid)”和“借书日期(borrow_date)”,SQL语句如下。SELECTrecordid,borrow_dateFROMborrow_recordsLIMIT2;执行结果如图5-4所示。查询学生选课系统的单表数据图5-4查询借阅记录表前2条记录5.2.2简单查询4.LIMIT语句(2)指定初始位置,语法格式如下。SELECT字段名1,字段名2,...FROM表名LIMIToffset,row_count;其中offset表示要跳过的记录数(从0开始计数),row_count表示要返回的记录数。例如,LIMIT10,5表示跳过前10条记录,从第11条数据开始依次返回后5条记录。查询学生选课系统的单表数据5.2.2简单查询4.LIMIT语句【例5.4】查询图书表(books)中从第2条记录开始的2条记录的“书名(title)”和“库存数量(quantity)”,SQL语句如下。SELECTtitle,quantityFROMbooksLIMIT1,2;执行结果如图5-5所示。查询学生选课系统的单表数据图5-5查询图书表第2条记录开始的2条记录5.2.2简单查询5.AS关键字设置别名在MySQL中,AS关键字主要用于为表或列设置别名。合理设置别名能够使查询结果更易于理解和引用,特别是在涉及多个表或复杂计算的查询场景中,以下是AS关键字设置别名的详细使用方法。(1)为列设置别名若要为查询结果中的某一列设置别名,可在列名后使用AS关键字,随后紧跟定义的别名。该别名在查询的其余部分以及结果集中均可使用,其语法格式如下所示。SELECT字段名AS别名FROM表名;查询学生选课系统的单表数据5.2.2简单查询5.AS关键字设置别名【例5.5】查询读者表(readers)的“读者编号(reader_id)”,并将其别名为“用户ID”,SQL语句如下。SELECTreader_idAS用户IDFROMreaders;执行结果如图5-6所示。查询学生选课系统的单表数据图5-6为读者表的读者编号命名别名5.2.2简单查询5.AS关键字设置别名(2)为表设置别名在为表设置别名时,AS关键字也是可选的,但通常都会使用它来提高可读性。别名在查询的JOIN子句、WHERE子句以及SELECT子句中都可以使用,其语法格式如下所示。SELECT表别名.字段名FROM原表名AS表别名;查询学生选课系统的单表数据5.2.2简单查询5.AS关键字设置别名(2)为表设置别名注意事项:

别名在查询的当前作用域内是有效的,即它们只能在定义它们的查询块(如子查询)内部使用。

别名的设置通常是为了提高可读性和简化查询,同时也可用于解决列名冲突的问题(例如,在JOIN操作中当两个表存在相同名称的列时)。

在为列设置别名时,若别名包含空格、特殊字符或保留字,需使用引号将其括起来,为了避免潜在问题,建议别名仅由字母、数字和下划线组成,且不以数字开头。

在为列或表设置别名时,AS关键字可以省略。查询学生选课系统的单表数据5.2.2简单查询5.AS关键字设置别名【例5.6】将借阅记录表(borrow_records)的别名改为br,并查询其“书号(bookid)”和“还书日期(return_date)”,SQL语句如下。SELECTbr.bookid,br.return_dateFROMborrow_recordsASbr;执行结果如图5-7所示。查询学生选课系统的单表数据图5-7为借阅记录表命名别名5.2.3条件查询如果需要有条件的从数据表中查询数据,可以使用WHERE关键字来指定查询条件,WHERE关键字的语法格式如下。SELECT字段名1,字段名2FROM表名WHERE查询条件;其中,查询条件涵盖多种类型,具体包括:(1)带比较运算符和逻辑运算符的查询条件(2)带BETWEENAND关键字的查询条件(3)带ISNULL关键字的查询条件(4)带IN关键字的查询条件(5)带LIKE关键字的查询条件查询学生选课系统的单表数据5.2.3条件查询1.带比较运算符和逻辑运算符的查询条件在第三章节已对运算符进行了详细讲解,在此仅罗列一些常用的运算符。比较运算符有:>(大于)、<(小于)、=(等于)、>=(大于等于)、<=(小于等于)、!=(不等于)等;逻辑运算符包含AND(&&,逻辑与)、OR(||,逻辑或)和NOT(逻辑非)。单一的比较运算符仅能满足单个条件的查询需求。若要实现多个条件的查询,则需要将逻辑运算符与比较运算符相结合。在WHERE关键字之后可以设置多个查询条件,从而使查询结果更加精确。多个查询条件之间使用逻辑运算符AND(&&)和OR(||)进行分隔,它们的具体作用如下。AND(&&):只有当满足WHERE后面的所有查询条件时,才会返回查询结果。OR(||):只要满足WHERE后面的任一查询条件,就会返回查询结果。查询学生选课系统的单表数据5.2.3条件查询1.带比较运算符和逻辑运算符的查询条件【例5.7】查询图书表(books)中“库存数量(quantity)大于30且出版社(publisher)为人民文学出版社”的图书的书名(title)和库存数量,SQL语句如下。SELECTtitle,quantityFROMbooksWHEREquantity>30ANDpublisher='人民文学出版社';执行结果如图5-8所示。查询学生选课系统的单表数据图5-8查询库存数量大于30且出版社为人民文学出版社的图书信息5.2.3条件查询2.带BETWEENAND关键字的查询条件在数据库查询操作中,BETWEENAND运算符主要用于筛选出某个特定范围内的数据。这个范围由两个明确指定的值(value1和value2)来界定,并且该运算符会将这两个边界值也包含在内。在SQL(结构化查询语言)中,它被广泛应用于从大量数据中筛选出符合特定条件的数据子集的场景,其语法格式如下。SELECT字段名1,字段名2…FROM表名

WHERE字段名[NOT]BETWEEN值1AND值2;查询学生选课系统的单表数据5.2.3条件查询2.带BETWEENAND关键字的查询条件BETWEENAND关键字的作用如下:(1)筛选数据:允许用户依据一个或多个列的值来筛选数据。例如,用户可以根据商品的价格、事件发生的日期、人员的年龄等数值或日期类型的列来进行数据筛选。(2)简化查询:使用BETWEENAND可以使查询语句更加简洁明了、易于阅读,特别是在需要选择一系列连续的值时。相较于使用多个OR条件的组合,BETWEENAND通常更加直观,执行效率也更高。(3)包含边界值:该运算符会将指定的两个边界值值1和值2都包含在内。也就是说,如果指定的范围是10到20,那么值为10和20的记录都会被纳入查询结果中。(4)数据类型兼容性:虽然BETWEENAND主要适用于数值和日期类型的数据,但它也可以用于字符类型的数据,尽管在实际应用中这种情况相对较少。对于字符类型的数据,比较是基于字符的字典顺序来进行的。(5)结合其他条件:BETWEENAND可以与其他查询条件(如WHERE子句中的其他条件)灵活组合使用,从而创建出更为复杂的查询逻辑。查询学生选课系统的单表数据5.2.3条件查询2.带BETWEENAND关键字的查询条件【例5.8】查询图书表(books)中“库存数量(quantity)在25到50之间”的图书的书号(bookid)、书名(title)和库存数量,SQL语句如下。SELECTbookid,title,quantityFROMbooksWHEREquantityBETWEEN25AND50;执行结果如图5-9所示。查询学生选课系统的单表数据图5-9查询库存数量在25到50之间的图书信息5.2.3条件查询3.带ISNULL关键字的查询条件在SQL查询过程中,ISNULL关键字主要用于检查某个字段的值是否为空值(NULL)。在数据库中,NULL表示数据未知或缺失,它与0、空字符串('')以及其他任何非NULL值都有着本质的区别。因此,当需要筛选或查询那些某个字段值为空的记录时,ISNULL关键字就发挥着关键作用,其语法格式如下。SELECT字段名1,字段名2…FROM表名

WHERE字段名ISNULL;查询学生选课系统的单表数据5.2.3条件查询3.带ISNULL关键字的查询条件ISNULL关键字的作用如下:(1)筛选空值记录:能够精准地选择出某个字段值为NULL的记录,这在处理不完整或存在数据缺失的情况时非常实用。(2)确保数据完整性:在某些情况下,字段值为空可能意味着数据不完整或者存在错误。通过使用ISNULL,可以快速识别这些记录,进而采取相应的措施来修正或完善数据,保证数据的质量。(3)与其他条件结合使用:ISNULL可以与其他查询条件(如AND、OR等逻辑运算符连接的条件)灵活结合,构建出更为复杂的查询逻辑,满足多样化的查询需求。查询学生选课系统的单表数据5.2.3条件查询3.带ISNULL关键字的查询条件【例5.9】查询借阅记录表(borrow_records)中“还书日期(return_date)为空(未还书)”的记录号(recordid)和借书日期(borrow_date),SQL语句如下。SELECTrecordid,borrow_dateFROMborrow_recordsWHEREreturn_dateISNULL;执行结果如图5-10所示。查询学生选课系统的单表数据图5-10查询还书日期为空(未还书)的记录号和借书日期5.2.3条件查询3.带ISNULL关键字的查询条件需要注意以下几点:(1)NULL值在数据库中具有特殊的语义,它表示未知或缺失的数据。因此,不能使用=、!=或<>等常规的比较运算符来对NULL值进行比较。(2)在创建数据库表时,可以为那些不允许为空的列设置NOTNULL约束。这样一来,如果尝试向这些列中插入NULL值,数据库系统会返回错误提示,从而保证数据的有效性。与ISNULL相对应的是ISNOTNULL,它用于筛选出某个字段值不为NULL的记录。在SQL查询中,这两个关键字常常配合使用,以便更全面地筛选出满足或不满足特定条件的记录。总之,ISNULL关键字在SQL查询中占据着重要地位,它能够帮助用户高效地筛选和查询那些某个字段值为空的记录。通过合理运用ISNULL和其他SQL条件,可以构建出功能强大、灵活多样的查询逻辑,满足各种复杂的数据处理和分析需求。查询学生选课系统的单表数据5.2.3条件查询4.带IN关键字的查询条件在SQL查询中,IN关键字的核心作用是指定一个值的集合,用于与列中的值进行匹配。若想从表中选取某个列的值属于一个特定集合的记录时,IN关键字就成为了一个非常实用的工具。具体来说,IN关键字通常在WHERE子句中使用,允许用户指定一个值列表或一个子查询的结果集,并返回那些其列值在该列表或结果集中的记录,其语法格式如下。SELECT字段名1,字段名2…FROM表名

WHERE字段名[NOT]IN(值1,值2…);其中,值1,值2…是值列表,当列的值在列表中,条件表达式的运行结果为TRUE,否则为FALSE。NOT是可选项,加NOT则取反。查询学生选课系统的单表数据5.2.3条件查询4.带IN关键字的查询条件【例5.10】查询读者表(readers)中“读者编号(reader_id)为R001或R003”的读者姓名(reader_name)和联系电话(phone),SQL语句如下。SELECTreader_name,phoneFROMreadersWHEREreader_idIN('R001','R003');执行结果如图5-11所示。查询学生选课系统的单表数据图5-11读者编号为R001或R003的读者信息5.2.3条件查询5.带LIKE关键字的查询条件在SQL查询中,LIKE关键字主要用于在WHERE子句中进行模糊匹配操作。通过与通配符(通常是百分号%和下划线_)相结合,能够实现对文本数据的灵活查询,其语法格式如下。SELECT字段名1,字段名2…FROM表名

WHERE字段名LIKE‘匹配模式’;以下是对LIKE关键字及其通配符的详细解释和使用示例。(1)百分号%:代表零个或多个字符。例如'a%'将匹配以字母"a"开头的任何字符串。(2)下划线_:代表单个字符。例如'_r%'将匹配第二个字符为"r"的任何字符串。查询学生选课系统的单表数据5.2.3条件查询5.带LIKE关键字的查询条件【例5.11】查询图书表(books)中“书名包含‘记’字”的图书的书名和作者,SQL语句如下。SELECTtitle,authorFROMbooksWHEREtitleLIKE'%记%';执行结果如图5-12所示。查询学生选课系统的单表数据图5-12书名包含‘记’字的图书信息5.2.4聚合函数查询聚合函数查询作为SQL查询体系中的关键组成部分,它赋予用户对一组数据值进行计算的能力,并最终返回一个单一的结果值。在实际的数据处理场景中,尤其是在数据汇总、深入的统计分析以及报表生成等方面,这些聚合函数发挥着举足轻重的作用,为用户提供了强大且高效的数据处理手段,聚合函数查询的基本语法如下。SELECT聚合函数(字段名)AS[别名]FROM表名

WHERE查询条件;查询学生选课系统的单表数据5.2.4聚合函数查询上述语法结构介绍如下:(1)聚合函数主要有以下5种:①COUNT():表示统计行数(计数);②SUMSUM():表示求和(仅适用于数值型列);③AVG():求平均值(仅适用于数值型列);④MIN():求最小值(适用于数值/日期/字符串列);⑤MAX():求最大值(适用于数值/日期/字符串列)。(3)别名是一个可选参数,合理设置别名可以使查询结果更加清晰易读;(4)查询条件用于对数据进行筛选,以获取满足特定条件的数据进行聚合计算。查询学生选课系统的单表数据5.2.4聚合函数查询【例5.12】统计图书表(books)的总记录数,SQL语句如下。SELECTCOUNT(*)AS总记录数FROMbooks;注意,COUNT(*):用来统计books表所有行(不忽略NULL);AS总记录数:给结果列起别名,更易读;执行结果如图5-13所示。查询学生选课系统的单表数据图5-13统计图书表总记录数5.2.4聚合函数查询【例5.13】统计借阅记录表(borrow_records)中未还书(return_date)的借阅记录数(recordid),SQL语句如下。SELECTCOUNT(recordid)AS未还书记录数FROMborrow_recordsWHEREreturn_dateISNULL;注意:COUNT(recordid):统计borrow_records表中return_date为NULL的记录数(用主键recordid计数更精准)。执行结果如图5-14所示。查询学生选课系统的单表数据图5-14统计图书表未还书的借阅记录数5.2.4聚合函数查询【例5.14】统计图书表(books)所有图书的总库存(quantity)数量,SQL语句如下。SELECTSUM(quantity)AS图书总库存FROMbooks;注意:SUM(quantity):对books表的quantity(库存数量)列求和。执行结果如图5-15所示。查询学生选课系统的单表数据图5-15统计图书表总库存数量5.2.4聚合函数查询【例5.15】统计图书表(books)中“中华书局”出版图书的库存总和,SQL语句如下。SELECTSUM(quantity)AS中华书局库存总和FROMbooksWHEREpublisher='中华书局';执行结果如图5-16所示。查询学生选课系统的单表数据图5-16统计图书表中华书局出版图书的总库存数量5.2.4聚合函数查询【例5.16】计算图书表(books)的平均库存数量(quantity),SQL语句如下。SELECTAVG(quantity)AS图书平均库存FROMbooks;注意:AVG(quantity):对books表的quantity(库存数量)列求平均(总库存÷图书总数)。执行结果如图5-17所示。查询学生选课系统的单表数据图5-17统计图书表平均库存数量5.2.4聚合函数查询【例5.17】计算图书表(books)库存数量(quantity)>30的图书平均库存,SQL语句如下。SELECTAVG(quantity)AS库存超30的平均库存FROMbooksWHEREquantity>30;计算过程:50(西游记)+40(水浒传)=90→90÷2=45。执行结果如图5-18所示。查询学生选课系统的单表数据图5-18统计图书表平均库存数量5.2.4聚合函数查询【例5.18】查询图书表(books)中quantity的最小库存数量,SQL语句如下。SELECTMIN(quantity)AS最小库存数量FROMbooks;执行结果如图5-19所示。查询学生选课系统的单表数据图5-19查询库存最小的图书数量5.2.4聚合函数查询【例5.19】查询借阅记录表(borrow_records)中最早的借书日期(日期型列,borrow_date),SQL语句如下。SELECTMIN(borrow_date)AS最早借书日期FROMborrow_records;执行结果如图5-20所示。查询学生选课系统的单表数据图5-20查询最早的借书日期5.2.4聚合函数查询【例5.20】查询图书表(books)中库存最多的图书数量(quantity)及书名,SQL语句如下。SELECTMAX(quantity)AS最大库存数量,titleAS书名FROMbooks;执行结果如图5-21所示。查询学生选课系统的单表数据图5-21查询库存最多的书名及图书数量5.2.4聚合函数查询【例5.21】查询借阅记录表(borrow_records)中最晚的借书日期(日期型列,borrow_date),SQL语句如下。SELECTMAX(borrow_date)AS最晚借书日期FROMborrow_records;WHEREreturn_dateISNOTNULL;--仅统计已还书的记录执行结果如图5-22所示。查询学生选课系统的单表数据图5-22查询最晚的借书日期注意:已还书记录仅BR001,借书日期2025-10-01,最晚借书日期为2025-10-01。5.2.4聚合函数查询聚合函数查询的注意事项:(1)NULL值处理:在执行聚合函数查询的过程中,NULL值一般会被系统自动忽略。这就表明,在进行聚合计算时,NULL值不会对最终的计算结果产生影响。然而,如果在特定的业务场景中需要对NULL值进行特殊处理,例如将其视为0或者某个默认值,那么就需要在查询语句中运用相应的函数或者逻辑来实现对NULL值的合理处理,以确保计算结果的准确性和业务逻辑的完整性。(2)性能问题:当处理大规模的数据集时,聚合函数查询可能会引发性能方面的问题。由于数据量较大,聚合计算可能会消耗较多的系统资源和时间。因此,在进行聚合查询操作时,应当充分考虑使用索引或者其他性能优化技术,如合理分区、优化查询语句结构等,以有效提高查询效率,减少查询时间,提升系统的整体性能表现。查询学生选课系统的单表数据5.2.4聚合函数查询(3)数据类型:需要注意的是,某些聚合函数,比如SUM、AVG等,只能应用于数值类型的列,而不能用于字符串类型或者日期类型的列。这是由这些函数的计算逻辑和数据类型的兼容性所决定的。因此,在使用聚合函数时,务必确保所应用的列的数据类型是正确的,以避免出现错误或者不符合预期的查询结果。查询学生选课系统的单表数据5.2.5分组查询在运用SELECT语句进行数据查询时,不仅可以获取所需的数据,还能够对查询结果进行分组和统计操作,从而深入挖掘数据背后的信息。其中GROUPBY子句发挥着关键作用,它主要用于依据一个或多个字段对数据进行分组,并且常常与聚合函数搭配使用,以实现对不同分组数据的统计分析,其基本语法结构如下。SELECT字段名1[,字段名2,…],聚合函数(字段名)FROM表名

WHERE查询条件GROUPBY字段名1[,字段名2,…];查询学生选课系统的单表数据5.2.5分组查询上述语法结构介绍如下:(1)字段名1[,字段名2,…]代表着要依据其值进行分组的列,通过对这一列数据的分组,将数据划分为不同的子集;(2)聚合函数如COUNT、SUM、AVG等,用于对分组后的数据进行计算;(3)字段名则是要对其应用聚合函数的列,通过聚合函数对这一列数据的处理,得出每个分组的统计结果;(4)查询条件用于在分组之前对数据进行筛选,确保参与分组和统计的数据符合特定的要求。(5)GROUPBY

是用于指定分组依据的关键字;字段名1[,字段名2,...]

表示分组所依据的列名(可指定单个或多个列,多列时按列的顺序逐层分组)。查询学生选课系统的单表数据5.2.5分组查询做查询之前,首先向图书表中录入一些数据,SQL语句如下。INSERTINTObooks(bookid,title,author,publisher,quantity)VALUES('B005','朝花夕拾','鲁迅','人民文学出版社',28),('B006','数据结构与算法','严蔚敏','人民邮电出版社',45),('B007','Python编程:从入门到实践','埃里克·马瑟斯','人民邮电出版社',60),('B008','Java核心技术','凯·霍斯特曼','人民邮电出版社',38),('B009','宋词选注','钱钟书','中华书局',35),('B010','资治通鉴','司马光','中华书局',22),查询学生选课系统的单表数据5.2.5分组查询('B011','茶馆','老舍','三联书店',45),('B012','边城','沈从文','三联书店',30),('B013','百年孤独','加西亚·马尔克斯','三联书店',32),('B014','围城','钱钟书','三联书店',48);【例5.22】在图书表books中,按出版社分组,统计每个出版社的图书种类总数。首先,执行如下的查询SQL语句,图书表books中的数据如图5-23所示。SELECT*FROMbooks;查询学生选课系统的单表数据5.2.5分组查询查询学生选课系统的单表数据图5-23查询图书表books中所有数据5.2.5分组查询然后,在图书表books中,按出版社分组,按书号统计每个出版社的图书种类总数,SQL语句如下。SELECTpublisherAS出版社,COUNT(bookid)AS图书种类总数FROMbooksGROUPBYpublisher;说明:(1)publisherAS出版社:将列名publisher重命名为出版社,publisher为分组的列;(2)COUNT(bookid)AS图书种类总数:首先利用聚合函数COUNT(bookid)通过书号计算图书种类的数量,然后通过AS将其重命名为图书种类总数;(3)GROUPBYpublisher:按照publisher列进行分组。查询学生选课系统的单表数据5.2.5分组查询执行结果如图5-24所示。查询学生选课系统的单表数据图5-24统计每个出版社的图书总数5.2.5分组查询【例5.23】在图书表books中,按出版社分组,统计“库存数量>30”的图书中,每个出版社的库存总和,SQL语句如下。SELECTpublisherAS出版社,SUM(quantity)AS库存总和FROMbooksWHEREquantity>30--分组前筛选:只保留库存>30的图书GROUPBYpublisher;说明:SUM(quantity)AS库存总和:首先利用聚合函数SUM(quantity)通过库存数量计算图书的总和,然后通过AS将其重命名为库存总和。查询学生选课系统的单表数据5.2.5分组查询执行结果如图5-25所示。查询学生选课系统的单表数据图5-25统计每个出版社的库存总和5.2.5分组查询另外,还可以在GROUPBY子句后面加上HAVINGcondition字句,HAVINGcondition是可选的分组筛选条件子句,用于对分组后的结果进行筛选(区别于WHERE对原始数据的筛选)。通常情况下,HAVING子句需要与GROUPBY子句结合使用,通过该关键字可以过滤掉不满足特定条件的分组,使查询结果更加符合实际需求。查询学生选课系统的单表数据5.2.5分组查询【例5.24】在图书表books中,按书号统计图书总数,仅保留“图书数≥3”的出版社,SQL语句如下。SELECTpublisherAS出版社,COUNT(bookid)AS图书总数FROMbooksGROUPBYpublisherHAVINGCOUNT(bookid)>=3;说明:HAVINGCOUNT(bookid)>=3:分组后筛选:仅保留图书数≥3的分组。查询学生选课系统的单表数据5.2.5分组查询执行结果如图5-26所示。查询学生选课系统的单表数据图5-26统计图书数≥3的每个出版社的图书总数通过结果可以看出,人民文学出版社(图书数=2)因不满足HAVING条件被过滤。5.2.5分组查询【例5.25】在图书表books中,先筛选“库存>20”的图书,再按出版社分组统计总库存,仅保留“总库存≥100”的出版社,SQL语句如下。SELECTpublisherAS出版社,SUM(quantity)AS总库存FROMbooksWHEREquantity>20GROUPBYpublisherHAVINGSUM(quantity)>=100;说明:(1)WHEREquantity>20:分组前筛选,排除库存≤20的行;(2)HAVINGSUM(quantity)>=100:分组后筛选,仅保留总库存≥100的分组。查询学生选课系统的单表数据5.2.5分组查询执行结果如图5-27所示。查询学生选课系统的单表数据图5-27统计每个出版社的库存总和5.2.5分组查询执行结果如图5-27所示。HAVING子句和WHERE关键字的区别:(1)一般情况下,WHERE用于过滤数据行,而HAVING用于过滤分组。(2)WHERE查询条件中不可以使用聚合函数,而HAVING查询条件中可以使用聚合函数。(3)WHERE在数据分组前进行过滤,而HAVING在数据分组后进行过滤

。(4)WHERE针对数据库文件进行过滤,而HAVING针对查询结果进行过滤。即WHERE根据数据表中的字段直接进行过滤,而HAVING是根据前面已经查询出的字段进行过滤。(5)WHERE查询条件中不可以使用字段别名,而HAVING查询条件中可以使用字段别名。查询学生选课系统的单表数据5.2.6排序查询在执行查询语句后,查询到的数据通常会按照其最初被添加到表中的顺序进行显示。然而在实际应用中,查询结果往往希望能够按照用户的特定需求进行排序,以便更直观地查看和分析数据。为此,MySQL提供了ORDERBY关键字,它是SQL查询语句中用于对查询结果进行排序的主要子句。ORDERBY允许用户根据一个或多个字段对查询结果进行排序,并且排序方式可以是升序(ASC,默认的排序方式)或降序(DESC),在前面SQL语句的基础上,其语法格式如下。GROUPBY字段名1[ASC|DESC][,字段名2,…][ASC|DESC];其中,字段名1为排序所依据的字段名称;[,字段名2,...]代表排序依据的字段可以设置多个,多个字段名称之间需以英文逗号作为分隔符。查询学生选课系统的单表数据5.2.6排序查询【例5.26】在图书表books中,按出版社分组,按书号统计每个出版社的图书总数,最后按照图书总数降序排序,SQL语句如下。SELECTpublisherAS出版社,COUNT(bookid)AS图书总数FROMbooksGROUPBYpublisherORDERBY图书总数DESC;查询学生选课系统的单表数据5.2.6排序查询执行结果如图5-28所示。查询学生选课系统的单表数据图5-28统计每个出版社的库存总和此外,在对多个字段进行排序时,只有当排序的第一个字段存在相同的值时,才会对第二个字段进行排序操作。如果第一个字段数据中的所有值都是唯一的,MySQL将不再对第二个字段进行排序。在默认情况下,查询数据会按照字母升序(A~Z)进行排序,但数据的排序方式并不仅限于此,还可以通过在ORDERBY中使用DESC关键字对查询结果进行降序排序(Z~A),以满足不同的排序需求。5.3任务实现在本章中,主要完成的任务是使用SQL语句实现简单查询、带条件查询和分组与排序查询,下面以scoredb数据库举例进行详细介绍。5.3.1简单查询操作【例5.27】查询scoredb数据库中student的所有信息,SQL语句如下。USEscoredb;SELECT*FROMstudent;【例5.28】查询scoredb数据库中student的所有信息,SQL语句如下。USEscoredb;SELECTsno,sname,classno,deptnoFROMstudent;查询学生选课系统的单表数据5.3任务实现5.3.1简单查询操作上述【例5.27】和【例5.28】的查询效果一致,均会返回student表中的全部数据,查询结果如图5-29所示。查询学生选课系统的单表数据图5-29所有列查询结果5.3任务实现5.3.1简单查询操作【例5.29】查询scoredb数据库中student的学号和姓名信息,SQL语句如下。SELECTsno,snameFROMstudent;查询结果如图5-30所示,由该结果可以清晰看出,SELECT语句后所书写的字段,即为返回结果中显示的字段内容。查询学生选课系统的单表数据图5-30指定列查询结果5.3任务实现5.3.1简单查询操作【例5.30】查询scoredb数据库中student表从第5条记录开始取3条信息,SQL语句如下。SELECTsno,snameFROMstudentLIMIT4,3;查询结果如图5-31所示。查询学生选课系统的单表数据图5-31LIMIT关键字查询结果5.3任务实现5.3.1简单查询操作【例5.31】查询scoredb数据库中student的学号和姓名信息,将查询结果中的sno字段更名为学号,sname更名为学生姓名,SQL语句如下。SELECTsnoAS学号,snameAS学生姓名FROMstudent;查询结果如图5-32所示。查询学生选课系统的单表数据图5-32AS关键字取别名查询结果5.3任务实现5.3.1简单查询操作【例5.32】查询scoredb数据库中student的学号和姓名信息,将查询结果中的student更名为学生表,SQL语句如下。SELECT学生表.sno,学生表.snameFROMstudentAS学生表;查询学生选课系统的单表数据5.3任务实现5.3.2条件查询操作【例5.33】查询成绩超过80分的学生学号,SQL语句如下。SELECTsnoFROMscoreWHEREgrade>80;查询结果如图5-33所示。查询学生选课系统的单表数据图5-33成绩超过80

温馨提示

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

评论

0/150

提交评论