2009-10-01 224 views
32

是否有任何區別:SQL中的「LIKE」和「=」有什麼區別?

SELECT * FROM users WHERE username="davyjones" 

SELECT * FROM users WHERE username LIKE "davyjones" 

(我想我已經貽誤了語法......原諒我說,
我主要是一個桌面應用程序開發人員)

+0

[Equals(=)vs. LIKE]的可能重複(http://stackoverflow.com/questions/543580/equals-vs-like) – 2014-08-01 19:32:46

回答

24

根據SQL標準,不同之處在於CHAR列中尾隨空格的處理。例如:

create table t1 (c10 char(10)); 
insert into t1 values ('davyjones'); 

select * from t1 where c10 = 'davyjones'; 
-- yields 1 row 

select * from t1 where c10 like 'davyjones'; 
-- yields 0 rows 

當然,假設您在符合標準的DBMS上運行此操作。順便說一下,這是CHAR和VARCHAR之間的主要區別之一。

+0

爲什麼第二個例子會產生0行?由於'test'被存儲爲'test'+ 4個空格,所以這兩個statememts與我的測試數據 – 2009-10-01 16:33:59

+1

相同。 SQL標準說LIKE不應該匹配那個,while = should。對於VARCHAR列,沒有區別。 – 2009-10-01 16:35:15

+8

從來沒有使用char數據類型的另一個原因,除非你總是有確切數量的字符。 – HLGEM 2009-10-01 17:26:29

35

LIKE允許部分匹配/使用通配符,而=檢查完全匹配。

例如

SELECT * FROM test WHERE field LIKE '%oom'; 

將返回行,其中字段值是以下任意的:

Zoom, Boom, Loom, Groom 
+1

如果column是CHAR(5)而不是VARCHAR,它將不會返回這些行(5)。 – 2009-10-01 16:39:51

+0

@Milan:它將在MySQL – 2009-10-01 16:50:31

+0

@codeburger:MySQL有多年之後,它已經接近SQL標準兼容;) – 2009-10-02 10:14:19

1

LIKE支持通配符。通常它使用通配符的%或_字符。

使用不帶通配符的LIKE運算符與使用=運算符相同。

2

這會給你同樣的結果。然而,像允許通配符,例如...

SELECT * FROM users WHERE username LIKE 'davy%' 

唯一的語法問題是雙引號代替單引號

4

LIKE允許通配符像%(任意數目的字符在這裏)和_(一個字符這裏)。

SELECT * FROM users WHERE username LIKE 'joe%' 

選擇以joe開頭的所有用戶名。

11

在這種情況下,結果中不會出現任何差異。但是,它使用不同的方法進行比較,而「LIKE」會比較慢。

退房對於像的例子:http://www.techonthenet.com/sql/like.php

在這種情況下,你仍然要使用等號。

更新:請注意,有一個關鍵的區別,當涉及到CHAR類型列在其結果是不同的。有關更多詳情,請參閱this answer。當使用VARCHAR(大概是標準)時,上面的內容是等同的,並且等於是首選。

+1

可能在存儲過程中,但是通過動態SQL在SQL Server中進行測試時,我注意到它沒有優化這個。 我也在Oracle上運行測試,它似乎沒有優化動態SQL。 – Erich 2009-10-01 16:34:05

+1

我發現如此錯誤的答案經常被接受,令人驚訝。 :( – 2009-10-01 16:36:59

+0

以什麼樣的方式你會說我的回答是錯誤的?在這種情況下,LIKE和'='具有相同的功能,他的意思是'=',因此我應該指出一些關於如何使用LIKE ... 很確定我和其他人一樣回答了這個問題 – Erich 2009-10-01 16:42:38

0

等於'='只是爲了平等。另一方面,LIKE支持SQL通配符匹配。

因此,使用LIKE你可以做name like '%jones'以得到所有以jones結尾的名字。使用LIKE時,百分號'%'字符是任何東西,長度爲零或更多,並且下劃線字符'_'是任何一個字符。

1

LIKE條件允許您使用通配符:

SELECT * FROM suppliers 
WHERE supplier_name like 'Hew%'; 

See more examples.

和equals =用於平等匹配。

3

LIKE搜索模式。

/* Returns all users whose username starts with "d" */ 
SELECT * FROM users WHERE username LIKE 'd%' 

/* Returns all users whose username contains "dav" */ 
SELECT * FROM users WHERE username LIKE '%dav%' 
0

據我所知,沒有什麼區別,但你寫的兩個選擇的時間成本。通常使用LIKE%,意思是「任何字符串」。我認爲還有一個角色可以與LIKE用於「任何角色」,不知道沒有Google搜索的是什麼。

但是,隨着你的兩個選擇去,我看到的唯一區別是不同的運行時間,因爲LIKE是以正則表達式的方式使用。

0

Like讓你與外卡運營商合作,你可以用它在你的情況爲like 'davyjon%'把所有的結果,從davyjon,並得到確切的你可以將'davyjones',你也可以在這種情況下使用=

1

像是模式匹配運算符,並且=是完全匹配運算符。即其中類似W%名字就意味着開始與W,之後一個或多個字符 和=即其中name ='James'這是完全匹配的

4
create table A (id int,name varchar(30)) 

insert into A values(4,'subhash') 

使用尾隨空白搜索名稱字段:

select * from A where name='Subhash ' 
--Yields 1 row 
select * from A where name like 'Subhash ' 
--Yields 0 row