MySQL运算符

运算符是告诉MySQL执行特定算数或逻辑操作的符号。MySQL的内部运算很丰富,主要有四大类,分别是:算数运算符、比较运算符、逻辑运算符、位操作运算符

算数运算符

算数运算符用于各类数值运算,包括加(+)、减(-)、乘(*)、除(/)、求余(%)

比较运算符

比较运算符的结果总是1、0或NULL,比较运算符经常在select的查询条件子句中使用,用来查询满足指定条件的记录。
1.等于运算符(=)用来判断数字、字符串和表达式是否相等。如果相等,返回值为1,否则返回0。它不能用于NULL的判断。
            数值比较规则:
            1.若有一个或两个参数为NULL,则比较运算的结果为NULL
            2.若同一个比较运算中的两个参数都是字符串,则按照字符串进行比较
            3.若两个参数均为整数,则按照整数进行比较
            4.若一个字符串和数字进行相等判断,则MySQL可以自动将字符串转换为数字
2.安全等于运算符(<=>)和=操作符执行相同的比较操作,不过<=>可以用来判断NULL值。在两个操作数均为NULL时,其返回值为1.而当一个操作数为NULL时,返回值为0而不是NULL。
3.不等于运算符(<>或者!=)用于判断数字、字符串、表达式不相等的判断。如果不相等返回1,否则返回0.都不可以用于判断空值NULL
4.小于或等于运算符(<=)用来判断左边的操作数是否小于或者等于右边的操作数。如果小于或等于返回值为1,否则返回0。不能用于判断空值NULL,否则返回NULL.
5.小于运算符(<)用来判断左边的操作数是否小于右边的操作数。如果小于返回值为1,否则返回0。不能用于判断空值NULL,否则返回NULL.
6.大于或等于运算符(>=)用于判断左边的操作数是否大于或者等于右边的操作数,如果大于或者等于,返回1,否则返回0.不能用于判断空值NULL,否则返回NULL
7.大于运算符(>)用于判断左边的操作数是否大于右边的操作数,如果大于返回1,否则返回0.不能用于判断空值NULL,否则返回NULL
8.IS NULL和ISNULL()检验一个值是否为NULL,如果为NULL,返回值为1,否则返回值为0.
           IS NOT NULL检验一个值是否为NULL,如果为NULL,返回值为0,否则返回值为1.
9.BETWEEN AND运算符,格式为:expr BETWEEN min and max。假如expr大于或等于min且小于或等于max,则返回值为1,否则为0。
10.LEAST运算符,语法格式:LEAST(值1,值2,....,值n),其中值n表示参数列表中有n个值。在有两个或多个参数的情况下,返回最小值。假如任意一个值为NULL,则返回NULL。
11.GREATEST(value1,value2,...),当有2个或多个参数时,返回值为最大值假如任意一个自变量为NULL,则返回NULL。
12.IN 运算符用于判断操作数是否为IN列表中的其中一个值,如果是,返回1,否则返回0.
     NOT IN 运算符用于判断操作数是否为IN列表中的其中一个值,如果是,返回0,否则返回1.
13.LIKE运算符用来匹配字符串,语法为:expr Like 匹配条件,如果满足匹配条件,返回1,否则返回0.若expr或匹配条件中任何一个为NULL,则结果为NULL
            LiKE运算符在进行匹配时,可以使用下面两种通配符:
            1.'%',匹配任何数目的字符,包括零字符
            2.'_',只能匹配一个字符
14.REGEX运算符用来匹配字符串,语法格式为:expr REGEX 匹配条件,如果expr满足匹配条件,返回1,否则返回0.若expr或匹配条件中任何一个为NULL,则结果为NULL
            REGEX运算符在进行匹配时,常用的通配符:
            1.'^'匹配以该字符后面字符开头的字符串
            2.'$'匹配以该字符后面的字符结尾的字符串
            3.'.'匹配任何一个单字符
            4."[...]"匹配在方括号内的任何字符。
            5.'*'匹配零个或多个在它前面的字符。
    

逻辑运算符

1.逻辑非运算符NOT或!表示当操作数为0时,所得值为1;当操作数为非零时,所得值为0.当操作数为NULL时,所得值为NULl。
2.逻辑与运算符AND或者&&表示当所有操作数均为非零值、并且不为NULL时,计算所得值为1.当一个或多个操作数为0时,所得结果为0,其余情况返回NULL。
3.逻辑或运算符OR或||表示当两个操作数均为非NULL值,且任意一个操作数为非零值,结果为1,否则为0.当有一个操作数为NULL,且另一个为非零值时,结果为1,否则为NULL。当两个操作数均为NULL,则结果为NULL。
4.逻辑异或运算符XOR。当任意一个操作数为NULL时,返回值为NULL;对于非NULL的操作数,如果两个操作数都是非零值或都是零值,则返回0值;如果一个为0,另一个为非零,则结果为1。

位运算符

是用来对二进制字节中的位进行测试、移位或测试处理,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、付费专栏及课程。

余额充值