mysql运算符

3.Mysql中的运算符
3.1算术运算符
+,-,*,/,%有加减乘除求余这几种运算符。
除法运算,求模运算中除数不能为0,否则将是非法除数,返回结果为null。
对于模运算,还可以这样表示:a%b或者mod(a,b)。
3.2比较运算符
其中=,<>不能用于null与null之间的比较,而<=>叫安全的等于,是可以用来比较nul值的,null<=>nulll。
小于运算符的比较:以及大于>,大于等于>=,小于等于<=等都一样。
between运算符:a between min and max。值在这范围之间,返回1,否则返回0。
当操作数类型不一样,则会先进行类型转换,再进行比较运算。
in运算符:a in(value1,value2,....),当a的值存在列表中时,则返回1,否则返回0。
is null运算符:select null is null;当值为null时,返回值为1,否则为0.
is not null运算符:is not nul是则返回1,否则返回0。
like运算符:像123 like '%123%',如果是这样,返回1否则返回0。注意%可以代表空,即可以代表没有。
REGEXP运算符:str regexp str_pat,如果str包含str_pat,则返回1,否则返回0。
3.3逻辑运算符

1.逻辑非运算符:NOT或!,如果操作数为0,则返回结果为1,为1则返回0。如果有一个操作数为null,则not null返回null。
2.逻辑与运算符:AND或&&,如果操作数有一个为0,则返回为0。如果有操作数为null,则返回null。
3.逻辑或运算符:OR或||,如果操作数有一个为1,则返回1。如果有1个操作数为null,其他为非零值,则返回1.都是null则返回null。
注意:0和1是一个特别的值,0和1是对立面,只有0和1两个值,还有null,就这三个值,像2和3等等之类都是1,是逻辑1。
逻辑异或运算符:XOR,当任意一个操作数为null,则返回null。比较如果两个逻辑值不一样,则返回1,值一样则返回0。
3.4位运算符
比较原则:位运算是将操作数转换为二进制数,然后每一位进行比较,中间要具体看你的比较原则,比较完后的二进制结果再转化为十进制数,就是最终结果。
1.位与运算符:
1与1则是1,否则都是0。
2.位或运算符:
0与0都是0,其他都是1。
3.位异或运算符:
相异则是1,相同则是0。
4.位取反运算符:~
5.位右移运算符:如:>>,100>>3,就是100的二进制数右移三位,左边补0。
6.位左移运算符:<<,100<<3就是100的二进制数左移三位,右边补0。
3.5 mysql中运算符优先级
这些运算符优先级很难记忆,一般都是用括号括起来,看出优先级的区别。
注意:在使用比较运算符时,要注意两边的操作类型是一致的才行,不然会得出错误的数据。
4.
4.1
4.2数值函数







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

余额充值