Mysql运算符

Mysql运算符

MYSQL运算符包括算数运算符、比较运算符、逻辑运算符与位运算符。

1.算数运算符

运算符作用
+加法
-减法
*乘法
/,DIV除法
%,MOD模运算,取余


除法运算与模运算如果除数是0,返回NULL。
示例:

 select 1/0,100%0;
结果为:NULL | NUll

2.比较运算符

比较结果为真,返回1;为假,返回0。

运算符作用
=等于
-不等于
<=>NULL安全的等于
<小于
>大于
> =大于等于
< =小于等于
BETWEEN介于两者之间
IN存在于某个指定集合
IS NULL为空
IS NOT NULL非空
LIKE通配符,可用于模糊查询
REGEXP或者PLIKE正则匹配


注意:
NULL = NULL 返回结果为NULL。
NULL不能使用“=,<,>,<>,<=,>=”操作符。
NULL可以使用”<=>” 操作符。 NULL <=> NULL 返回结果为1。
BETWEEN : a BETWEEN min AND max
IN : a IN (value1,value2,value3…..)
NOT IN : a NOT IN (value1,value2,value3…..)
IS NULL : a IS NULL
IS NOT NULL : a IS NOT NULL
LIKE: a LIKE %123% 如果a包含123则返回1,否则返回0
REGEXP: str REGEXP str_pat str_pat为正则表达式


3.逻辑运算符

运算符作用
NOT 或!逻辑非
AND 或&&逻辑与
OR或||逻辑或
XOR逻辑异或


逻辑非: 取反,但NOT NULL 返回值为NULL
逻辑与:全为真返回真,否则返回假。 但操作数中若存在NULL,返回值为NULL
逻辑或 : 任一为真则返回真。如果操作数全为NULL,则返回结果为NULL
逻辑异或: 两个操作数逻辑真假相异,返回值,否则返回假。如果存在任一操作数位NULL,返回值为NULL


4.位运算符

运算符作用
&位与
|位或
^位异或
~位取反
>>位右移
<<位左移


与运算 或运算 异或运算

    1110001    1110001     1110001    
  & 1001111  | 1001111   | 1001111  
   ---------  ---------    --------- 
    1000001    1111111     0111110

位取反

~0000001 
=1111110

位左移:所有二进制数左移一位,右边边补0;

11100011<<1 = 11000110 

位右移:所有二进制数右移移一位,左边边边补0;

11100011>>1 = 01110001 

参考资料:《深入浅出MySQL》

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

余额充值