命令行操作MySQL - LIKE模糊查询

MySQL LIKE模糊查询及通配符使用
这是命令行操作MySQL数据库系列博客的第十五篇,记录了LIKE模糊查询。介绍了使用LIKE关键字结合通配符进行模糊查询的方法,包括通配符’%’和’_’的使用,NOT LIKE的用法,还提及模糊查询整型数据,强调搞懂通配符结合LIKE使用即可完成查询。

这是命令行操作MySQL数据库系列博客的第十五篇,今天这篇博客记录LIKE模糊查询。



简介

当我们只想用字符串中间的一部分特征查找含有特征字串的信息时,MySQL提供了关键字LIKE来实现模糊查询,需要使用通配符。
就比如,我们只记得一个朋友的姓是张,却忘记名字了,那么我们就可以使用模糊查询,只查询张,就可以将它名字信息查询出来。

通配符

在MySQL中,字符串必须加上单引号(’’)和双引号(″″)。由于关键字LIKE可以实现模糊查询,因此该关键字后面的字符串参数除了可以使用完整的字符串外,还可以包含通配符。LIKE关键字支持的通配符如下表所示。

符号功能描述
_该通配符值能匹配单个字符
%该通配符可以匹配任意长度的字符串,即可以是0个字符,也可以是1个字符,也可以是很多字符

使用语法

  1. LIKE
    select * from 表名 where 字段名 LIKE 模糊匹配的数据;

    select * from 表名 where 字段名 LIKE 模糊匹配的数据 AND 字段名 LIKE 模糊匹配的数据;

  2. NOT LIKE
    select * from 表名 where 字段名 NOT LIKE 模糊匹配的数据;

例:
创建一张表,并插入数据:

create table like_test(id int PRIMARY KEY AUTO_INCREMENT, name varchar(32));

insert into like_test(name) values('abc'), ('bcd'), ('cde'), ('一二三'), ('二三四'), ('三四五');

在这里插入图片描述

通配符 ’ % ’

匹配0个或多个字符。

  1. 查询数据中含有’b’字母所有数据

    select * from like_test where name LIKE '%b%';
    

    在这里插入图片描述

  2. 查询数据中即含有’b’又含有’c’字母的所有数据

    mysql> select * from like_test where name LIKE '%b%' AND name LIKE '%c%';
    

    在这里插入图片描述

  3. 查询数据中以’一’开头的所有数据

    select * from like_test where name LIKE '一%';
    

    在这里插入图片描述

通配符 ’ _ ’

只匹配单个字符。

  1. 查询数据中已’c’在中间,左右两边各含有一个字符的数据

     select * from like_test where name LIKE '_c_';
    

    在这里插入图片描述

  2. 查询数据中以’三’开头,后面还有两个汉字的数据

    select * from like_test where name LIKE 'c__';
    

    在这里插入图片描述

  3. 查询第二个字符是’三’的数据

    select * from like_test where name LIKE '_三%';
    

    在这里插入图片描述

NOT LIKE

查询符合条件之外的所有数据。

  1. 查询数据中不含有’三’的所有数据

    select * from like_test where name NOT LIKE '%三%';
    

    在这里插入图片描述

  2. 查询数据中不包括第三个数据是’三’的所有数据

    select * from like_test where name NOT LIKE '__三%';
    

    在这里插入图片描述

模糊查询整型数据

模糊查询也支持查询其它类型的数据,但是它底层始终都是以字符串的方式进行查询。

  1. 查询数据中以’1’开头的数据

    select * from like_test where id LIKE '1%';
    

    在这里插入图片描述

  2. 查询除’1’开头之外的所有数据

    select * from like_test where id NOT LIKE '1%';
    

    在这里插入图片描述

  3. 查询所有数据

    select * from like_test where id LIKE '%%';
    

    在这里插入图片描述


总结:
从上面所列举出来的例子可以知道,LIKE模糊查询并不难,搞懂通配符的使用方式,再结合LIKE使用即可。需注意,如果不使用通配符的话是无法查询到结果的。

<think>首先,用户的问题是:“我想了解MySQL模糊查询中LIKE后面是否一定得跟双引号 请问MySQL模糊查询中LIKE后面是否必须跟双引号” 用户引用了一些资料,但我需要基于我的知识和这些参考来回答。回顾引用: - 引用[1]:讨论了MyBatis中模糊查询的写法,包括使用双引号拼接、CONCAT()函数和bind元素。提到了在使用双引号时需要注意单引号的问题。 - 引用[2]:讨论了使用预编译对象时的模糊查询,建议使用占位符来解决单双引号问题。 - 引用[3]:关于SQL语句中单双引号嵌套的问题。 - 引用[4]:展示了LIKE查询中使用双引号的实际例子。 用户的核心问题是:在MySQL模糊查询中,LIKE后面是否必须使用双引号? 在SQL语法中,LIKE后面的模式字符串是一个字符串文字,所以在SQL中,字符串文字通常用单引号表示。例如:`SELECT * FROM table WHERE column LIKE '%pattern%'`。这里的`'%pattern%'`是用单引号包围的字符串。 在MySQL中,字符串常量用单引号(')或双引号(")都可以,但官方推荐使用单引号,因为双引号在一些模式下可能被解释为标识符引用(取决于SQL模式)。例如,如果ANSI_QUOTES模式开启,双引号会被视为标识符引用,而不是字符串分隔符。 来自参考: - 引用[1]提到:“注意:这里%需要使用双引号,不能使用单引号。因为#{···}解析成sql语句会在变量外侧自动加单引号’’”,这是在MyBatis上下文中,为了避免在拼接SQL时出现多余的单引号,所以使用双引号来包围%。 - 引用[3]讨论SQL语句中单双引号嵌套的问题。 所以,在纯MySQL SQL语句中,LIKE后面的模式字符串应该用单引号。但在编程环境中,如Java或MyBatis,处理字符串时需要小心避免语法错误。 回答用户问题:在MySQL模糊查询中,LIKE后面不是必须跟双引号;它应该跟一个字符串文字,通常是用单引号表示的。但在某些上下文(如MyBatis)中,为了避免引号冲突,可能会使用双引号或函数如CONCAT()。 现在,构建回答结构: 1. **澄清问题**:直接回答用户的问题。 2. **解释核心概念**:解释SQLLIKE查询的语法。 3. **基于参考**:引用提供的资料来支持观点。 4. **提供示例**:给出SQL示例。 5. **最佳实践**:建议在避免引号冲突时的做法。 6. **生成相关问题**:根据系统指令,生成相关问题。 系统指令要求: - 所有行内数学表达式用$...$,但这里不涉及数学表达式。 - 独立公式用$$...$$,同样不适用。 - LaTeX语法正确:不直接相关。 - 使用中文回答:必须。 - 生成相关问题:回答后生成相关问题。 - 引用段落末尾添加引用标识:[^n] 回答结构: 1. 简要回答:不,在MySQLLIKE后不一定必须跟双引号;通常使用单引号。 2. 详细解释: - 在纯SQL中,字符串常量用单引号。 - 在MyBatis或编程环境中,由于变量替换,可能需要特殊处理,如使用CONCAT()或bind元素。 3. 引用参考:例如,引用[1]说明在MyBatis中使用双引号来避免冲突。 4. 给出示例:如`SELECT * FROM table WHERE name LIKE 'pattern%'`。 5. 生成相关问题。 最终回答用中文。 </think>### MySQL模糊查询中LIKE后面是否必须使用双引号? 在MySQL中,LIKE操作符用于模糊查询模式匹配时,其后面的模式字符串**不一定必须使用双引号**。具体取决于SQL语法规则和编程上下文。下面我将逐步解释核心概念、规则和最佳实践。 #### 1. **核心规则:SQL字符串常量的表示** - 在纯SQL语法中(如直接在MySQL命令行运行),字符串常量(包括LIKE后的模式)**通常使用单引号**(`'`)包围。例如: ```sql SELECT * FROM users WHERE name LIKE '%张%'; /* 正确:单引号包裹字符串 */ ``` - 这里`'%张%'`是一个字符串常量,单引号是SQL标准表示方式。 - MySQL支持双引号(`"`)作为字符串分隔符,但这取决于SQL模式: - 默认模式下,双引号可替代单引号(例如`LIKE "%张%"`可能有效)。 - 但如果启用了`ANSI_QUOTES`模式(通过`SET sql_mode = 'ANSI_QUOTES'`),双引号会被解释为标识符引用(如列名),而非字符串常量,可能导致语法错误。因此,官方推荐优先使用单引号以确保兼容性[^1][^3]。 #### 2. **编程上下文中的注意事项** 在应用程序中(如MyBatis或Java),LIKE后的字符串处理需要额外小心变量拼接问题: - **避免引号冲突**:当使用变量替换(如MyBatis的`#{Name}`)时,SQL解析器会自动给变量添加单引号。如果模式字符串本身使用单引号包裹,可能导致嵌套单引号错误。例如: - 错误示例:`LIKE '%#{Name}%'`解析后可能变成`LIKE '%'变量值'%'`,引发语法错误。 - **解决方案(基于引用)**- **使用双引号包裹固定部分**:如引用[1]所述,在MyBatis中,可写为`LIKE "%"#{Name}"%"`。双引号确保`%`被视为字符串的一部分,而非语法分隔符。 - **使用CONCAT()函数**MySQL的`CONCAT()`函数安全拼接字符串,避免引号问题。例如: ```sql SELECT * FROM atm WHERE name LIKE CONCAT('%', #{Name}, '%'); /* 引用[1] */ ``` - **使用bind元素(MyBatis特有)**:动态生成模式,如`<bind name="pattern" value="'%'+Name+'%'"/>`,然后在SQL中使用`LIKE #{pattern}`[^1]。 - **预编译语句中的做法**:在Java等语言中,使用占位符(`?`)时,应直接在参数中包括`%`字符,而非在SQL字符串中: ```java String sql = "SELECT * FROM goods WHERE name LIKE ?"; ps.setString(1, "%匹配内容%"); // 引用[2] ``` #### 3. **总结和建议** - **是否必须用双引号?**:不必须。在纯SQL中优先使用单引号;在编程框架中,双引号可作为临时方案避免冲突,但推荐使用`CONCAT()`或bind元素更安全。 - **最佳实践**-SQL查询:始终用单引号(如`LIKE 'pattern%'`)。 - MyBatis或类似框架:避免直接嵌套变量与引号,改用函数或bind元素处理模糊模式。 - 注意特殊字符:如果模式包含双引号(如JSON属性),需转义处理(如引用[4]的`LIKE '%\"no\":\"30925344\"%'`)。 - 示例对比: - 安全写法(单引号 + CONCAT): ```sql SELECT * FROM users WHERE email LIKE CONCAT('%@', 'gmail.com'); /* 结果匹配 xxx@gmail.com */ ``` - 风险写法(双引号直接拼接): ```sql SELECT * FROM users WHERE email LIKE "%@gmail.com"; /* 仅在默认模式下有效,可能不兼容 */ ``` 通过正确处理引号,您可以避免常见错误如`SQL syntax error`或查询结果异常[^1][^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cpp_learners

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值