mysql运算符

1使用算数运算符:(加减乘除求模运算)

例:

注释:             /   或 div:除法 ;               %  或 mod:求余   

且当除数为0时属于非法操作,所得值都为空

例:

2使用比较运算符

大于 >             小于  <           等于 =或<=>              不等于 !=或 <>         大于等于>=        小于等于<=

存在于指定范围:between  and        为空:is null       存在于指定集合:in        通配符:like                 正则表达式匹配:regexp  例:

 

执行结果:=或<=>可以判断数值,字符串和表达式是否相等,相等返回1,否则返回0;他们进行比较时,是依据字符的ASCII码来判断,前者不能操作null(空值),后者确可以,如果null=null时会返回null,<=>则会返回1;

例:

执行结果:<>和!=用来判断数值,字符串和表达式等是否不相等,如果不相等则返回1,否则返回0.

例:

执行结果:判断字符串,数值,表达式等相关的比较,成立返回1,否则返回0.

3特殊功能运算符:

匹配字符串的开始部分 :^               匹配字符串的结束部分:$                        匹配字符串中的任意一个字符: .

匹配字符集合中的任意一个字符:[字符集合]                                                    匹配字符集合外中的任意一个字符:[^字符集合]

匹配str1|str2|str3中的任意一个字符串 :str1|str2|str3                                       匹配字符,包括0个或1个:*

匹配字符,包含1个:+                     字符出现n次:字符串{n}                           字符串至少出现M次最多出现N次:{M,N}

例:

 

执行结果:通过模式字符^ 比较是否以字符或字符串开头,符合返回1,否则返回0;

例:

执行结果:通过模式字符^$比较是否以字符或字符串结尾,相符合返回1,否则返回0;

例:

执行结果:用"."来代替,有几个字符就用几个点,相等返回1,不等返回0

例:

执行结果:执行带有[^]和[]模式的语句,可以实现比较是否含指定字符中的任意一个和指定字符外任意一个,相符返回1,否则返回0.

例:

执行结果:通过*和+可以匹配字符z之间有多个字符a,不过*可以表示0个或任意一个,+表示至少一个

例:

执行结果:| 表示是否包含指定字符串中的任意一个字符串

例:

执行结果:c{3}表示字符c连续出现3次,zxc{1,5}表示至少出现1次

 

### MySQL 运算符失效的原因及解决方案 当遇到MySQL运算符失效的情况时,通常是因为查询语句不符合优化器预期的形式或存在某些配置问题。具体到`id NOT IN (48,49,51)`这类子查询操作可能导致索引无法被有效利用[^2]。 #### 原因分析 - **隐式转换**:如果列的数据类型与常量列表中的数据类型不匹配,则会发生隐式转换,这可能会阻止使用索引。 - **NULL值处理**:对于`NOT IN`来说,只要集合中有任何一条记录返回`NULL`,整个表达式的计算结果就会变成未知(`UNKNOWN`)状态,从而影响性能甚至逻辑正确性。 - **统计信息过期**:数据库内部依赖于表结构和数据分布的信息来决定最佳执行计划;这些元数据可能因为频繁更新而变得陈旧,进而误导查询规划器做出次优选择。 #### 解决策略 为了改善这种情况并使索引能够正常工作: ##### 方法一:重构SQL语句 可以考虑改写原始的`IN/NOT IN`条件为`JOIN`或者`EXISTS`形式,后者往往能更好地触发索引扫描路径。 ```sql SELECT u.id FROM user AS u LEFT JOIN ( SELECT 48 as id UNION ALL SELECT 49 UNION ALL SELECT 51 ) t ON u.id = t.id WHERE t.id IS NULL; ``` 这种方法通过外连接的方式实现了相同的功能需求,同时提高了可读性和维护便利度。 ##### 方法二:强制指定索引提示 虽然这不是最推荐的做法,但在特定场景下确实可以帮助解决问题。可以通过给定的`FORCE INDEX`指示词告诉引擎优先选用某个已知有效的索引来加速检索过程。 ```sql SELECT /*+ FORCE_INDEX(idx_user_id) */ id FROM user USE INDEX FOR JOIN (idx_user_id) WHERE id NOT IN (48,49,51); ``` 请注意这种方式应当谨慎应用,并且最好是在充分测试之后再部署至生产环境。 ##### 方法三:定期更新统计数据 保持最新的表级统计有助于让查询优化器作出更合理的判断。可通过运行如下命令刷新相关表的对象属性缓存以及重新收集必要的频率直方图等辅助资料。 ```sql ANALYZE TABLE `user`; OPTIMIZE TABLE `user`; -- 对MyISAM存储引擎特别有用 ``` 以上措施均旨在提升涉及复杂谓词条件下SQL语句的表现力及其背后所依托的基础架构效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值