IN():一个值是否在一组值内
expr IN (value,...)
返回1(真),如果 expr等于任何的值的IN()列表,否则返回 0(假)。
如果IN()列表中的值不需要类型转换,则它们都是JSON相同类型的非常量, expr可以将它们与每个相同类型的值进行比较(可能在类型转换之后),从而进行优化。列表中的值被排序,并且 expr使用二进制搜索来完成搜索,这使得IN()操作非常快。
用法示例:
mysql> SELECT 2 IN (0,3,5,7);
-> 0
mysql> SELECT 'wefwf' IN ('wee','wefwf','weg');
-> 1
IN() 可以用来比较行构造函数:
mysql> SELECT (3,4) IN ((1,2), (3,4));
-> 1
mysql> SELECT (3,4) IN ((1,2), (3,5));
-> 0
绝对不要在IN()列表中混合带引号和不带引号的值, 因为带引号(例如字符串)和不带引号的值(例如数字)的比较规则不同。因此,混合类型可能导致不一致的结果。例如,不要写这样的 IN()表达式:
SELECT val1 FROM tbl1 WHERE val1 IN (1,2,'a');
而是这样写:
SELECT val1 FROM tbl1 WHERE val1 IN ('1','2','a');
隐式类型转换可能会产生非直观的结果:
mysql> SELECT 'a' IN (0), 0 IN ('b');
-> 1, 1
在这两种情况下,比较值都将转换为浮点值,在每种情况下均得出0.0,比较结果为1(真)。
IN()列表 中值的数量仅受该max_allowed_packet值限制 。
为了符合SQL标准,不仅IN() 返回NULL左侧表达式为NULL,还返回列表中未找到匹配项,并且列表中的一个表达式为时返回NULL。
IN()语法也可以用于编写某些类型的子查询。