自查询

多表查询的需求

前面的学习都是在单表中完成查询,但有时候会从多个表中查询数据。比如在学生信息表中查找某个同学的学号,然后根据学号在学生成绩表中查询该同学的所有成绩。使用单表查询就得写两条语句,如果有更多的查询,就非常的麻烦。

标量子查询

1
SELECT * FROM 表名1 WHERE xxx 条件表达式 (SELECT xxx FROM 表名2 WHERE yyy 条件表达式 具体值);

小括号中的查询语句称为子查询或者内层查询,使用内层查询的结果作为搜索条件的操作数的查询称为外层查询所有的子查询都必须用小括号扩起来

若子查询的结果只有一个值,那么这种自查询叫做标量自查询标量自查询只单纯的代表一个值。

1
SELECT (SELECT xxx FROM 表名 WHERE yyy 条件表达式 具体值) AS alias;

列子查询

列子查询的结果为多个值。

1
SELECT * FROM 表名1 WHERE xxx IN (SELECT xxx FROM 表名2 WHERE bbb 条件表达式 具体值);

行子查询

子查询的结果集中最多只包含一条记录,而且这条记录中超过一个列的数据,这个子查询称为行子查询

1
SELECT * FROM 表名1 WHERE (aaa, bbb) = (SELECT aaa, 具体值 FROM 表名2 LIMIT 1);

表子查询

子查询结果集中包含多行多列,这个子查询称为表子查询

1
SELECT * FROM 表名1 WHERE (aaa, bbb) IN (SELECT aaa, 具体值1 FROM 表名2 WHERE ccc = 具体值2);

EXISTS 和 NOT EXISTS 子查询

查看子查询是否为空集。

操作符 示例 描述
EXISTS EXISTS (SELECT ...) 当子查询结果集不是空集时表达式为真
NOT EXISTS NOT EXISTS(SELECT ...) 当子查询结果集是空集时表达式为真

不相关子查询和相关子查询

不相关子查询

子查询单独运行并产生结果之后,作为外层查询的条件去执行外层查询,这种子查询称为不相关子查询

相关子查询

子查询的语句中需要引用到外层查询的值,这种子查询称为相关子查询

1
SELECT * FROM 表名1 WHERE EXISTS (SELECT * FROM 表名1 WHERE 表名1.xxx = 表名2.xxx);