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