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