MySql运算符

算数运算符


加(+)、减(-)、乘(*)、除(/)、求余(%)

比较运算符


大于(>)、小于(<)、等于(=)、大于等于(>=)、小于等于(<=)、不等于(!= 或者 <>)、安全等于(<=>)
in、between and、is null、greatest、least、like、regexp

逻辑运算符


逻辑非(not 或者 !)、逻辑与(and 或者 &&)、逻辑或(or 或者 ||)、逻辑异或(xor)

位操作运算符


位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)

注意


1、算数运算符,除以0结果为null
2、比较运算符,结果总是1、0、null;当一个或多个操作数为null时,结果为null。
3、比较运算符,安全等于<=>与null比较时,操作数都为null,结果为1;一个为null时,结果为0。
4、比较运算符,least和greatest参数中,若存在null值,则结果为null。
5、比较运算符,regexp常用通配符:^、$、.、[]、*、{}、?、+
6、逻辑运算符,一个操作数为null时,结果可能为null(和顺序有关,不同操作符规则也不同);两个操作数为null时,结果为null。
7、位操作运算符,运算后结果为64位无符号整数,可以使用bin()查看。
8、Windows平台下默认不区分大小写,字符串强制大小写比较前面加binary,例如:binary'a'='A'。

转载于:https://www.cnblogs.com/jonathanzhao/p/5012843.html

### 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、付费专栏及课程。

余额充值