SELECT with 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'(或带有前导通配符的任何变体 )不能使用任何索引。因此它会很慢。在有很多行的表上,它很可能很慢而没用。
  • RLIKEREGEXP)往往比 LIKE 慢,但有更多的能力。
  • 虽然 MySQL 在许多类型的表和列上提供了 FULLTEXT 索引,但这些 FULLTEXT 索引用于使用 LIKE 来完成查询。