MySQL不在,也不喜欢

时间:2011-11-14 16:23:09

标签: mysql

是以下查询

SELECT * FROM items WHERE field1 NOT LIKE '%a%' AND NOT LIKE '%b%' AND
NOT LIKE '%c%'

相当于

SELECT * FROM items WHERE field1 NOT IN ('a', 'b', 'c');

一般来说,这是在MySQL查询中排除某些字符串值的最佳方法吗?

3 个答案:

答案 0 :(得分:1)

它们不等同,因为第一个匹配:

Mike
Tom

因为上面的单词中没有A,B和C.但不是

Apple Cobler

其中包含A,B和C.第二个将匹配除<:p>之外的任何内容

a
b
c

我认为你的第二个查询(NOT IN)是排除某些字符串的更好方法,前提是你不需要对可能的值进行通配符匹配。请注意,LIKE子句在性能方面更昂贵,因为它必须对每一行进行直接评估,而不是仅仅命中索引。

答案 1 :(得分:0)

您的第一个查询:

SELECT * FROM items WHERE field1 NOT IN ('a', 'b', 'c');

与此相同:

SELECT * FROM items WHERE field1 != 'a' AND field1 != 'b' AND field1 != 'c'

这样,你的两个查询就不相同了。而不是你的第一个查询,你也可以做这样的事情

SELECT * FROM items WHERE (field1 REGEXP '[abc]') = 0

请参阅manual about REGEXP for more info

答案 2 :(得分:0)

不,两个查询都不相同。

if (field1 = 'abcde')

然后第一个查询将忽略此行,因为'abcde'满足所有条件

abcde Like '%a%'
abcde Like '%b%'
abcde Like '%c%' 

但是第二个查询不会忽略结果,因为它将获取字段1不等于a和b和c的所有记录。

http://www.w3schools.com/sql/sql_like.asp

http://www.w3schools.com/sql/sql_in.asp