版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数据库技术7.1查询语句的基础7.1查询语句的基础
查询是对存储在MySQL中的数据的一种请求。数据表在接受查询请求时,会逐行判断数据是否符合查询条件,若符合则提取出来,并以一个或多个结果集的形式返回给用户。结果集是对来自SELECT语句的数据的表格排列,与MySQL表相似,结果集由行和列组成,通常也被称为记录集(RecordSet)。7.1查询语句的基础
由于结果集的结构与表的结构非常接近,都是行列组成,因此可以在结果集上再次进行查询,即在已查询的基础上进一步查询。在MySQL中,查询可以通过以下几种方式发出:
使用MySQLWorkbench或phpMyAdmin等图形用户界面(GUI)工具,用户可以从一个或多个MySQL表中选择想要查看的数据。
使用MySQL命令行客户端或MySQLShell的用户可以发出SELECT语句。
客户端或基于中间层的应用程序(例如使用Python、Java、PHP等编写的应用程序)可以将MySQL表中的数据映射到绑定控件(如数据网格)。
尽管查询可以以多种方式与用户交互,但它们的核心任务都是相同的:为用户提供SELECT语句的结果集。即使用户使用图形化工具且未直接编写SELECT语句,客户端软件也会将用户的查询转换为SELECT语句并发送到MySQL服务器。SELECT语句的基本结构7.1.17.1.1SELECT语句的基本结构虽然SELECT语句的完整语法可能较为复杂,但大多数SELECT语句都涵盖了结果集的四个核心属性:
结果集中的列的数量及其特性。对于每个结果集列,需明确以下属性:
列的数据类型。
列的大小(对于字符串类型)以及数值列的精度和小数位数。
数据值的来源列。
检索数据的表及其间的逻辑关系。
源表行需满足的条件,以符合SELECT语句要求。不符合条件的行将被排除。
结果集行的排序方式。语法格式如下:SELECT[ALL|DISTINCT]select_listFROMtable_list[WHEREsearch_conditions][GROUPBYgroup_by_list][HAVINGsearch_conditions][ORDERBYorder_list[ASC|DESC]][LIMITrow_count[OFFSEToffset]]7.1.1SELECT语句的基本结构参数说明:(1)[ALL|DISTINCT](可选):用于指定检索行的类型。
ALL:默认选项,表示检索表中所有符合条件的行,包括重复的行。
DISTINCT:表示仅检索唯一不同的行,即排除重复的行。
select_list:描述结果集的列。它是一个由逗号分隔的表达式列表。通常,每个选择列表表达式都是对源表或视图中的列的引用,但也可以是常量、函数等表达式。使用*可返回源表的所有列。(2)FROMtable_list:包含从中检索数据的表的列表。这些来源可以是:
MySQL数据库中的基表。
视图。
通过JOIN语句连接的多个表。(3)WHEREsearch_conditions(可选):定义源表中的行需满足的条件,以符合SELECT语句要求。(4)GROUPBYgroup_by_list(可选):根据group_by_list列中的值将结果集分组。(5)HAVINGsearch_conditions(可选):对结果集进行附加筛选。通常与GROUPBY子句一起使用。(6)ORDERBYorder_list[ASC|DESC](可选):定义结果集中行的排序顺序。order_list指定排序的列,ASC表示升序(默认),DESC表示降序。(7)LIMITrow_count(可选):限制返回的行数。条件表达式的构建7.1.27.1.2条件表达式的构建
在MySQL中,条件表达式用于在SELECT、INSERT、UPDATE和DELETE等语句中根据特定条件筛选或修改数据。条件表达式通常由比较运算符、逻辑运算符和函数组成。7.1.2条件表达式的构建1.比较运算符比较运算符用于比较(除TEXT和BLOB类型外)两个表达式值,并返回一个布尔结果(TRUE、FALSE或NULL)。常见的比较运算符包括如表7.1所示。7.1.2条件表达式的构建2.逻辑运算符逻辑运算符。逻辑运算符用于对某些条件进行测试,以获得其真实情况。逻辑运算符和比较运算符一样,返回TRUE或FLASE值。逻辑运算符如表7.2所示。7.1.2条件表达式的构建3.范围比较BETWEEN和IN用于范围比较。(1)当要查询的条件是某个值的范围时,可以使用BETWEEN关键字。BETWEEN关键字指出查询范围的格式为:表达式[NOT]BETWEEN表达式1AND表达式2注意:表达式1的值不能大于表达式2的值。(2)使用IN关键字可以指定一个值表,值表中列出所有可能的值,当与值表中的任一个匹配时,即返回TRUE,否则返回FALSE。使用IN关键字指定值表的格式为:表达式IN(表达式1[,…n])注意:IN关键字最主要的作用是表达子查询。4.模式匹配LIKE运算符用于指出一个字符串是否与指定的字符串相匹配,其运算对象可以是char、varchar、text、datetime等类型的数据,返回逻辑值TRUE或FALSE。使用LIKE进行模式匹配时,常使用特殊符号_和%,可进行模糊查询。“%”代表0个或多个字符,“_”代表单个字符。由于MySQL默认不区分大小写,要区分大小写时需要更换字符集的校对规则。7.1.2条件表达式的构建5.空值比较ISNULL空值比较。在MySQL中,处理空值(NULL)比较时需要特别注意,因为NULL在SQL中表示“未知”或“无值”,它不同于空字符串('')或零值(0)。注意:
要检查一个列的值是否为NULL,应使用ISNULL条件。
要检查一个列的值是否不为NULL,应使用ISNOTNULL条件。6.函数在MySQL中,内置函数为数据处理提供了强大的工具,这些函数可以根据数据的类型分为字符串函数、数值函数、日期和时间函数等。我们将在项目9中详细介绍。谢谢数据库技术7.2单表查询7.2单表查询单表查询是数据库操作的基础,涉及从单一表中检索数据。主要步骤包括选择表、指定所需列、应用条件表达式筛选数据。
选择表中的列7.2.17.2.1选择表中的列1.输出表中的所有列输出表中的所有列,有两种方法,一种是将所有的字段名在select关键字后列出,一种是用星号“*”代替所有的字段,当使用星号“*”时,结果集中的列的顺序与CREATETABLE、ALTERTABLE或CREATEVIEW语句中所指定的顺序相同。任务1:查询全体学生的记录信息。代码如下:
SELECT*FROMstudents;运行结果如图7.1所示。7.2.1选择表中的列任务2:查询所有班级信息。代码如下:SELECTcls_id,cls_nameFROMclasses;运行结果如图7.2所示:7.2.1选择表中的列2.输出表中的特定列要选择表中的特定列,应在选择列表中明确地列出每一个特定列。任务3:查询学生的姓名和性别。代码如下:SELECTstu_name,stu_genderFROMstudents;运行结果如图7.3所示:7.2.1选择表中的列3.输出计算列选择表中的列时可以包含通过对一个或多个简单表达式应用运算符而生成的表达式。即在结果集中显示基表中不存在,但是根据基表中存储的值计算得到的值。任务4:查询成绩表中所有学生的学号和平均分。代码如下:SELECTstu_id,AVG(sc_grade)FROMscores运行结果如图7.4所示:图7.4查询成绩表中所有学生的学号和平均分7.2.1选择表中的列注意:(1)使用SUM(),AVG(),COUNT(),MAX(),MIN()等聚合函数来计算列的总和、平均值、数量、最大值和最小值。 ·(2)聚合函数对一组值执行计算并返回单一值,只能用于SELECT语句中,并且通常与GROUPBY子句一起使用,以便对数据进行分组。(3)当使用聚合函数时,SELECT列表中未包含在聚合函数中的其他列必须出现在GROUPBY子句中。(4)因为WHERE子句是在数据分组和聚合之前对数据进行过滤,而聚合函数是在数据分组后对每个分组进行计算的。所以在WHERE子句中不能出现聚合函数。(5)HAVING子句是用于对聚合查询结果进行过滤的。它允许在GROUPBY子句之后使用聚合函数来设置条件,从而筛选出满足特定聚合条件的分组。7.2.1选择表中的列4.为结果集中的列指定列名在任务4中的查询结果中我们可以看到,通过计算得到的列“平均分”,列标题显示为“AVG(sc_grade)”。在实际应用中我们可以根据需要利用AS子句来更改结果集中列的名称或为列指定别名。AS子句语法格式如下:SELECTcolumn_nameASalias_name-–列名AS列别名,给列指定别名SELECTt1.column_nameFROMtable1ASt1--表名as表别名,给表指定别名说明:
在SELECT子句中定义的别名可以在ORDERBY、GROUPBY和HAVING子句中引用,但不能在WHERE子句中引用,因为WHERE子句在SELECT子句之前执行。
可以省略AS关键字,但在编写SQL查询时,为了清晰和一致性,建议明确地使用。7.2.1选择表中的列任务5:查询显示成绩表中所有学生的学号和平均分。要求计算得到的字段用平均分字段名表示。代码如下:SELECTstu_id,AVG(sc_grade)AS平均分FROMscoresGROUPBYstu_id;运行结果如图7.5所示:选择查询7.2.27.2.2选择查询
选择查询从表中检索数据或进行计算的查询,是最基础且最常用的查询类型。于从数据库表中检索数据。可以选择特定的列、使用条件过滤行、排序结果集以及限制返回的行数。7.2.2选择查询1.查询条件WHERE和HAVING子句中的搜索条件或限定条件如表7.1所示。7.2.2选择查询2.运算符条件设置设置
在两个表达式之间可以使用运算符来进行比较,在比较字符串数据时,主要基于字符集和排序规则。首先,MySQL会根据字符集确定字符串中可以包含的字符。其次,排序规则决定了字符的比较方式,包括是否区分大小写。在比较时,MySQL会先比较字符串的长度,长度不同的字符串直接按长度排序;长度相同的字符串则按字典序(ASCII值或Unicode码点)进行比较。此外,还可以使用BINARY关键字进行二进制比较,或使用LIKE和REGEXP运算符进行模糊匹配和正则表达式匹配。任务6:查询成绩表中平均分高于80分的学生的学号和平均分。代码如下:SELECTstu_id,AVG(sc_grade)AS平均分FROMscoresGROUPBYstu_idHAVING平均分>80;--在SELECT子句中定义的别名可以在HAVING子句中引用运行结果如图7.6所示:7.2.2选择查询3.范围条件设置范围搜索中BETWEEN返回的是介于两个指定值之间的所有值,NOTBETWEEN是不返回与两个指定值匹配的任何值。任务7:查询显示学生表中2002年出生的所有学生的学号、姓名和出生日期。代码如下:SELECTstu_id,stu_name,stu_birthFROMstudentsWHEREstu_birthBETWEEN'2002-1-1'AND'2002-12-31';运行结果如图7.7所示:7.2.2选择查询4.列表条件设置IN关键字可以选择与列表中的任意值匹配的行。IN关键字之后的各项必须括在括号中并用逗号隔开。任务8:查询显示学生表中民族为白族和藏族的学生的学号、姓名和民族。代码如下:SELECTstu_id,stu_name,stu_nationFROMstudentsWHEREstu_nationIN('藏','傣');运行结果如图7.8所示:7.2.2选择查询5.字符匹配条件设置LIKE关键字可以查询与指定模式匹配的字符串、日期或时间值,与之相匹配的可以是完整的字符串,也可以包含通配符,任务9:查询显示学生表中姓“张”的学生的学号、姓名和民族。字段用学号、姓名和民族表示代码如下:SELECTstu_idAS学号,stu_nameAS姓名,stu_nationAS民族FROMstudentsWHEREstu_namelike'张%';运行结果如图7.9所示:7.2.2选择查询6.空值查询NULL值表示列的数据值未知或不可用。语法格式为:列表达式is[NOT]Null任务10:查询显示学生表中简历为空值的学生的学号、姓名和简历。代码如下:SELECTstu_id,stu_name,stu_resumeFROMstudentsWHEREstu_resumeISNULL;运行结果如图7.10所示:7.2.2选择查询任务11:查询显示学生表中简历不为空值的学生的学号、姓名和简历。代码如下:SELECTstu_id,stu_name,stu_resumeFROMstudentsWHEREstu_resumeISnotNULL;运行结果如图7.11所示:7.2.1选择表中的列注意:
在MySQL中,空值(NULL)和空串('',即两个单引号之间没有字符)是两个完全不同的概念。
空值表示未知或缺失的数据。它不是一个有效的值,而是一个特殊的标记,用于指示该字段没有值。在数据库中,空值通常不占用存储空间(具体取决于数据库的实现)。它只是一个标记,表示该字段没有数据。空值不能与任何值(包括空串)进行比较。必须使用
ISNULL或
ISNOTNULL
来判断一个字段是否为空值。
空串是一个长度为0的字符串。它是一个有效的值,表示该字段有一个值,但这个值是一个空字符串。空串在数据库中占用存储空间(尽管很少),因为它仍然是一个字符串对象,只是没有字符而已。空串可以与任何值进行比较,包括其他空串。使用=
或
!=
运算符来比较空串和其他字符串。7.2.2选择查询7.条件组合查询使用逻辑运算符AND、OR、NOT连接可以实现条件组合查询。任务12:查询显示学生表中名字由四个字符组成,性别为“女”的学生的学号、姓名和性别。代码如下:SELECTstu_id,stu_name,stu_genderFROMstudentsWHEREstu_nameLIKE'____'ANDstu_gender='女';运行结果如图7.12所示:分类汇总与排序7.2.37.2.3分类汇总与排序
在实际应用中,用户经常需要对结果集中的数据进行统计,例如在“学生信息管理系统”数据库中我们需要对学生的人数进行统计,对学习成绩进行分析,这些统计查询可以通过聚合函数、COMPUTE子句、GROUPBY子句来实现。7.2.3分类汇总与排序1.使用聚合函数
聚合函数对一组值执行计算,并返回单个值。除了COUNT函数以外,聚合函数都会忽略空值。聚合函数经常与SELECT语句的GROUPBY子句一起使用。常用的聚合函数有:
AVG([ALL|DISTINCT]<列名>),返回组中各值的平均值,其中忽略Null值,此列的数据类型必须是数值型。
COUNT([ALL|DISTINCT]<列名>),COUNT_BIG([ALL|DISTINCT]<列名>)。返回组中的个数,两个函数唯一的差别是它们的返回值。COUNT始终返回int数据类型值。COUNT_BIG始终返回bigint数据类型值。
MAX([ALL|DISTINCT]<列名>),返回表达式中的最大值。
MIN([ALL|DISTINCT]<列名>),返回表达式的最小值。
SUM([ALL|DISTINCT]<列名>),返回表达式中所有值的和。参数说明:ALL是不取消重复项,ALL为默认值。DISTINCT是去掉指定列中的重复值。7.2.3分类汇总与排序任务13:查询课程编号为“230101”课程的最低成绩。代码如下:SELECTcrs_id,MIN(sc_grade)AS最低分FROMscoresWHEREcrs_id='230101';运行结果如图7.13所示:7.2.3分类汇总与排序2.对结果分组GROUPBY子句是将查询结果集按一列或多列进行分组,并对每一组进行统计。语法如下:[GROUPBYgroup_by_list][HAVINGsearch_conditions]参数说明:“BYgroup_by_list”按列名指定的字段进行分组。“HAVINGsearch_conditions”对生成的组筛选后再对满足条件的组进行统计。任务14:查询每门课程的选课人数。代码如下:SELECTcrs_id,COUNT(*)AS选课人数FROMscoresGROUPBYcrs_id;运行结果如图7.14所示:7.2.3分类汇总与排序3.HAVING子句
HAVING子句是SQL中用于对分组后的结果进行过滤的子句。它通常与GROUPBY
子句一起使用。HAVING子句中的条件可以包含聚合函数,如COUNT、SUM、AVG等。但是,HAVING子句中的聚合函数不能作用于非分组列。HAVING子句中不能使用WHERE
子句中的某些限制条件(如LIKE、IN、BETWEEN等),因为这些条件是在数据分组之前进行筛选的,而HAVING是在数据分组之后进行筛选的。任务15:查询选修人数少于50人的课程编号和相应的选课人数。代码如下:SELECTcrs_id,COUNT(*)AS选课人数FROMscoresGROUPBYcrs_idHAVINGCOUNT(*)<50;运行结果如图7.15所示:7.2.3分类汇总与排序3.对结果排序任务16:查询选修了课程编号为“230101”课程的学生学号、成绩,按成绩从高到低排序。代码如下:SELECTstu_id,crs_id,sc_gradeFROMscoresWHEREcrs_id='230101'ORDERBYsc_gradeDESC;运行结果如图7.16所示:7.2.3分类汇总与排序4.LIMIT子句LIMIT子句是SQL中用于限制查询结果返回行数的子句,它通常与SELECT语句一起使用。语法格式如下:LIMITrow_count[OFFSEToffset];参数说明:
row_count:指定要返回的最大行数。
OFFSET:可选参数,指定从哪一行开始返回结果(从0开始计数)。如果省略,则默认从第一行开始。7.2.3分类汇总与排序任务17:查询各门课程的平均分,显示平均分由高到低排名前6的课程的课程编号、平均分。代码如下:SELECTcrs_id,AVG(sc_grade)as平均分FROMscoresGROUPBYcrs_idORDERBY平均分DESCLIMIT6;运行结果如图7.17所示:7.2.3分类汇总与排序任务18:查询各门课程的平均分,显示平均分由高到低排名第3到第5的课程的课程编号、平均分。代码如下:SELECTcrs_id,AVG(sc_grade)as平均分FROMscoresGROUPBYcrs_idORDERBY平均分DESCLIMIT2,3;运行结果如图7.17所示:注意:如果初始值不是从头开始,需要使用参数:偏移量、行数。记录是从0开始计数的。谢谢数据库技术7.3多表查询7.3多表查询MySQL多表查询是通过SQL语句在多个表之间检索数据的过程,常用方法包括INNERJOIN(内连接)、LEFTJOIN(左连接)、RIGHTJOIN(右连接)和FULLJOIN(全连接,MySQL中不直接支持,需通过UNION模拟)。通过指定连接条件和选择字段,实现跨表数据获取。
连接(JOIN)的类型与使用7.3.17.3.1连接(JOIN)的类型与使用1.内连接(INNERJOIN)内连接查询返回两个表中满足连接条件的匹配行。它是最常用的连接类型,查询的是两张表交集的部分。内连接有两种语法形式,隐式内连接和显式内连接是,其中显式内连接使用INNERJOIN关键字,而隐式内连接则直接在WHERE子句中指定连接条件。7.3.1连接(JOIN)的类型与使用(1)隐式内连接语法格式如下:SELECT列名1,列名2,...FROM表1,表2WHERE表1.连接字段=表2.连接字段;参数说明:列名1,列名2,...:要检索的字段列表,可以来自表1、表2或两者都有。表1,表2:要连接的表名。WHERE表1.连接字段=表2.连接字段:连接条件,指定了两个表中用于匹配的字段。7.3.1连接(JOIN)的类型与使用任务19:查询选修了课程编号为“230101”课程的学生学号、姓名、课程编号、成绩。代码如下:SELECTstudents.stu_id,stu_name,crs_id,sc_gradeFROMstudents,scoresWHEREstudents.stu_id=scores.stu_idandcrs_id='230101';运行结果如图7.19所示:说明:在scores表中可以查询到学生的学号、课程编号、成绩,不能查询到同学的姓名。但如果知道学生的学号,可以到students表中查找到对应的同学姓名。这就可以用多表查询来完成。由于两个表中都有stu_id字段,所以在连接这两个表时,需要明确指定stu_id字段来自哪一张表,以避免歧义。7.3.1连接(JOIN)的类型与使用(2)显式内连接语法格式如下:SELECT列名1,列名2,...FROM表1INNERJOIN表2ON表1.连接字段=表2.连接字段;;参数说明:
列名1,列名2,...:同样表示要检索的字段列表。
表1:第一个要连接的表名。
INNERJOIN表2:使用INNERJOIN关键字连接第二个表。
ON表1.连接字段=表2.连接字段:通过ON子句指定连接条件。7.3.1连接(JOIN)的类型与使用任务20:查询选修了课程编号为“230203”课程的学生学号、姓名、课程编号、成绩。代码如下:SELECTstudents.stu_id,stu_name,crs_id,sc_gradeFROMstudentsINNERJOINscoresONstudents.stu_id=scores.stu_idWHEREcrs_id='230203';运行结果如图7.19所示:注意:
隐式内连接和显式内连接在逻辑上是等价的,但显式内连接通常更易于阅读和维护。
在处理复杂查询时,显式内连接可以帮助你更清晰地表达查询逻辑。
在某些情况下,隐式内连接可能会导致性能问题,因为数据库优化器可能无法像处理显式连接那样有效地优化查询计划。因此,建议使用显式内连接。7.3.1连接(JOIN)的类型与使用2.外连接(OUTERJOIN)在内部连接操作中只有当两个表中至少有一个行符合联接条件时,才返回行,因为内部连接消除了两个表中不匹配的行。而外部联接则会返回FROM子句中至少一个表或视图中的所有行,只要这些行符合WHERE或HAVING搜索条件的。外连接分为左外连接(LEFTJOIN或LEFTOUTERJOIN)、右外连接(RIGHTJOIN或RIGHTOUTERJOIN)和全外连接(FULLJOIN)。MySQL不直接支持FULLJOIN。左外连接就是将左表作为主表,主表中所有行分别与右表中的每一行进行连接,结果集中除了满足连接条件的行外,还有主表中不满足连接条件的行,在右表的相应列上自动填充NULL值。右外连接则相反。7.3.1连接(JOIN)的类型与使用任务21:查找所有学生的学号,姓名和成绩信息,若学生没有选修课程,也要显示其信息。代码如下:SELECTstudents.stu_id,stu_name,scores.*FROMstudentsLEFTJOINscoresONstudents.stu_id=scores.stu_id;如果不使用左外连接,查询结果中不会包含没有选修过课程的同学信息。使用了左外连接后,结果集中返回的行中有没用选修过的同学信息,相应的行的成绩信息为NULL。运行结果如图7.21所示:子查询与嵌套查询7.3.27.3.2子查询与嵌套查询
在MySQL中,子查询和嵌套查询被视为处理复杂SQL查询需求的同一概念的不同表述方式。从字面含义上解析,“子查询”一词更多地聚焦于查询之间的层级或嵌套关系,意味着一个查询作为另一个查询的组成部分存在;相对而言,“嵌套查询”则更强调查询结构的层次性,即一个查询被另一个查询所包裹。然而,在MySQL的实际应用中,这两个术语具有相同的含义,均指在一个查询语句内部嵌入另一个查询语句。为了保持术语的一致性和清晰性,本书统一采用“子查询”这一表述来指代这种查询结构。这样的定义有助于我们更准确地理解和运用MySQL中的复杂查询技术。
子查询基本语法格式如下:SELECT列名
FROM表名
WHERE列名
比较运算符(SELECT列名FROM表名WHERE条件);
括号内的部分即为子查询。子查询可以用在WHERE子句、HAVING子句、SELECT子句(作为计算列)等位置。7.3.2子查询与嵌套查询1.使用IN的子查询使用IN(或NOTIN)的子查询结果是包含零个值或多个值的列表。IN子查询用于检查某个值是否存在于另一个查询的结果集中。适用于过滤记录,根据一个字段的值是否匹配另一个查询返回的集合来决定是否包含该记录。任务22:查询19计算机应用1班,19旅游管理1班学生的信息。代码如下:SELECT*FROMstudentsWHEREcls_idIN(SELECTcls_idFROMclassesWHEREcls_name='19计算机应用1班'ORcls_name='19旅游管理1班');运行结果如图7.22所示:在运行包含子查询的SELECT语句时,系统先运行子查询,产生一个结果表,再运行查询。在本任务中,先运行子查询“SELECTcls_idFROMclassesWHEREcls_name='19计算机应用1班'ORcls_name='19旅游管理1班'”,得到一个只含有班级编号的表;再运行外查询,如果学生表中某行的班级编号列值等于子查询结果表中的任意一个值,则该行就会被选择。7.3.2子查询与嵌套查询2.使用比较运算符的的子查询常用的比较运算符有:=、>、<、>=、<=、<>、!=。直接使用比较运算符的子查询(即后面不接ANY或ALL的比较运算符)必须返回单个值而不是值列表。因为比较运算符设计用于单个值之间的比较。如果子查询返回了多于一个的值,MySQL会抛出一个错误。任务23:查询选修了“230301”号课程,且成绩高于该课程平均分的学生的学号。代码如下:查询选修了“230301”号课程,且成绩高于该课程平均分的学生的学号。SELECTstu_idFROMscoresWHEREsc_grade>(SELECTAVG(sc_grade)FROMscoresWHEREcrs_id='230301')ANDcrs_id='230301';运行结果如图7.23所示:在这个任务中,首先查询计算课程编号为“'230301”这门课程的平均分(单个值),然后再根据这个平均分找到所有选修了该课程,且成绩高于平均分的学生student_id。7.3.2子查询与嵌套查询任务23:查询选修了“230301”号课程,且成绩高于该课程平均分的学生共有多少人。代码如下:SELECTcount(stu_id)as高于平均分人数FROMstudentsWHEREstu_idIN(SELECTstu_idFROMscoresWHEREsc_grade>(SELECTAVG(sc_grade)FROMscoresWHEREcrs_id='230301')ANDcrs_id='230301');运行结果如图7.24所示:在这个任务中中,最内层的子查询首先查询计算课程编号为“'230301”这门课程的平均分,然后中层的子查询根据这个平均分找到所有选修了该课程,且成绩高于平均分的学生student_id,最后外层的查询根据这些stu_id找到对应的学生信息,并进行统计计数。7.3.2子查询与嵌套查询2.使用比较运算符的的子查询常用的比较运算符有:=、>、<、>=、<=、<>、!=。直接使用比较运算符的子查询(即后面不接ANY或ALL的比较运算符)必须返回单个值而不是值列表。因为比较运算符设计用于单个值之间的比较。如果子查询返回了多于一个的值,MySQL会抛出一个错误。任务23:查询选修了“230301”号课程,且成绩高于该课程平均分的学生的学号。代码如下:查询选修了“230301”号课程,且成绩高于该课程平均分的学生的学号。SELECTstu_idFROMscoresWHEREsc_grade>(SELECTAVG(sc_grade)FROMscoresWHEREcrs_id='230301')ANDcrs_id='230301';运行结果如图7.23所示:在这个任务中,首先查询计算课程编号为“'230301”这门课程的平均分(单个值),然后再根据这个平均分找到所有选修了该课程,且成绩高于平均分的学生student_id。7.3.2子查询与嵌套查询3.使用ANY(或SOME)、ALL的子查询ANY(或SOME)、ALL关键字,可以与比较运算符结合使用,以便在子查询返回的值集合中进行比较。ANY(或SOME):SOME与ANY是同义词,在MySQL中它们是等价的。如果外部查询中的值与子查询返回的集合中的任何一个值满足比较条件,则返回TRUE,否则返回FALSE。ALL:如果外部查询中的值与子查询返回的集合中的所有值都满足比较条件,则返回TRUE,否则返回FALSE。7.3.2子查询与嵌套查询任务25:查询选修了“230301”号课程,学生的学号,姓名。先查找选修了“230301”号课程的同学的学号。代码如下:SELECTstu_idFROMscoresWHEREcrs_id='230301';运行结果如图7.25所示:因为有多名同学选修了“230301”号课程,所以在子查询中要用ANY(或SOME)。任务25的代码如下:SELECTstu_id,stu_nameFROMstudentsWHEREstu_id=ANY(SELECTstu_idFROMscoresWHEREcrs_id='230301');运行结果如图7.26所示:图7.25查询选修了“230301”号课程的同学的学号图7.26查询选修了“230301”号课程,学生的学号,姓名7.3.2子查询与嵌套查询本任务也可以用IN子查询,任务25的代码与下例语句是代码是等价的。SELECTstu_id,stu_nameFROMstudentsWHEREstu_idIN(SELECTstu_idFROMscoresWHEREcrs_id='230301');7.3.2子查询与嵌套查询任务26:查询比“51020171”班中所有学生年龄都小的其他班的学生的学号与姓名。要完成这个任务,需要先知道班级编号为51020171班同学的出生日期,因为“51020171”班级中不只有一名同学,所以会有多个出生日期,可以通过以下代码查询“51020171”班同学的出生日期,代码如下:SELECTstu_birthFROMstudentsWHEREcls_id='51020171';运行结果如图7.27所示:因为比“51020171”班同学年龄都小就是比子查询中每一条记录的出生日期都要大,所以在子查询的比较条件中要用ALL,任务26的代码如下:SELECTstu_id,stu_nameFROMstudentsWHEREstu_birth>ALL(SELECTstu_birthFROMstudentsWHEREcls_id='51020171');运行结果如图7.28所示:图7.27查询“51020171”班同学的出生日期图7.28查询比“51020171”班中所有学生年龄都小的其他班的学生的学号与姓名7.3.2子查询与嵌套查询5.使用EXISTS的子查询EXISTS用于检查子查询是否返回任何行。如果子查询返回至少一行,则EXISTS条件为真,否则为假。EXISTS通常用于提高查询效率,特别是在处理存在性检查时。EXISTS引出的子查询的目标列通常为*。任务27:查询选修了“230301”课程的学生的学号与姓名。代码如下:SELECTstu_id,stu_nameFROMstudentsWHEREEXISTS(SELECT*FROMscoresWHEREcrs_id='230301'ANDstu_id=students.stu_id);运行结果如图7.29所示:图7.29查询选修了“230301”课程的学生的学号与姓名
在这个任务中,虽然是单表查询,但查询条件使用了外查询的列名引用“students.stu_id”,表示这里的学号来自于表students。在这个任务中,内层查询要处理多次,因为内层查询与“students.stu_id”有关,在外层查询中students表的不同行有不同的学号。其处理过程是:首先查找外层查询中students的第一行,根据该行的“学号”列值处理内层查询,若结果不为空,则where条件为真,把该行的学号、姓名值取出作为结果集的一行;然后再找students表的第2,3,4……行,重复上述处理过珵直到students表的所有行都查找完为止。联合查询7.3.37.3.3联合查询MySQL实际上并不直接支持全连接(FULLJOIN)语法,但可以通过组合左连接(LEFTJOIN
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国牛肉行业市场运行动态及投资发展潜力分析报告
- 中国功能性糖醇行业市场集中度、投融资动态及未来趋势预测报告(智研咨询发布)
- 三七灰土方案
- 2026年最-新网络工程师职业考试试题与答案
- epdm塑胶跑道施工方案
- 2026年软考(网络工程师)考试试题与答案
- Z世代情绪价值消费驱动酸枣糕产品形态创新研究
- RCEP关税减让红利下东南亚美耐皿产能转移的投资套利空间
- ESG评级标准下冷藏羊肉项目环境合规成本与长期资本吸引力
- 2026年上海商学院高职单招笔试化学试题库含答案解析2套试卷
- 2025-2030中国整形外科植入物行业市场发展趋势与前景展望战略研究报告
- 2025年 安徽文化投资运营有限责任公司招聘笔试参考题库含答案解析
- 长期供货合同范本
- 酒店前台员工话术培训
- JJG 692-2010无创自动测量血压计
- 重症医学科进修汇报
- 四川省地图矢量经典模板(可编辑)
- 商周服饰-课件
- 最新老年高血压及其治疗课件
- LabVIEW-编程思想(第2版)
- 中华人民共和国史马工程课件00导论
评论
0/150
提交评论