SELECT foo FROM bar WHERE foobar='$foo'
和
SELECT foo FROM bar WHERE foobar LIKE'$foo'
SELECT foo FROM bar WHERE foobar='$foo'
和
SELECT foo FROM bar WHERE foobar LIKE'$foo'
等做通配符匹配的区别:
SELECT foo FROM bar WHERE foobar LIKE "Foo%"
如果您不需要模式匹配,然后用=代替LIKE。它更快,更安全。 (您正在使用参数化查询,对吧?)
=在SQL做精确匹配。
LIKE确实通配符匹配,使用“%”作为多字符匹配符号和“_”作为单字符匹配符号。 '\'是默认的转义字符。
foobar = '$foo'
和foobar LIKE '$foo'
将表现相同,因为这两个字符串都不包含通配符。
foobar LIKE '%foo'
会匹配任何在“富”的结局。
LIKE
也有一个ESCAPE
子句,所以你可以设置一个转义字符。这可以让你在字符串中匹配字面'%'或'_'。你也可以做NOT LIKE
。
MySQL的网站有documentation on the LIKE operator。语法是
expression [NOT] LIKE pattern [ESCAPE 'escape']
最终结果将是相同的,但查询引擎使用不同的逻辑来得到答案。通常,LIKE查询比“=”查询消耗更多的周期。但是,当没有通配符提供时,我不确定优化器如何处理该通配符。
随着你的问题的例子是没有区别的。
但是,像杰西说你可以做通配符匹配
SELECT foo FROM bar WHERE foobar LIKE "Foo%"
SELECT foo FROM bar WHERE foobar NOT LIKE "%Foo%"
更多信息:
http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html
据the MYSQL Reference page,尾部的空格在LIKE显著但不是=和你可以使用通配符,%用于任何字符,而_用于一个字符。
OG谷歌一点点不伤......
一个WHERE如果我们想要做一个精确匹配等号(=)子句工作正常。但是可能有一个要求,我们希望过滤掉所有'foobar'应该包含“foo”的结果。这可以使用SQL LIKE子句和WHERE子句来处理。
如果用%字符一起使用SQL LIKE子句那么它会像一个通配符。
SELECT foo FROM bar WHERE foobar LIKE'$foo%'
没有%字符LIKE子句与WHERE子句中的等号很相似。
在你的例子中,它们在语义上是相等的,并且应该返回相同的输出。
但是,LIKE会给你使用通配符进行模式匹配的能力。
您还应该注意=在某些系统上可能会提高性能,所以如果您是例如搜索exakt数字=,则会是首选方法。
看起来非常像从PHP脚本中取出。目的是将变量$foo
的内容与foo
数据库字段进行模式匹配,但我敢打赌它应该写在双引号中,所以$ foo的内容将被输入到查询中。
正如你所说,没有任何区别。
它可能会更慢,但我敢打赌,MySQL意识到搜索字符串中没有通配符,所以它毕竟不会做类似的模式匹配,所以真的没什么区别。
我认为速度=比LIKE快。如前所述,=完全匹配,如果需要,LIKE可以使用通配符。
我总是使用=符号,只要我知道某些东西的值。例如
select * from state where state='PA'
那么对于喜欢我用的东西,如:如果您使用Oracle开发工具
select * from person where first_name like 'blah%' and last_name like 'blah%'
,你可以测试它与解释,以确定数据库的影响。
在我来说,我觉得Like
是快于=
Like
获取的行数在0.203秒的第一时间,那么0.140秒
=
收益在0.156秒获取相同的行不断
拿你的选择
这可能只是意味着查询被缓存。 – Ben 2012-10-26 12:41:41
请记住,MySQL将根据情况执行铸件:LIKE将执行字符串转换,而=会执行int转换。考虑到局势:
(int) (vchar2)
id field1 field2
1 1 1
2 1 1,2
SELECT * FROM AS
test
一个 LEFT JOINtest
为B ON a.field1样B。FIELD2
会产生
id field1 field2 id field1 field2
1 1 1 1 1 1
2 1 1,2 1 1 1
而
SELECT * FROM AS
test
一个 LEFT JOINtest
AS B关于a.field1 = b.field2
将产生
id field1 field2 id field1 field2
1 1 1 1 1 1
1 1 1 2 1 1,2
2 1 1,2 1 1 1
2 1 1,2 2 1 1,2
这是一个很好的观点,以field1(varchar列)值为“1234”为尾随空格的示例 - SELECT * FROM table1 WHERE field1 ='1234'将返回行,SELECT * FROM table1 WHERE field1 LIKE'1234 '不会... – Whisk 2016-06-17 10:34:20
我发现LIKE
和等号=
之间的一个重要区别!
示例:我有一个字段 “ID” 的表(类型:整数(20))和包含值 “123456789”
的记录如果我:
SELECT ID FROM example WHERE ID = '123456789-100'
记录与ID = '123456789' 被找到(是不正确的结果)
如果我做的:
SELECT ID FROM example WHERE ID LIKE '123456789-100'
无记录发现(这是正确的)
因此,至少对于INTEGER领域,它似乎是一个重要的区别...
谢谢。我以为LIKE可能会检查小拼写错误等 – 2009-06-16 19:34:06