前面讲了MySQL中的很多查询,比如条件查询,分组聚合查询,连接查询。今天我就来说说MySQL中另外两个非常重要的查询,子查询和联合查询。
部分
01
子查询
子查询也称为嵌套查询,是将一条查询语句嵌套在另一条查询语句的WHERE子句或H***ING短语中。前者称为内部查询或子查询,后者称为外部查询或父查询。在整个SELECT语句中,首先计算子查询,然后将子查询的结果作为父查询的过滤条件。嵌套查询可以由几个简单的查询组成一个复杂的查询,用来增强SQL的查询能力。
1.用IN关键字查询
带有IN关键字的子查询是最常用的一种子查询,用于判断子查询的结果集中是否存在给定值。如果使用in关键字进行子查询,内部查询语句只返回一个数据列,其值将提供给外部查询进行比较。
#在学生表tb_student中,将学号出现在成绩表tb_score中(表明该学生选修了课程)的学生姓名查询出来SELECT studentNameFROM tb_studentWHERE tb_student.studentNo IN(SELECT DISTINCT tb_score, studentNo FROM tb_score);或SELECT DISTINCT studentNameFROM tb_student, tb_scoreWHERE tb_student.studentNo = tb_score.studentNo;
说明:MySQL在处理这类子查询时,实际上执行两个操作,即先执行内层查询,再执行外层查询,内层查询的结果作为外层查询的比较条件。还可以使用NOT IN来确定给定值不属于子查询的结果。但是,这种否定查询不能被连接查询重写。
2.带有比较运算符的子查询
带有比较运算符的子查询是指父查询和子查询之间通过比较运算符的连接。当用户可以确定内部查询返回单个值时,他们可以使用=,>;、& lt、gt;= 、& lt=、!=(<& gt)和其他比较运算符来构造子查询。
#查询班级“计算机17-1班”所有学生的学号、姓名SELECT studentNo, studentName FROMtb_studentWHERE classNo =(SELECT classNo FROM tb_classWHERE className = ‘计算机17-1班’)#查询与“李明”在同一个班学习的学生学号、姓名、班号SELECT studentNo, studentName, classNo FROMtb_student s1WHERE classNo =(SELECT classNo FROM tb_ students s2WHERE studentName=’李明’) AND studentName != ’李明’;#上面的最后一个条件,是为了从结果集中去掉李明本人。
比较运算符也可以用所有、部分或任何关键字构造子查询。ALL、SOME和ANY用于指定对比较运算符的限制。ALL用于指定表达式需要与子查询结果集中的每个值进行比较。当表达式满足与每个值的比较关系时,返回TRUE,否则返回FALSE。一些和任何是同义词,这意味着当子查询结果集中的一个值满足比较关系时,它将返回TRUE,否则将返回FALSE。
#查询男生中比某个女生出生年份晚的学生姓名和出生年份SELECT studentName, YEAR(birthday) FROM tb_studentWHERE ***=’男’ AND YEAR(birthday)>ANY(SELECT YEAR(birthday) FROM tb_student WHERE***=’女’);
3.带有EXISTS关键字的子查询
当使用关键字EXISTS构建子查询时,系统操作子查询以确定它是否返回结果集。如果子查询的结果集不是空,EXISTS返回的结果为真,将查询外部查询语句。如果子查询的结果集是空,则EXISTS返回的结果为FALSE,外部查询将不会被查询。
因为带有EXISTS的子查询只返回TRUE或FALSE,并且内部查询的SELECT子句给出了字段名的实际含义,所以它的目标列表达式通常使用星号“*”。对应EXISTS的是NOT EXISTS,用法相同。
#查询选修了课程号为“31002”的学生姓名SELECT studentName FROM tb_student aWHERE EXISTS(SELECT * FROM tb_score bWHERE a.studentNo= b.studentNo AND courseNo=’31002’);或SELECT studentName FROM tb_studentWHERE studentNo IN(SELECT studentNo FROM tb_score WHERE courseNo=’31002’);
注意:与IN中的关键字不同,关键字EXISTS IN outer WHERE子句不指定内部查询结果集与外部查询的比较条件。因此,使用关键字EXISTS构造子查询时,内部WHERE子句需要指定连接条件,即a.studentNo=b.studentNo
部分
02
联合查询
UNION关键字可用于将多个SELECT语句的结果组合成一个结果集。这种查询称为联合操作或联合查询。合并时,多个SELECT子句中对应的字段和数据类型必须相同。不使用下面的ALL关键字,而是在执行期间删除重复的记录,并且所有返回的行都是唯一的。使用all关键字不会删除重复记录并自动对结果进行排序。
语法是:
SELECT -FROM -WHEREUNION [ALL]SELECT -FROM -WHERE[...UNION [ALL]SELECT -FROM -WHERE]
示例:
#使用UNION查询选修了“管理学”或“计算机基础”的学生学号SELECT studentNo FROM tb_score, tb_courseWHERE tb_score .courseNo= tb_course. courseNoAND courseName=’管理学’UNIONSELECT studentNo FROM tb_score, tb_courseWHERE tb_score .courseNo= tb_course. courseNoAND courseName=’ 计算机基础’;
使用UNION语句时,应该注意以下几点:
UNION语句必须由两条或两条以上的SELECT语句组成,且彼此间用关键字UNION分隔。UNION语句中的每个SELECT子句必须包含相同的列、表达式或聚合函数。每个SELECT子句对应的目标列的数据类型必须兼容,目标列的数据类型不必完全相同,但必须是MySQL可以隐含转换的类型,例如,不同的数值类型或不同的日期类型。第一个SELECT子句对应的目标列名会被作 为UNION语句结果集的列名称。联合查询中只能使用一条ORDER BY自己或LIMIMT自己,且它们置于最后一条SELECT语句之后。
今天分享一下MySQL中的子查询和联合查询,对多级查询很有帮助。在我们的工作中,经常会用到子查询,因为很多数据不是存储在一个表中,所以需要进行多级查询。
本文来自一九九几的她投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/621412.html