在查询条件中,可以使用另一个查询的结果作为条件的一部分,例如,判定列值是否与某个查询的结果集中的值相等,作为查询条件一部分的查询称为子查询(也叫内层查询),包含子查询的SQL语句称为主查询(也叫外层查询)。为了标记子查询与主查询之间的关系,通常将子查询写在小括号内。子查询一般用在主查询的where子句或having子句中,与比较运算符或者逻辑运算符一起构成where筛选条件或having筛选条件。
SQL标准允许SELECT多层嵌套使用,以表示复杂的查询。子查询除了可以用在SELECT语句中,还可以用在INSERT、UPDATE及DELETE语句中。
1.IN子查询
IN子查询用于进行一个给定值是否在子查询结果集中的判断,其语法格式为:
expression [NOT] IN(subquery)
其中subquery是子查询。当表达式expression与子查询subquery的结果表中的某个值相等时,IN谓词返回TRUE,否则返回FALSE;若使用了NOT,则返回的值刚好相反。
【例5.24】查找选修了课程号为206的课程的学生姓名、学号。
查询结果如图5.20所示。
图5.20 IN子查询
2.比较子查询
这种子查询可以认为是IN子查询的扩展,它使表达式的值与子查询的结果进行比较运算,其语法格式为:
expression { < | <= | = | > | >= | != | <> } { ALL | SOME | ANY }(subquery)
其中expression为要进行比较的表达式,subquery是子查询。ALL、SOME和ANY说明对比较运算的限制。
ALL表示指定表达式要与子查询结果集中的每个值进行比较,当表达式与每个值都满足比较的关系时,才返回TRUE,否则返回FALSE。
SOME与ANY是同义词,表示表达式只要与子查询结果集中的某个值满足比较的关系时,就返回TRUE,否则返回FALSE。
【例5.25】查找选修了离散数学的学生学号。
查询结果如图5.21所示。
图5.21 比较查询结果
【例5.26】查找XSB表中比所有计算机系的学生年龄都大的学生学号、姓名、专业、出生时间。
(www.xing528.com)
查询结果如图5.22所示。
图5.22 all比较查询
3.EXISTS子查询
EXISTS谓词用于测试子查询的结果是否为空表,若子查询的结果集不为空,则EXISTS返回TRUE,否则返回FALSE。EXISTS还可与NOT结合使用,即NOT EXISTS,其返回值与EXISTS刚好相反。其语法格式为:
[NOT] EXISTS(subquery)
【例5.27】查找选修课程号为206的课程的学生姓名。
查询结果如图5.23所示。
图5.23 EXISTS子句查询
MySQL有4种类型的子查询:返回一个表的子查询是表子查询;返回带有一个或多个值的一行的子查询是行子查询;返回一行或多行,但每行上只有一个值的是列子查询;只返回一个值的是标量子查询。从定义上讲,每个标量子查询都是一个列子查询和行子查询。上面介绍的子查询都属于列子查询。
另外,子查询还可以用在SELECT语句的其他子句中。表子查询可以用在FROM子句中,但必须为子查询产生的中间表定义一个别名。SELECT关键字后面也可以定义子查询。
【例5.28】从XSB表中查找总学分大于50的男同学的姓名和学号。
查询结果如图5.24所示。
图5.24 子查询用在SELECT语句的其他子句中
【例5.29】从XSB表中查找所有女学生的姓名、学号和与081101号学生的年龄差距。
WHERE 性别=0;
查询结果如图5.25所示。
图5.25 SELECT关键字后面定义子查询结果
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。