当前位置: 首页 > 知识库问答 >
问题:

mysql - 如何理解这条Mysql模糊查询语句?

柳俊逸
2024-05-20

如何理解这条Mysql模糊查询语句

select * from `user` where username like "%" 'name' "%"(可以查出数据)select * from `user` where username like "%" "name" "%"(查不出来数据)

我不太理解这两种写法字符串的拼接结果是什么

共有4个答案

申屠黎昕
2024-05-20

语法层面的,已经有回答解释过了,这是补充一下查询部分的。

你既然没有说 MySQL 版本,那我就只好用较新版本的 MySQL 来测,使用 explain 后再执行 show warnings; 可以看到 MySQL 处理后的语句,可以看到这两个的查询最终的 SQL 筛选部分都是一样的,而我这里执行也符合预期,两个查询都查到了数据,而不是你原题中说的那样。

mysql> select version();+-----------+| version() |+-----------+| 8.0.30    |+-----------+1 row in set (0.00 sec)mysql> explain select name from fake_person where name like "%" "米" "%";+----+-------------+-------------+------------+-------+---------------+----------+---------+------+---------+----------+--------------------------+| id | select_type | table       | partitions | type  | possible_keys | key      | key_len | ref  | rows    | filtered | Extra                    |+----+-------------+-------------+------------+-------+---------------+----------+---------+------+---------+----------+--------------------------+|  1 | SIMPLE      | fake_person | NULL       | index | NULL          | idx_name | 51      | NULL | 1955381 |    11.11 | Using where; Using index |+----+-------------+-------------+------------+-------+---------------+----------+---------+------+---------+----------+--------------------------+1 row in set, 1 warning (0.00 sec)mysql> show warnings;+-------+------+----------------------------------------------------------------------------------------------------------------------------------------------------+| Level | Code | Message                                            |+-------+------+----------------------------------------------------------------------------------------------------------------------------------------------------+| Note  | 1003 | /* select#1 */ select `big_data`.`fake_person`.`name` AS `name` from `big_data`.`fake_person` where (`big_data`.`fake_person`.`name` like '%米%')  |+-------+------+----------------------------------------------------------------------------------------------------------------------------------------------------+1 row in set (0.00 sec)mysql> explain select name from fake_person where name like "%" '米' "%";+----+-------------+-------------+------------+-------+---------------+----------+---------+------+---------+----------+--------------------------+| id | select_type | table       | partitions | type  | possible_keys | key      | key_len | ref  | rows    | filtered | Extra                    |+----+-------------+-------------+------------+-------+---------------+----------+---------+------+---------+----------+--------------------------+|  1 | SIMPLE      | fake_person | NULL       | index | NULL          | idx_name | 51      | NULL | 1955381 |    11.11 | Using where; Using index |+----+-------------+-------------+------------+-------+---------------+----------+---------+------+---------+----------+--------------------------+1 row in set, 1 warning (0.00 sec)mysql> show warnings;+-------+------+----------------------------------------------------------------------------------------------------------------------------------------------------+| Level | Code | Message                                            |+-------+------+----------------------------------------------------------------------------------------------------------------------------------------------------+| Note  | 1003 | /* select#1 */ select `big_data`.`fake_person`.`name` AS `name` from `big_data`.`fake_person` where (`big_data`.`fake_person`.`name` like '%米%')  |+-------+------+----------------------------------------------------------------------------------------------------------------------------------------------------+1 row in set (0.00 sec)
  • MySQL :: MySQL 8.0 Reference Manual :: 10.8.3 Extended EXPLAIN Output Format

或者在 MySQL 8 以上使用 explain analyze 也可以看到筛选部分都是一致的。

mysql> explain analyze select name from fake_person where name like "%" '米' "%";+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| EXPLAIN                                                                                                                                                                                                                                                                |+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| -> Filter: (fake_person.`name` like '%米%')  (cost=234625.68 rows=217243) (actual time=275.600..517.165 rows=6606 loops=1)    -> Covering index scan on fake_person using idx_name  (cost=234625.68 rows=1955381) (actual time=0.058..328.245 rows=2000000 loops=1)  |+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+1 row in set (0.52 sec)mysql> explain analyze select name from fake_person where name like "%" "米" "%";+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| EXPLAIN                                                                                                                                                                                                                                                                |+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| -> Filter: (fake_person.`name` like '%米%')  (cost=234625.68 rows=217243) (actual time=342.288..558.971 rows=6606 loops=1)    -> Covering index scan on fake_person using idx_name  (cost=234625.68 rows=1955381) (actual time=0.025..346.099 rows=2000000 loops=1)  |+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+1 row in set (0.56 sec)

最后亦或者使用 Optimizer Trace 这两条 SQL 得到的筛选也是一样的。

image.png
image.png

白浩荡
2024-05-20

使用单引号 ' 和双引号 " 的区别如下:

  1. 单引号 ':

    • 单引号用于包裹字符串文字或文本值。
    • 在单引号中,特殊字符如 ' 需要使用转义字符 '' 来表示。
    • 单引号查询会进行模糊匹配,包括空格等特殊字符。
  2. 双引号 ":

    • 双引号用于标识数据库对象,如表名、列名等。
    • 双引号查询会精确匹配,不会包括空格等特殊字符。

在这两个查询中:

  1. select * from user where username like "%" 'name' "%":

    • 这个查询使用单引号 ' 包裹 name
    • 它会进行模糊匹配,查找 username 包含 "name" 的记录。
  2. select * from user where username like "%" "name" "%":

    • 这个查询使用双引号 " 包裹 name
    • 它会进行精确匹配,查找 username 中包含字符串 "name" 的记录。

第一个查询可以查出数据,而第二个查询查不出数据
因为用户名中可能没有严格包含 "name" 的情况。

鲁弘厚
2024-05-20

连着写的引号括起的字符串会合成一个,
以上两种写法都能返回数据:

select username,2 from user where username like "%" "test" "%";

返回:

username 2
test123 2

华温书
2024-05-20

楼上说的只有在各个字符串之间使用空格作分隔时,这几个字符串才会连接起来(相当于like '%name%'),题目里的示例第一个查得出来数据而第二个查不出来,我试了下是没有用空格作分隔的情况。(如果用了空格则和楼上的回答一样两个都可以查得出来,见我截的官方文档里的示例),猜测是解析的时候用了某种转义再拼接?
image.png
话说回来官方的用法里并没有也不推荐用题目里的写法,如果要研究MYSQL是怎么处理这样的情况的话可以了解,正式使用的时候还是老老实实使用官方的示例和推荐的用法吧,比如CONCAT函数、CONCAT_WS函数以及这种字符串之间使用空格并排的用法。

 类似资料:
  • 主要内容:带有“%”通配符的查询,带有“_”通配符的查询,LIKE 区分大小写,使用通配符的注意事项和技巧在 MySQL 中, LIKE 关键字主要用于搜索匹配字段中的指定内容。其语法格式如下: [NOT] LIKE  '字符串' 其中: NOT :可选参数,字段中的内容与指定的字符串不匹配时满足条件。 字符串:指定用来匹配的字符串。“字符串”可以是一个很完整的字符串,也可以包含通配符。 LIKE 关键字支持百分号“%”和下划线“_”通配符。 通配符是一种特殊语句,主要用来模糊查询。当不知道真正

  • 本文向大家介绍mysql模糊查询like和regexp小结,包括了mysql模糊查询like和regexp小结的使用技巧和注意事项,需要的朋友参考一下 在mysql中实现模糊查询的有like和regexp。 ------------------------ like的用法许多人都是知道的,最为常用的情况就是select * from a where name like '%a%'; 其中'%'代表

  • 问题内容: 我已经阅读了一些博客和一些与优化有关的文章,介绍了如何优化查询。我读到我需要使用索引,并确保使用良好的关系数据库架构正确设置了所有主键和外键。 现在,我有一个查询需要优化,并且可以在上获得此查询: 我正在使用MySQL 5.5 我知道我正在使用但不使用我的临时表或文件排序吗?这是什么意思? 问题答案: 使用临时意味着MySQL需要使用一些临时表来存储执行查询时计算出的中间数据。 使用文

  • 主要内容:单一条件的查询语句,多条件的查询语句在 MySQL 中,如果需要有条件的从数据表中查询数据,可以使用 WHERE 关键字来指定查询条件。 使用 WHERE 关键字的语法格式如下: WHERE 查询条件 查询条件可以是: 带比较运算符和逻辑运算符的查询条件 带 BETWEEN AND 关键字的查询条件 带 IS NULL 关键字的查询条件 带 IN 关键字的查询条件 带 LIKE 关键字的查询条件 单一条件的查询语句 单一条件指的是在

  • 我使用的是+++。 我得到了4个DELETE,只想要一个数据库请求,所以我用一个“;”连接了DELETE命令...但总是失败。 它会抛出以下错误: 但如果我将此SQL粘贴到PhpMyAdmin中,它总是成功的... 如果我在单个查询中编写它,它也会成功。 多谢帮忙!

  • 本文向大家介绍Mysql| 使用通配符进行模糊查询详解(like,%,_),包括了Mysql| 使用通配符进行模糊查询详解(like,%,_)的使用技巧和注意事项,需要的朋友参考一下 通配符的分类: %百分号通配符: 表示任何字符出现任意次数 (可以是0次). _下划线通配符:表示只能匹配单个字符,不能多也不能少,就是一个字符. like操作符: LIKE作用是指示mysql后面的搜索模式是利用通