2009-06-16 127 views

回答

19

等做通配符匹配的區別:

SELECT foo FROM bar WHERE foobar LIKE "Foo%" 

如果您不需要模式匹配,然後用=代替LIKE。它更快,更安全。 (您正在使用參數化查詢,對吧?)

+0

謝謝。我以爲LIKE可能會檢查小拼寫錯誤等 – 2009-06-16 19:34:06

26

=在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'] 
1

最終結果將是相同的,但查詢引擎使用不同的邏輯來得到答案。通常,LIKE查詢比「=」查詢消耗更多的週期。但是,當沒有通配符提供時,我不確定優化器如何處理該通配符。

3

the MYSQL Reference page,尾部的空格在LIKE顯著但不是=和你可以使用通配符,%用於任何字符,而_用於一個字符。

0

OG谷歌一點點不傷......

一個WHERE如果我們想要做一個精確匹配等號(=)子句工作正常。但是可能有一個要求,我們希望過濾掉所有'foobar'應該包含「foo」的結果。這可以使用SQL LIKE子句和WHERE子句來處理。

如果用%字符一起使用SQL LIKE子句那麼它會像一個通配符。

SELECT foo FROM bar WHERE foobar LIKE'$foo%' 

沒有%字符LIKE子句與WHERE子句中的等號很相似。

0

在你的例子中,它們在語義上是相等的,並且應該返回相同的輸出。

但是,LIKE會給你使用通配符進行模式匹配的能力。

您還應該注意=在某些系統上可能會提高性能,所以如果您是例如搜索exakt數字=,則會是首選方法。

0

看起來非常像從PHP腳本中取出。目的是將變量$foo的內容與foo數據庫字段進行模式匹配,但我敢打賭它應該寫在雙引號中,所以$ foo的內容將被輸入到查詢中。

正如你所說,沒有任何區別。

它可能會更慢,但我敢打賭,MySQL意識到搜索字符串中沒有通配符,所以它畢竟不會做類似的模式匹配,所以真的沒什麼區別。

3

我認爲速度=比LIKE快。如前所述,=完全匹配,如果需要,LIKE可以使用通配符。

我總是使用=符號,只要我知道某些東西的值。例如

select * from state where state='PA' 

那麼對於喜歡我用的東西,如:如果您使用Oracle開發工具

select * from person where first_name like 'blah%' and last_name like 'blah%' 

,你可以測試它與解釋,以確定數據庫的影響。

0

在我來說,我覺得Like是快於=

  • Like獲取的行數在0.203秒的第一時間,那麼0.140秒

  • =收益在0.156秒獲取相同的行不斷

拿你的選擇

+0

這可能只是意味着查詢被緩存。 – Ben 2012-10-26 12:41:41

5

請記住,MySQL將根據情況執行鑄件:LIKE將執行字符串轉換,而=會執行int轉換。考慮到局勢:

(int) (vchar2) 
id field1 field2 
1 1  1 
2 1  1,2 

SELECT * FROM AS test一個 LEFT JOIN test爲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 JOIN test 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 
+0

這是一個很好的觀點,以field1(varchar列)值爲「1234」爲尾隨空格的示例 - SELECT * FROM table1 WHERE field1 ='1234'將返回行,SELECT * FROM table1 WHERE field1 LIKE'1234 '不會... – Whisk 2016-06-17 10:34:20

0

我發現LIKE和等號=之間的一個重要區別!

示例:我有一個字段 「ID」 的表(類型:整數(20))和包含值 「123456789」

的記錄如果我:

SELECT ID FROM example WHERE ID = '123456789-100' 

記錄與ID = '123456789' 被找到(是不正確的結果)

如果我做的:

SELECT ID FROM example WHERE ID LIKE '123456789-100' 

無記錄發現(這是正確的)

因此,至少對於INTEGER領域,它似乎是一個重要的區別...