MySQL SELECT...LIKE (%)

示例

CREATE TABLE stack
(  id int AUTO_INCREMENT PRIMARY KEY,
   username VARCHAR(100) NOT NULL
);

INSERT stack(username) VALUES 
('admin'),('k admin'),('adm'),('a adm b'),('b XadmY c'), ('adm now'), ('not here');

任意位置的“ adm”:

SELECT * FROM stack WHERE username LIKE "%adm%";  
+----+-----------+
| id | username  |
+----+-----------+
|  1 | admin     |
|  2 | k admin   |
|  3 | adm       |
|  4 | a adm b   |
|  5 | b XadmY c |
|  6 | adm now   |
+----+-----------+

以“ adm”开头:

SELECT * FROM stack WHERE username LIKE "adm%";
+----+----------+
| id | username |
+----+----------+
|  1 | admin    |
|  3 | adm      |
|  6 | adm now  |
+----+----------+

以“ adm”结尾:

SELECT * FROM stack WHERE username LIKE "%adm"; 
+----+----------+
| id | username |
+----+----------+
|  3 | adm      |
+----+----------+

正如%一个字符LIKE条款任意数目的字符匹配,_匹配字符一个字符。例如,

SELECT * FROM stack WHERE username LIKE "adm_n"; 
+----+----------+
| id | username |
+----+----------+
|  1 | admin    |
+----+----------+

性能说明如果上有一个索引username,则

  • LIKE 'adm' 执行与`='adm'相同的操作

  • LIKE 'adm%是一个“范围”,类似于BETWEEN..AND..它可以充分利用列上的索引。

  • LIKE '%adm'(或带有前导通配符的任何变体)不能使用任何索引。因此,它将很慢。在具有许多行的表上,它可能是如此之慢,以至于毫无用处。

  • RLIKE(REGEXP)的速度往往比慢LIKE,但功能更多。

  • 虽然MySQL提供了FULLTEXT对许多类型的表和列的FULLTEXT索引,但是这些索引并不用于使用来完成查询LIKE。