当使用SQL时,在WHERE子句中使用=而不是LIKE有任何好处吗?

没有任何特殊的运算符,LIKE和=是一样的,对吧?


当前回答

如果要搜索精确匹配,可以同时使用,=和LIKE。

在这种情况下,使用“=”稍微快一点(搜索精确匹配)——你可以自己检查,在SQL Server Management Studio中进行两次相同的查询,一次使用“=”,一次使用“LIKE”,然后使用“查询”/“包括实际执行计划”。

执行这两个查询,您应该会看到两次结果,以及两个实际的执行计划。在我的例子中,它们被分割成50%对50%,但是“=”执行计划有一个更小的“估计子树成本”(当你将鼠标悬停在最左边的“SELECT”框上时显示)-但是,这真的不是一个巨大的差异。

但是当你开始在LIKE表达式中使用通配符进行搜索时,搜索性能将会下降。搜索“LIKE Mill%”仍然可以相当快- SQL Server可以使用该列的索引,如果有一个。搜索“LIKE %expression%”非常慢,因为SQL Server能够满足此搜索的唯一方法是执行全表扫描。所以点赞时要小心!

Marc

其他回答

除了通配符,=和LIKE之间的区别还取决于SQL服务器的类型和列类型。

举个例子:

CREATE TABLE testtable (
  varchar_name VARCHAR(10),
  char_name CHAR(10),
  val INTEGER
);

INSERT INTO testtable(varchar_name, char_name, val)
    VALUES ('A', 'A', 10), ('B', 'B', 20);

SELECT 'VarChar Eq Without Space', val FROM testtable WHERE varchar_name='A'
UNION ALL
SELECT 'VarChar Eq With Space', val FROM testtable WHERE varchar_name='A '
UNION ALL
SELECT 'VarChar Like Without Space', val FROM testtable WHERE varchar_name LIKE 'A'
UNION ALL
SELECT 'VarChar Like Space', val FROM testtable WHERE varchar_name LIKE 'A '
UNION ALL
SELECT 'Char Eq Without Space', val FROM testtable WHERE char_name='A'
UNION ALL
SELECT 'Char Eq With Space', val FROM testtable WHERE char_name='A '
UNION ALL
SELECT 'Char Like Without Space', val FROM testtable WHERE char_name LIKE 'A'
UNION ALL
SELECT 'Char Like With Space', val FROM testtable WHERE char_name LIKE 'A '

Using MS SQL Server 2012, the trailing spaces will be ignored in the comparison, except with LIKE when the column type is VARCHAR. Using MySQL 5.5, the trailing spaces will be ignored for =, but not for LIKE, both with CHAR and VARCHAR. Using PostgreSQL 9.1, spaces are significant with both = and LIKE using VARCHAR, but not with CHAR (see documentation). The behaviour with LIKE also differs with CHAR. Using the same data as above, using an explicit CAST on the column name also makes a difference: SELECT 'CAST none', val FROM testtable WHERE char_name LIKE 'A' UNION ALL SELECT 'CAST both', val FROM testtable WHERE CAST(char_name AS CHAR) LIKE CAST('A' AS CHAR) UNION ALL SELECT 'CAST col', val FROM testtable WHERE CAST(char_name AS CHAR) LIKE 'A' UNION ALL SELECT 'CAST value', val FROM testtable WHERE char_name LIKE CAST('A' AS CHAR) This only returns rows for "CAST both" and "CAST col".

=和LIKE是不一样的;

=匹配精确的字符串 LIKE匹配可能包含通配符的字符串(%)

如果要搜索精确匹配,可以同时使用,=和LIKE。

在这种情况下,使用“=”稍微快一点(搜索精确匹配)——你可以自己检查,在SQL Server Management Studio中进行两次相同的查询,一次使用“=”,一次使用“LIKE”,然后使用“查询”/“包括实际执行计划”。

执行这两个查询,您应该会看到两次结果,以及两个实际的执行计划。在我的例子中,它们被分割成50%对50%,但是“=”执行计划有一个更小的“估计子树成本”(当你将鼠标悬停在最左边的“SELECT”框上时显示)-但是,这真的不是一个巨大的差异。

但是当你开始在LIKE表达式中使用通配符进行搜索时,搜索性能将会下降。搜索“LIKE Mill%”仍然可以相当快- SQL Server可以使用该列的索引,如果有一个。搜索“LIKE %expression%”非常慢,因为SQL Server能够满足此搜索的唯一方法是执行全表扫描。所以点赞时要小心!

Marc

对于这个例子,我们理所当然地认为varcharcol不包含“并且在这一列上没有空单元格

select * from some_table where varcharCol = ''
select * from some_table where varcharCol like ''

第一个结果是0行输出,而第二个显示整个列表。=是严格匹配的情况下,而like的作用像一个过滤器。如果过滤器没有条件,则每个数据都是有效的。

Like -由于其目的,它的工作速度稍慢,用于varchar和类似的数据。

在Oracle中,不带通配符的“like”将返回与“equals”相同的结果,但可能需要额外的处理。根据Tom Kyte的说法,Oracle在使用文字时将不带通配符的“like”视为“equals”,但在使用绑定变量时则不会。