IN子查询
在IN子查询中,使用IN谓词实现子查询和父查询的连接。
语法格式:
<表达式> [ NOT ] IN ( <子查询>)
说明:
在IN子查询中,首先执行括号内的子查询,再执行父查询,子查询的结果作为父查询的查询条件。
当表达式与子查询的结果集中的某个值相等时,IN关键字返回TRUE,否则返回FALSE;若使用了NOT,则返回的值相反。
比较子查询
比较子查询是指父查询与子查询之间用比较运算符进行关联。
语法格式:
<表达式> { < | <= | = | > | >= | != | <> } { ALL | SOME | ANY } ( <子查询> )
说明:
关键字ALL、SOME和ANY用于对比较运算的限制,ALL指定表达式要与子查询结果集中每个值都进行比较,当表达式与子查询结果集中每个值都满足比较关系时,才返回TRUE,否则返回FALSE;SOME和ANY指定表达式要只要与子查询结果集中某个值满足比较关系时,就返回TRUE,否则返回FALSE。
EXISTS子查询
在EXISTS子查询中,EXISTS谓词只用于测试子查询是否返回行,若子查询返回一个或多个行,则EXISTS返回TRUE,否则返回FALSE,如果为NOT EXISTS,其返回值与EXIST相反。
语法格式:
[ NOT ] EXISTS ( <子查询> )
说明:
在EXISTS子查询中,父查询的SELECT语句返回的每一行数据都要由子查询来评价,如果EXISTS谓词指定条件为TRUE,查询结果就包含该行,否则该行被丢弃。
【例6.31】查询选修1004课程的学生姓名。
mysql> SELECT sname AS 姓名
-> FROM student
-> WHERE EXISTS
-> (SELECT *
-> FROM score
-> WHERE score.sno=student.sno AND cno='1004'
-> );
查询结果:
+----------+
| 姓名 |
+----------+
| 刘清泉 |
| 张慧玲 |
| 冯涛 |
+----------+
3 rows in set (0.00 sec)
联合查询
联合查询将两个或多个SQL语句的查询结果集合并起来,利用联合进行查询处理以完成特定的任务,使用UNION关键字,将两个或多个SQL查询语句结合成一个单独SQL查询语句。
联合查询的基本语法如下:
语法格式:
<SELECT查询语句1>
{UNION | UNION ALL }
<SELECT查询语句2>
UNION语句将第一个查询中的所有行与第二个查询的所有行相加。不使用关键字ALL,消除重复行,所有返回行都是唯一的。使用关键字ALL,不去掉重复记录,也不对结果自动排序。
在联合查询中,需要遵循的规则为:
在构成联合查询的各个单独的查询中,列数和列的顺序必须匹配,数据类型必须兼容。
ORDER BY子句和LIMIT子句,必须置于最后一条SELECT语句之后。
【例6.32】查询性别为女及选修了课程号为4002的学生。
mysql> SELECT sno, sname, ssex
-> FROM student
-> WHERE ssex='女'
-> UNION
-> SELECT a.sno, a.sname, a.ssex
-> FROM student a, score b
-> WHERE a.sno=b.sno AND b.cno='4002';
查询结果:
+----------+----------+------+
| sno | sname | ssex |
+----------+----------+------+
| 191002 | 张慧玲 | 女 |
| 196001 | 董明霞 | 女 |
| 196002 | 李茜 | 女 |
| 196004 | 周俊文 | 男 |
+----------+----------+------+
4 rows in set (0.05 sec)