Mysql字段为null的加减乘除运算方式

目录
  • Mysql字段为null的加减乘除运算
    • 解决办法
  • 数据库关于null不参与运算的坑
    • 举个例子:(阅读时:请记住这个字段以及它的值 )
    • 发生场景

Mysql字段为null的加减乘除运算

数据库表test_table

如下查询:

select
id,
total,
used,
(total - used) as have
from test_table;

查询结果:

解决办法

使用IFNULL 函数来解决NULL值问题

select
id,
IFNULL(total,0) as total,
IFNULL(used,0) as used,
(IFNULL(total,0) - IFNULL(used,0)) as have
from test_table;

查询结果:

数据库关于null不参与运算的坑

举个例子:(阅读时:请记住这个字段以及它的值 )

如果数据库表里字段值为 null 时,那么在写sql语句用这个值去做比较运算时(一般看见 null 或者参数类型为 string 时 也没有人去做加减乘除),除了 is nl 或者 is not nlll 没有其他操作, 有时 字段类型string ,值为 "2" 时, 会用 <> 如果数据库表里字段值为 null 时,那么在写sql语句用这个值去做比较运算时(一般看见 null 或者参数类型为 string 时 也没有人去做加减乘除),除了 is null 或者 is not null 没有其他操作, 有时 字段类型string ,值为 "2" 时, 会用 <> (不等于)] 判断,这都没问题,问题出现在 null 与其他值同时存在这个 当前字段 下,那么用 <> 会造成 mysql 查询不到数据,因为 <>"2" 不会把 null 过滤出去,此时 null 是参与运算的,所以sql语句应当调整为 坑 is null(is not null) and 坑=“2”(坑<>“2”) 这种写法,sql执行之后才会是我们想要的结果。

发生场景

Mybatis框架的动态sql 在写xml映射文件时 比如: <if test=" 坑 = ‘2’ 或(坑 <> ‘2’) > 这种不实时看数据库,脑子里还想着业务需求怎么实现时(一心二用)

其本质还是对于 基础知识 掌握不扎实,所以不断进步的同时,也不要忘了 夯实基础 个人理解: 动态sql最强大的 不是它的语法和格式的优点,首先 它并没有原生sql语句的可读性高,其次 动态sql本质也 仅仅 就起到一个sql语句拼接的作用,它真正强大的点是 <forEach> 这个可以遍历集合的标签,这是原生sql语句无法做到的事情,所以在没有对 集合 进行操作的情况下,尽量用原生sql去做。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 解决mysql使用not in 包含null值的问题

    注意!!! select * from user where uid not in (a,b,c,null); 这个sql不回返回任何结果.要避免not in的list中出现null的情况. 另外: –如果null参与算术运算,则该算术表达式的值为null.(例如:+,-,*,/ 加减乘除) –如果null参与比较运算,则结果可视为false.(例如:>=,<=,<> 大于,小于,不等于) –如果null参与聚集运算,则聚集函数都置为null(使用isnull(字段,0)等方式可以

  • MySQL中组合字段之concat()

    目录 1.简介 2.正文 2.1 字段拼接 2.2 字段执行算术计算 1.简介 MySQL是关系型数据库,我们在使用的时候往往会将对象的属性映射成列存储在表中,因此查询的到的结果在不做任何处理的情况下,也是一个个单独的属性:如果我们希望在MySQL中查询返回的结果集,能够将多个字段(列)的值组合起来返回.或者经过特定的计算后再返回,就可以使用MySQL提供的字段计算功能. 字段计算经常会用到如下两种: 字段拼接 字段执行算术计算 2.正文 MySQL中实现的字段组合都可以在客户机中完成,但是直接

  • SQL实现相邻两行数据的加减乘除操作

    SQL实现表里数据按一定顺序排序后,按某几个字段分组后相邻两行数据实现加减乘除运算. 思路: 1:先把表数据分组排序后打上序号标签 2:根据需求把标签字段加/减一 上代码: select distinct a.phone,from_unixtime(cast(floor(a.ts/1000) as bigint),'yyyyMMdd HH:mm:ss'),cha from table a join ( select a.phone,a.ts,abs(a.ts-b.ts)/1000 cha fro

  • Mysql字段为null的加减乘除运算方式

    目录 Mysql字段为null的加减乘除运算 解决办法 数据库关于null不参与运算的坑 举个例子:(阅读时:请记住这个字段以及它的值 ) 发生场景 Mysql字段为null的加减乘除运算 数据库表test_table 如下查询: select id, total, used, (total - used) as have from test_table; 查询结果: 解决办法 使用IFNULL 函数来解决NULL值问题 select id, IFNULL(total,0) as total,

  • MySQL字段为 NULL的5大坑

    目录 1.count 数据丢失 2.distinct 数据丢失 3.select 数据丢失 4.导致空指针异常 5.增加了查询难度 扩展知识:NULL 不会影响索引 总结 正式开始之前,我们先来看下 MySQL 服务器的配置和版本号信息,如下图所示: “兵马未动粮草先行”,看完了相关的配置之后,我们先来创建一张测试表和一些测试数据. -- 如果存在 person 表先删除 DROP TABLE IF EXISTS person; -- 创建 person 表,其中 username 字段可为空,

  • python mysql 字段与关键字冲突的解决方式

    解决方法:python中把字段名称用反引号(`),也就是ESC下面~那个按钮. 示例: 数据字段设计如下截图所示 待插入数据: datas = { 'sign_event':[ {'id': 1, 'name': '华为mate9发布会' , 'limit': 100, 'status': 1, 'address': '会展中心1号厅', 'start_time': '2017-09-20 14:00:00','create_time':'2017-08-20 14:00:00'}, {'id'

  • mysql字段为NULL索引是否会失效实例详解

    项目场景: 很多博客说mysql在字段中创建普通索引,如果该索引中的数据存在null值是不走索引这个结论是错误的,不过尽量还是设置默认值.(版本8.0低于这个版本可能结果不一致) 1.创建表sc_base_color,其中普通索引为 “name,group_num”,这里暂时不测组合索引,下面再测试. CREATE TABLE `sc_base_color` ( `id` bigint NOT NULL AUTO_INCREMENT, `group_num` bigint DEFAULT NUL

  • mysql 字段定义不要用null的原因分析

    一 NULL 为什么这么经常用 (1) java的null null是一个让人头疼的问题,比如java中的NullPointerException.为了避免猝不及防的空指针,需要小心翼翼地各种if判断,麻烦又臃肿. 为此有很多的开源包都有诸多处理 common lang3的StringUtils.isBlank(); CollectionUtils.isEmpty(); guava的Optional 甚至java8也引入了Optional来避免这一问题(和guava的大同小异,用法稍有一点点变化

  • 详解MySQL的字段默认null对唯一索引的影响

    目录 正文 看一下为何唯一索引为影响insert速度 MySQL版本:在docker中启动一个mysql 假设只存在邮箱注册: insert数据 经验 正文 在日常业务开发中,会经常遇到需要保证唯一性的数据业务,如用户注册业务.一般注册业务中允许用户以手机号或email注册账号,且需要保证唯一,不允许重复注册.当用户输入手机号或email登录时,程序会判定输入信息的存在与否性,存在则走登录,不存在则走注册.而保证唯一性就不仅仅需要在程序端做判断,还需要MySQL的唯一索引去做最后一道防线.那么唯

  • 为什么mysql字段要使用NOT NULL

    最近刚入职新公司,发现数据库设计有点小问题,数据库字段很多没有NOT NULL,对于强迫症晚期患者来说,简直难以忍受,因此有了这篇文章. 基于目前大部分的开发现状来说,我们都会把字段全部设置成NOT NULL并且给默认值的形式. 通常,对于默认值一般这样设置: 整形,我们一般使用0作为默认值. 字符串,默认空字符串 时间,可以默认1970-01-01 08:00:01,或者默认0000-00-00 00:00:00,但是连接参数要添加zeroDateTimeBehavior=convertToN

  • 使用MYSQL TIMESTAMP字段进行时间加减运算问题

    目录 MYSQL TIMESTAMP字段进行时间加减运算 计算公式如下 DATETIME 与 TIMESTAMP的区别 结论 参考文档 MYSQL TIMESTAMP字段进行时间加减运算 在数据分析过程中,想当然地对TIMESTAMP字段进行运算,导致结果谬之千里 计算公式如下 -- create_time与week_time的声明都是TIMESTAMP(), 要求精确到分钟 -- SELECT (sa.create_time - sa.week_time)/(1000 * 60) from a

  • MySQL查询空字段或非空字段(is null和not null)

    现在我们先来把test表中的一条记录的birth字段设置为空. mysql> update test set t_birth=null where t_id=1; Query OK, 1 row affected (0.02 sec) Rows matched: 1  Changed: 1  Warnings: 0 OK,执行成功! 设置一个字段值为空时的语法为:set <字段名>=NULL 说明一下,这里没有大小写的区分,可以是null,也可以是NULL. 下面看看结果: mysql&

  • mybatis-plus更新字段为null的处理方式

    目录 mybatis-plus更新字段为null处理 该如何设置? mybatis-plus将字段修改为null 注意事项 mybatis-plus更新字段为null处理 在mybatis-puls重设置的全局更新策略 为null的字段忽略更新.但是在某些业务需求下面,可能需要某些字段更新为null值. 该如何设置? mybatis-plus将字段修改为null myBatis Plus 版本3.1.2及以上 @TableField(strategy = FieldStrategy.IGNORE

随机推荐