如何理解这条Mysql模糊查询语句
select * from `user` where username like "%" 'name' "%"(可以查出数据)select * from `user` where username like "%" "name" "%"(查不出来数据)
我不太理解这两种写法字符串的拼接结果是什么
语法层面的,已经有回答解释过了,这是补充一下查询部分的。
你既然没有说 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 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 得到的筛选也是一样的。
使用单引号 '
和双引号 "
的区别如下:
单引号 '
:
'
需要使用转义字符 ''
来表示。双引号 "
:
在这两个查询中:
select * from user where username like "%" 'name' "%"
:
'
包裹 name
。select * from user where username like "%" "name" "%"
:
"
包裹 name
。第一个查询可以查出数据,而第二个查询查不出数据
因为用户名中可能没有严格包含 "name" 的情况。
连着写的引号括起的字符串会合成一个,
以上两种写法都能返回数据:
select username,2 from user where username like "%" "test" "%";
返回:
username | 2 |
test123 | 2 |
楼上说的只有在各个字符串之间使用空格作分隔时,这几个字符串才会连接起来(相当于like '%name%'),题目里的示例第一个查得出来数据而第二个查不出来,我试了下是没有用空格作分隔的情况。(如果用了空格则和楼上的回答一样两个都可以查得出来,见我截的官方文档里的示例),猜测是解析的时候用了某种转义再拼接?
话说回来官方的用法里并没有也不推荐用题目里的写法,如果要研究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后面的搜索模式是利用通