1. in

1.1 格式:

MySQL 怎么用子查询 mysql子查询in_数据库开发

1.2 特点:

  • in用于判断某个记录的值,是否在指定的集合中
  • 在in关键字前边加上not可以将条件反过来

1.3 操作:

MySQL 怎么用子查询 mysql子查询in_数据_02

2. exist

2.1 格式:

MySQL 怎么用子查询 mysql子查询in_数据_03

2.2 特点:

  • 该子查询如果“有数据结果”(至少返回一行数据),则该EXISTS()结果为:true,外层查询执行
  • 该子查询如果“没有数据结果”(没有任何数据返回),则该EXISTS()结果为:false,外层查询不执行
  • EXISTS后面的子查询不返回任何实际数据,只返回真或假,当返回真时where条件成立
  • 注意:EXISTS关键字,比IN关键字的运算效率高,因此,在实际开发中,特别是大数据量时,推荐使用EXISTS关键字

2.3 操作:

MySQL 怎么用子查询 mysql子查询in_数据_04

2.4 解释:

外层查询进行查询时,外层查询会一行一行执行,第一行执行时,判断子查询是否为true,为true则此行数据被查出,接着第二行查询。。。,以此往复。

3. in 和 exists 区别

mysql中的in语句是把外表和内表作hash 连接,而exists语句是对外表作loop循环,每次loop循环再对内表进行查询。一直大家都认为exists比in语句的效率要高,这种说法其实是不准确的。这个是要区分环境的。

  1. 如果查询的两个表大小相当,那么用in和exists差别不大。
  2. 如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in。
  3. not in 和not exists:如果查询语句使用了not in,那么内外表都进行全表扫描,没有用到索引;而not extsts的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快

4. all

1.1 格式:

MySQL 怎么用子查询 mysql子查询in_MySQL 怎么用子查询_05

1.2 特点:

  • all:与子查询返回的所有值比较为true则返回true
  • all可以与=,>=,>,<,<=,<>结合使用,分别表示等于,大于等于,大于,小于,小于等于,不等于其中的所有数据
  • 大于all表示指定列中的值必须要大于子查询集中的每一个值,即必须要大于子查询集的最大值;如果是小于即小于子查询中的最小值。
  • 可以通过子查询优化,比如子查询中先查出最大值

1.3 操作:

MySQL 怎么用子查询 mysql子查询in_数据库开发_06

5. any(some)

1.1 格式:

MySQL 怎么用子查询 mysql子查询in_子查询_07

1.2 特点:

  • any:与子查询返回的所有值比较为true则返回true
  • any可以与=,>=,>,<,<=,<>结合使用,分别表示等于,大于等于,大于,小于,小于等于,不等于其中的任何一个数据
  • 大于any表示指定列中的值必须要大于子查询集中的任何一个值,即必须要大于子查询集的最小值;其他同理
  • some可以理解为any的别名

1.3 操作:

MySQL 怎么用子查询 mysql子查询in_数据库开发_08