k_0711

2020-07-31   阅读量: 713

Mysql

MySql子查询

扫码加入数据分析学习群

子查询

一个select语句中包含另一个或多个完整的select语句。

子查询分类

  • 标量子查询:返回的结果是一个数据(单行单列)

  • 行子查询:返回的结果是一行,行子查询字段顺序要一致(单行多列)

  • 列子查询:返回的结果时一列(多行多列)

  • 表子查询:返回的结果时一张表(多行多列)

子查询出现的位置

  • 出现在select子句中:将子查询返回结果作为主查询的一个字段或者计算值(标量子查询、列子查询)

  • 出现在where/having子句中:将子查询返回的结果作为主查询的条件(标量子查询、行子查询、列子查询、表子查询)

  • 出现在from或join子句中:将子查询返回的结果作为主查询的一个表(标量子查询、行子查询、列子查询、表子查询)

必须添加表别名,如果需要引用表子查询中的计算字段,必须添加列别名才可以引用

子查询操作符

语义

操作符

使用格式或示例

示例解释

在(不在)其中

[NOT]IN

<字段>IN(<数据表子查询>)

将字段值与数据表子查询的结果集比较,看字段值在不在数据表或结果集中

任何一个

ANY

<字段><比较>ANY<(数据表子查询)

测试字段值是否大于数据表或子查询结果集中的任何一个值。

全部(每个)

ALL

<字段><比较>ANY(数据表子查询)

测试字段值是否大于数据表或子查询结果集中的每一个值

子查询优化

MySQL从4.1版本开始支持子查询,使用子查询进行SELECT语句嵌套查询,可以一次完成很多逻辑上需要多个步骤才能完成的SQL操作。

子查询虽然很灵活,但是执行效率并不高。执行子查询时,MYSQL需要为内层子查询的查询结果建立一个临时表,然后外层主查询在临时表上进行查询和筛选。查询完毕后再撤销这些临时表,这里多了一个创建和销毁临时表的过程。因此,子查询的速度会受到一定的影响,如果查询的数据量比较大,这种影响会随之增大。

优化方法:可以使用连接查询(join)代替子查询,连接查询不需要建立临时表,因此其速度比子查询快。

所有的连接查询都可以代替子查询,但并不是所有的子查询都可以用连接查询代替。当where子句中需要使用聚合函数作为筛选条件时,只能使用子查询。


39.8295 4 5 关注作者 收藏

评论(0)


暂无数据

推荐课程