1. in
1.1 格式:
1.2 特点:
- in用于判断某个记录的值,是否在指定的集合中
- 在in关键字前边加上not可以将条件反过来
1.3 操作:
2. exist
2.1 格式:
2.2 特点:
- 该子查询如果“有数据结果”(至少返回一行数据),则该EXISTS()结果为:true,外层查询执行
- 该子查询如果“没有数据结果”(没有任何数据返回),则该EXISTS()结果为:false,外层查询不执行
- EXISTS后面的子查询不返回任何实际数据,只返回真或假,当返回真时where条件成立
- 注意:EXISTS关键字,比IN关键字的运算效率高,因此,在实际开发中,特别是大数据量时,推荐使用EXISTS关键字
2.3 操作:
2.4 解释:
外层查询进行查询时,外层查询会一行一行执行,第一行执行时,判断子查询是否为true,为true则此行数据被查出,接着第二行查询。。。,以此往复。
3. in 和 exists 区别
mysql中的in语句是把外表和内表作hash 连接,而exists语句是对外表作loop循环,每次loop循环再对内表进行查询。一直大家都认为exists比in语句的效率要高,这种说法其实是不准确的。这个是要区分环境的。
- 如果查询的两个表大小相当,那么用in和exists差别不大。
- 如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in。
- not in 和not exists:如果查询语句使用了not in,那么内外表都进行全表扫描,没有用到索引;而not extsts的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。
4. all
1.1 格式:
1.2 特点:
- all:与子查询返回的所有值比较为true则返回true
- all可以与=,>=,>,<,<=,<>结合使用,分别表示等于,大于等于,大于,小于,小于等于,不等于其中的所有数据
- 大于all表示指定列中的值必须要大于子查询集中的每一个值,即必须要大于子查询集的最大值;如果是小于即小于子查询中的最小值。
- 可以通过子查询优化,比如子查询中先查出最大值
1.3 操作:
5. any(some)
1.1 格式:
1.2 特点:
- any:与子查询返回的所有值比较为true则返回true
- any可以与=,>=,>,<,<=,<>结合使用,分别表示等于,大于等于,大于,小于,小于等于,不等于其中的任何一个数据
- 大于any表示指定列中的值必须要大于子查询集中的任何一个值,即必须要大于子查询集的最小值;其他同理
- some可以理解为any的别名