子查询
一个select语句中包含另一个或多个完整的select语句。
子查询分类
标量子查询:返回的结果是一个数据(单行单列)
行子查询:返回的结果是一行,行子查询字段顺序要一致(单行多列)
列子查询:返回的结果时一列(多行多列)
表子查询:返回的结果时一张表(多行多列)
子查询出现的位置
出现在select子句中:将子查询返回结果作为主查询的一个字段或者计算值(标量子查询、列子查询)
出现在where/having子句中:将子查询返回的结果作为主查询的条件(标量子查询、行子查询、列子查询、表子查询)
出现在from或join子句中:将子查询返回的结果作为主查询的一个表(标量子查询、行子查询、列子查询、表子查询)
必须添加表别名,如果需要引用表子查询中的计算字段,必须添加列别名才可以引用
子查询操作符
语义 | 操作符 | 使用格式或示例 | 示例解释 |
在(不在)其中 | [NOT]IN | <字段>IN(<数据表子查询>) | 将字段值与数据表子查询的结果集比较,看字段值在不在数据表或结果集中 |
任何一个 | ANY | <字段><比较>ANY<(数据表子查询) | 测试字段值是否大于数据表或子查询结果集中的任何一个值。 |
全部(每个) | ALL | <字段><比较>ANY(数据表子查询) | 测试字段值是否大于数据表或子查询结果集中的每一个值 |
子查询优化
MySQL从4.1版本开始支持子查询,使用子查询进行SELECT语句嵌套查询,可以一次完成很多逻辑上需要多个步骤才能完成的SQL操作。
子查询虽然很灵活,但是执行效率并不高。执行子查询时,MYSQL需要为内层子查询的查询结果建立一个临时表,然后外层主查询在临时表上进行查询和筛选。查询完毕后再撤销这些临时表,这里多了一个创建和销毁临时表的过程。因此,子查询的速度会受到一定的影响,如果查询的数据量比较大,这种影响会随之增大。
优化方法:可以使用连接查询(join)代替子查询,连接查询不需要建立临时表,因此其速度比子查询快。
所有的连接查询都可以代替子查询,但并不是所有的子查询都可以用连接查询代替。当where子句中需要使用聚合函数作为筛选条件时,只能使用子查询。








暂无数据