2009-10-01 223 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