MySQL——单表查询(二)按条件查询(7)带LIKE关键字的查询

使用关系运算符 " = " 可以判断两个字符串是否相等,但有时候需要对字符串进行模糊查询,例如查询 student 表中 name 字段值以字符 " b " 开头的记录为了完成这种功能,MySQL 中提供了LIKE 关键字,LIKE 关键字可以判断两个字符串是否相匹配。使用 LIKE 关键字的 SELECT 语句其语法格式如下所示:

sql 复制代码
SELECT *|{字段名 1,字段名 2,...}
FROM 表名
WHERE 字段名 [NOT] LIKE '匹配字符串';

在上面的语法格式中,NOT是可选参数,使用 NOT 表示查询与指定字符串不匹配的记录。"匹配字符串"指定用来匹配的字符串,其值可以是一个普通字符串,也可以是包含百分号(%)和下划线(_)的通配字符串。百分号和下划线统称为通配符,它们在通配字符串中有特殊含义,两者的作用如下所示。

1、百分号(%)通配符

匹配任意长度的字符串,包括空字符串。例如,字符串 " c% " 匹配以字符 c 开始,任意长度的字符串,如 " ct " 、" cut " 、" current " 等。

例如,查找 student 表中 name 字段值以字符 " s " 开头的学生 id,SQL语句如下所示:

sql 复制代码
SELECT id, name FROM student WHERE name LIKE "s%";

执行结果如下所示:

sql 复制代码
mysql> SELECT id, name FROM student WHERE name LIKE "s%";
+----+------------+
| id | name       |
+----+------------+
|  1 | songjiang  |
|  5 | sunerniang |
|  9 | songjiang  |
+----+------------+
3 rows in set (0.00 sec)

从查询结果可以看到,返回的记录中 name 字段值均以字符 " s " 开头," s " 后面可以跟任意数量的字符。

百分号通配符可以出现在通配字符串的任意位置。

例如,查询 student 表中 name 字段值以字符 " w " 开始,以字符 " g " 结束的学生 id,执行结果如下所示:

sql 复制代码
mysql> SELECT id, name FROM student WHERE name LIKE "w%g";
+----+--------+
| id | name   |
+----+--------+
|  2 | wuyong |
|  6 | wusong |
+----+--------+
2 rows in set (0.00 sec)

从查询结果可以看到,字符 " w " 和 " g " 之间的百分号通配符匹配两个字符之间任意个的字符。

在通配字符串中可以出现多个百分号通配符。

例如,查询 student 表中 name 字段值包含字符 " y " 的学生 id,执行结果如下所示:

sql 复制代码
mysql> SELECT id, name FROM student WHERE name LIKE "%y%";
+----+---------+
| id | name    |
+----+---------+
|  2 | wuyong  |
|  8 | yanging |
+----+---------+
2 rows in set (0.00 sec)

从查询结果可以看到,通配字符串中的字符 " y " 前后各有一个百分号通配符,它匹配包含字符 " y " 的字符串,无论 " y " 在字符串的什么位置。

LIKE 之前可以使用 NOT 关键字,用来查询与指定通配字符串不匹配的记录。

例如,查询 student 表中 name 字段值不包含字符 " y " 的学生 id,执行结果如下所示:

sql 复制代码
mysql> SELECT id, name FROM student WHERE name NOT LIKE "%y%";
+----+------------+
| id | name       |
+----+------------+
|  1 | songjiang  |
|  3 | ginming    |
|  4 | husanniang |
|  5 | sunerniang |
|  6 | wusong     |
|  7 | linchong   |
+----+------------+
6 rows in set (0.00 sec)

从查询结果可以看出,返回的记录中 name 字段值都不包含字符 " y ",正好和前一个例子的查询结果相反。

2、下划线()通配符下划线通配符

与百分号通配符有些不同,下划线通配符只匹配单个字符,如果要四配多个字符,需要使用多个下划线通配符。例如,字符串 " cu " 匹配以字符串 " cu " 开始长度为 3 的字符串,如 cut、cup,字符串 " c__1 " 匹配在字符 " c " 和 " 1 " 之间包含两个字符的字符串,如 " cool "、" coal "等。需要注意的是,如果使用多个下划线匹配多个连续的字符,下划线之间不能有空格,例如,通配字符串"M__QL"只能匹配字符串"My SQL",而不能匹配字符串"MySQL"。

例如,查询 student 表中 name 字段值以字符串 " wu " 开始,以字符串 " ong " 结束,并且两个字符串之间只有一个字符的记录,SQL语句如下所示:

sql 复制代码
SELECT * FROM student WHERE name LIKE 'wu_ong';

从查询结果可以看出,查出的记录中 name 字段值为 " wuyong " 和 " wusong ",通配字符串 " wu_ong " 中一个下划线匹配了一个字符。对上述的 SQL 语句进行修改,将匹配字符串修改为 " wu_ng " ,再次执行查询语句,执行结果如下所示:

sql 复制代码
mysql> SELECT * FROM student WHERE name LIKE 'wu_ong';
+----+--------+-------+--------+
| id | name   | grade | gender |
+----+--------+-------+--------+
|  2 | wuyong |   100 | 男     |
|  6 | wusong |    86 | 男     |
+----+--------+-------+--------+
2 rows in set (0.00 sec)

从查询结果可以看到返回记录为空,这是因为匹配字符串中只有一个下划线通配符,无法匹配两个字符。

例如,查询 student 表中 name 字段值包含 7 个字符,并且以字符串 " ing " 结束的记录,执行结果如下所示:

sql 复制代码
mysql> SELECT * FROM student WHERE name LIKE '____ing';
+----+---------+-------+--------+
| id | name    | grade | gender |
+----+---------+-------+--------+
|  3 | ginming |    90 | 男     |
|  8 | yanging |    90 | NULL   |
+----+---------+-------+--------+
2 rows in set (0.00 sec)

从查询结果可以看到,在通配字符串中使用了 4 个下划线通配符,它匹配 name 字段值中 " ing " 前面的4个字符。

相关推荐
NineData8 分钟前
NineData 与平凯数据库(TiDB 企业版)完成产品兼容性互认证
数据库·tidb·ninedata·玖章算术·平凯数据库·产品兼容性认证·tidb企业版
咖啡星人k17 分钟前
2026 Text-to-SQL:一句话让 AI 写 SQL,自然语言直接查数据库(MonkeyCode 云端实战)
数据库·机器学习·语言模型·自然语言处理
GreatSQL社区20 分钟前
少敲一个字母,GreatSQL 对所有查询“已读不回”
数据库·mysql·greatsql
wangchunyu1141 小时前
PostgreSQL 入门与实践:从零搭建一个 CRUD 应用
数据库·postgresql
涛思数据(TDengine)1 小时前
从_找根因_到_搭系统_:工业 AI 实战直播(十、十一期)
大数据·数据库·人工智能·时序数据库·tdengine
qq_339191142 小时前
mysql磁盘占用排查,mysql存储空间占比统计,mysql判断哪张表占用磁盘空间大
数据库·mysql
东方护航数据恢复(深圳)2 小时前
SSD主控损坏后的芯片级提取:FTL映射表重建与NAND直读
大数据·数据库
光锥智能2 小时前
OceanBase领跑数字政府数据库选型:产品能力、市场潜力、技术潜力均居首
数据库·人工智能·oceanbase
风哥2号3 小时前
达梦DM数据库恢复工具FGDDU(FGEDU DM DUL)
数据库·达梦数据库·数据库恢复