精华内容
参与话题
问答
  • MySQL 中NULL和空值的区别?

    万次阅读 多人点赞 2019-07-03 12:04:57
    作为后台开发,在日常工作中如果要接触Mysql数据库,那么不可避免会遇到Mysql中的NULL和空值。那你知道它们有什么区别吗? 学不动了,也不想知道它们有什么区别。大兄弟,不行啊,要面试! 前些天我的好朋友小木...

    做一个积极的人

    编码、改bug、提升自己

    我有一个乐园,面向编程,春暖花开!

    在这里插入图片描述

    01 小木的故事

    作为后台开发,在日常工作中如果要接触Mysql数据库,那么不可避免会遇到Mysql中的NULL和空值。那你知道它们有什么区别吗?

    学不动了,也不想知道它们有什么区别。大兄弟,不行啊,要面试!

    前些天我的好朋友小木去应聘工作,他面试完回来和我聊天回味了一道他的面试题。


    面试官:你有用过MySQL吗?

    小木:有!

    面试官:那你能大概说一下Mysql中 NULL值和空值的区别吗?

    小木:(思考…)NULL和空值都用过,你要我说它两有啥区别,这个我还真没仔细想过,反正实际开发中会用!

    听了小木的这个回答。

    我说:你这样回答肯定是不妥的,这个问题你是必挂了。

    小木说: NULL翻译过来不就是空吗?我是真的没有仔细想过,这个还是挺迷惑人的。


    为了其他的伙伴在遇到这个问题的时候不要像我的好友小木一样在此处跌倒,错过心仪的公司,下面简单整理聊聊这两者的一些区别和使用。

    02 NULL和空值

    NULL也就是在字段中存储NULL值,空值也就是字段中存储空字符(’’)。

    1、占用空间区别

    mysql>  select length(NULL), length(''), length('1');
    +--------------+------------+-------------+
    | length(NULL) | length('') | length('1') |
    +--------------+------------+-------------+
    | NULL         |          0 |           1 |
    +--------------+------------+-------------+
    1 row in set
    

    小总结:从上面看出空值(’’)的长度是0,是不占用空间的;而的NULL长度是NULL,其实它是占用空间的,看下面说明。

    NULL columns require additional space in the row to record whether their values are NULL.

    NULL列需要行中的额外空间来记录它们的值是否为NULL。

    通俗的讲:空值就像是一个真空转态杯子,什么都没有,而NULL值就是一个装满空气的杯子,虽然看起来都是一样的,但是有着本质的区别。

    2、插入/查询方式区别

    创建一个表,tb_test

    CREATE TABLE `tb_test` (
      `one` varchar(10) NOT NULL,
      `two` varchar(255) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

    插入进行验证:

    -- 全部插入 NULL,失败
    mysql> INSERT tb_test VALUES (NULL,NULL);
    1048 - Column 'one' cannot be null
    
    -- 全部插入 空值,成功
    mysql> INSERT tb_test VALUES ('','');
    Query OK, 1 row affected
    

    模拟数据:

    INSERT tb_test VALUES (1,NULL);
    INSERT tb_test VALUES ('',2);
    INSERT tb_test VALUES (3,3);
    

    空值字段:

    -- 使用 is null/is not null
    mysql> SELECT * FROM tb_test where one is NULL;
    Empty set
    
    mysql> SELECT * FROM tb_test where one is not NULL;
    +-----+------+
    | one | two  |
    +-----+------+
    | 1   | NULL |
    |     | 2    |
    | 3   | 3    |
    +-----+------+
    3 rows in set
    -- 使用 = 、!=
    mysql> SELECT * FROM tb_test where one = '';
    +-----+-----+
    | one | two |
    +-----+-----+
    |     | 2   |
    +-----+-----+
    1 row in set
    
    mysql> SELECT * FROM tb_test where one != '';
    +-----+------+
    | one | two  |
    +-----+------+
    | 1   | NULL |
    | 3   | 3    |
    +-----+------+
    2 rows in set
    
    

    NULL值字段:

    -- 使用 is null/is not null
    mysql> SELECT * FROM tb_test where two is not NULL;
    +-----+-----+
    | one | two |
    +-----+-----+
    |     | 2   |
    | 3   | 3   |
    +-----+-----+
    2 rows in set
    
    mysql> SELECT * FROM tb_test where two is NULL;
    +-----+------+
    | one | two  |
    +-----+------+
    | 1   | NULL |
    +-----+------+
    1 row in set
    
    -- 使用 = 、!=
    mysql> SELECT * FROM tb_test where two = '';
    Empty set
    
    mysql> SELECT * FROM tb_test where two != '';
    +-----+-----+
    | one | two |
    +-----+-----+
    |     | 2   |
    | 3   | 3   |
    +-----+-----+
    2 rows in set
    

    小总结:如果要单纯查NULL值列,则使用 is NULL去查,单纯去查空值(’’)列,则使用 =''

    建议查询方式:NULL值查询使用is null/is not null查询,而空值(’’)可以使用=或者!=、<、>等算术运算符。

    3、COUNT 和 IFNULL函数

    使用COUNT函数:

    mysql> SELECT count(one) FROM tb_test;
    +------------+
    | count(one) |
    +------------+
    |          3 |
    +------------+
    1 row in set
    
    mysql> SELECT count(two) FROM tb_test;
    +------------+
    | count(two) |
    +------------+
    |          2 |
    +------------+
    1 row in set
    
    mysql> SELECT count(*) FROM tb_test;
    +----------+
    | count(*) |
    +----------+
    |        3 |
    +----------+
    1 row in set
    

    使用IFNULL函数:

    mysql> SELECT IFNULL(one,111111111) from tb_test WHERE one = '';
    +-----------------------+
    | IFNULL(one,111111111) |
    +-----------------------+
    |                       |
    +-----------------------+
    1 row in set
    
    mysql> SELECT IFNULL(two,11111111) from tb_test where two is NULL;
    +----------------------+
    | IFNULL(two,11111111) |
    +----------------------+
    | 11111111             |
    +----------------------+
    1 row in set
    

    小总结:使用 COUNT(字段) 统计会过滤掉 NULL 值,但是不会过滤掉空值。

    说明:IFNULL有两个参数。 如果第一个参数字段不是NULL,则返回第一个字段的值。 否则,IFNULL函数返回第二个参数的值(默认值)。

    4、索引字段说明

    看到网上有一些人说: MySql中如果某一列中含有NULL,那么包含该列的索引就无效了。

    onetwo 字段分别加上普通索引。之前有写过,在复习添加索引:Mysql索引整理总结

    -- ALTER TABLE table_name ADD INDEX index_name(col_name);
    ALTER TABLE tb_test ADD INDEX index_oat (one, two);
    ALTER TABLE tb_test add INDEX index_two(two);
    

    使用 show keys from 表名;show indexes from 表名; ,查看这个表的所有索引信息。

    一个普通索引,一个复合索引。

    复合索引遵守“最左前缀”原则即在查询条件中使用了复合索引的第一个字段,索引才会被使用。因此,在复合索引中索引列的顺序至关重要。

    可以看到,创建了两个索引,并且index_tow NULL 那一列是 YES。

    使用EXPLAIN 来进行演示说明,EXPLAIN 的使用说明:Mysql中explain用法和结果字段的含义介绍

    复合索引

    普通索引

    发现查询two字段 是可以正常使用索引的。我使用的MYSQL 5.7 ,InnoDB 引擎。也看了一些网上的资料,MySQL中NULL对索引的影响 这个文章中用例子验证,MySQL可以在含有null的列上使用索引

    备注:可能是其他条件下不行,看网上资料说使用空间索引会失效,具体我没有去验证,空间索引没有用到过。查询官网create-index-spatial,感兴趣的伙伴可以自行验证。

    这里我想到一点,很多问题的答案都是在指定的条件和环境下才成立,多质疑,多验证。

    小总结 :在有NULL值得字段上使用常用的索引,如普通索引、复合索引、全文索引等不会使索引失效。在官网查看在空间索引的情况下,说明了 索引列必须为NOT NULL。

    03 总结提升

    如果你可以从上面的几个方面和面试官进行一个沟通,即使回答的不是那么的完美,但总比 “这两个都用过,具体有啥区别就不知道了” 这样的回答能好那么一点点。

    1、空值不占空间,NULL值占空间。当字段不为NULL时,也可以插入空值。

    2、当使用 IS NOT NULL 或者 IS NULL 时,只能查出字段中没有不为NULL的或者为 NULL 的,不能查出空值。

    3、判断NULL 用IS NULL 或者 is not null,SQL 语句函数中可以使用IFNULL()函数来进行处理,判断空字符用 =’‘或者<>’'来进行处理。

    4、在进行count()统计某列的记录数的时候,如果采用的NULL值,会别系统自动忽略掉,但是空值是会进行统计到其中的。

    5、MySql中如果某一列中含有NULL,那么包含该列的索引就无效了。这一句不是很准确。

    6:实际到底是使用NULL值还是空值(’’),根据实际业务来进行区分。个人建议在实际开发中如果没有特殊的业务场景,可以直接使用空值。

    以上就是我的对此问题的整理和思考,希望可以在面试中帮助到你。如果你对此话题有自己的思考和理解,也欢迎留言一起探讨!

    04 参考资料

    https://www.cnblogs.com/wzmenjoy/p/4244590.html

    https://dev.mysql.com/doc/refman/5.7/en/working-with-null.html


    谢谢你的阅读,如果您觉得这篇博文对你有帮助,请点赞或者喜欢,让更多的人看到!祝你每天开心愉快!


    Java编程技术乐园:一个分享编程知识的公众号。跟着老司机一起学习干货技术知识,每天进步一点点,让小的积累,带来大的改变!

    扫描关注,后台回复【资源】,获取珍藏干货! 99.9%的伙伴都很喜欢

    image.png | center| 747x519

    © 每天都在变得更好的阿飞云
    展开全文
  • python空值的一些问题

    千次阅读 2018-07-06 10:20:12
    #转自微信公众号 每日一Python在数据处理的过程中,经常会遇到数据为空的情况,然后踩到很多坑浪费很久的时间,今天总结一下Python中空值的情况,以防后续再掉进坑里。Python中空值一般有四种情况,None," &...

    #转自微信公众号 每日一Python

    在数据处理的过程中,经常会遇到数据为空的情况,然后踩到很多坑浪费很久的时间,今天总结一下Python中空值的情况,以防后续再掉进坑里。

    Python中空值一般有四种情况,None," ",False和NaN:

    前三种类型中 打印 None == None ," " == " " ,False == False都能返回判断True,但是np.NaN == np.NaN 却返回为False,如图:


    要创建一个空值可以用np.NaN,而且type(np.NaN)是float类型,而type(None)是NoneType类型,type(" ")是字符串类型,而在pandas中的数据类型例如Series和DataFrame中如果数组中除了空值之外全部是数值类型则None会转化正NaN


    在Series或者DataFrame整体判断是否为空时,用isnull(),返回一个布尔型的矩阵;而且只有None 和NaN才被判断为空值

    要是判断某一列中有空值存在,可以使用isnull().any():

    当判断单个值是否为空时,要用np.isnan(),但是np.isnan()只能用于数值型,NaN是Not a Number的缩写;其他类型可以用type(x).__name__ == 'float'来判断是否为空值,也可以利用np.NaN != np.NaN的特性来判断(即自身不等于自身时,该值为空值),这些方法只适用于空值为NaN类型的,当空值类型为None时,可以使用type(x) .__name__ == 'NoneType'来判断


    可以用data[data.isnull().values==True]来筛选含有空值的行,但是如果某行有多个值是空值,则会重复次数出现,所以利用data[data.isnull().values==True].drop_duplicates()来去重:

    为了将空值统一格式处理,可以在读取数据是限制一下,read_csv(na_values='NULL')将空值统一成NaN处理。
    展开全文
  • 数据库空值处理

    千次阅读 2013-06-21 16:34:14
    今天写数据库存储过程,本来好好的,没想到后来碰到表里字段为空的就进行不下去了,一个简单的条件判断,跟空值有关。纠结一阵后去网上一查,立时便明白了,哎又被null给绊倒了一次,真是不长记性啊!  网上相关的...

          今天写数据库存储过程,本来好好的,没想到后来碰到表里字段为空的就进行不下去了,一个简单的条件判断,跟空值有关。纠结一阵后去网上一查,立时便明白了,哎又被null给绊倒了一次,真是不长记性啊!

           网上相关的资料有很多,这里我也不多说,只是记录一下自己的错误和解决方法!

            当时条件判断,为一个变量是否为空,如果是空该怎么办,平时写惯了,果断的写了 if  @ss  = NULL ; 结果无论我怎么处理都不会满足这个条件,百度后才知道原因是:在 SQL 语句中, NULL 值与字符列中的空格, 数字中的零, 字符列中的 NULL ASCII 字符都不相同. 当DBMS在一列中发现一个 NULL 值时, 就将其翻译为未定义或是不可用的. DBMS不能在一列中做出有关 NULL 的假设, 也不能假设 NULL 值等于 NULL, 造成某一列成为 NULL 的因素可能是: (1),值不存在;(2), 值未知; (3), 列对表不可用. 所以, 应将 NULL 值当作是一个批示符, 而不是一个值. 当DBMS 在表的某一行的某一列中找到 NULL 值时, DBMS就知道该数据已丢失或者是不可用.

       一句话, NULL 指示这个值 "未知",原因是它可能不存在, 可能不可用, 也可能就是因为值未知.

              因此,在T-SQL命令中,判断一个值是不是空值,要用“is null”而不是“= null”;处理空值有个ISNULL函数,它使用指定的值替换null。

              null 这个值很有意思啊! 如果用查询语句查看的时候有某一字段为null (注意不是NULL)就相当于此字段已有值了 就是null值,无论是用if exists (select ........) 和 select ....... from table where xx is not null 都能够将这个为null值的字段给查出来。在表里是区分大小写的,这是一定的,所以null 和NULL就不一样了。所以当一个字段设置可以为空时,表里自动填充NULL。

             还有空字符的情况。空字符串(零长度字符串),只出现在字符串类型(如nvarchar)的字段中,SQL server中表示为’’,显示为空白,手工在SQL server企业管理器中输入时清空一个单元格即可。它在.NET中对应System.String.Empty,也就是我们常用的""。在T-SQL命令中处理空字符串和处理一般的字符串没什么区别。用ADO.NET从数据库得到的空字符串也和一般的字符串没什么区别。

     

    展开全文
  • 空值处理

    2019-09-30 22:30:40
    特点:oracle数据库中,没有数据表示空,如果空参与计算结果为空.oracle数据库中任何类型都可以为空. nvl(exp1,exp2) 作用:如果exp1不为空,返回exp1的结果,如果exp1为空,那么返回exp2的结果. # 查询员工姓名以及员工的...

    特点:oracle数据库中,没有数据表示空,如果空参与计算结果为空.oracle数据库中任何类型都可以为空.

    nvl(exp1,exp2)
    作用:如果exp1不为空,返回exp1的结果,如果exp1为空,那么返回exp2的结果.
    # 查询员工姓名以及员工的月收入(sal+comm)
    select ename,sal+nvl(comm,0) from emp;
    -- 为查询的结果定义别名
    select ename,sal+nvl(comm,0) salary from emp;
    -- 使用as关键字
    select ename,sal+nvl(comm,0) as salary_total from emp;
    -- 别名中存在特殊符号
    select ename,sal+nvl(comm,0) "salary total" from emp;
    1
    2
    3
    4
    5
    6
    7
    8
    dual:虚表(伪表),oracle提供一个用于测试函数或者过程的表.
    -- 测试nvl2的功能
    select nvl2(null,1,2) from dual;
    1
    2
    nvl2(exp1,exp2,exp3)
    如果exp1不为null返回exp2的结果,如果exp1为null,那么返回exp3;
    -- 如果该员工有提成,那么工资涨幅0.2,没有提成工资不变,存在comm为0
    select ename,nvl2(comm,sal+sal*0.2,sal) salary from emp;
    1
    2
    nullif(expr1,expr2)
    如果两个表达式相等,那么返回null,否则返回exp1的结果
    select nullif(1,1) from dual;
    -- 如果该员工有提成,那么工资涨幅0.2,没有提成工资不变,存在comm为0
    select ename,nvl2(nullif(comm,0),sal+sal*0.2,sal) salary from emp;
    1
    2
    3
    COALESCE(expr1,…,exprn)
    返回第一个非空的表达式的值
    -- 发奖金,如果工资为null并且提成null发200,如果工资不为空直接发工资,如果提成不为空那么发提成.
    select coalesce(sal,comm,200) from emp;
    1
    2
    case 表达式:类似于java中的switch语句
    case expr1
    when value1 then 执行语句
    ...
    else 执行语句
    end --表示结束

    -- 如果职位是SALESMAN,工资提高20%,MANAGER工资提高10%,其他提高5%
    select ename,sal old_sal,
    case job(http://www.amjmh.com/v/BIBRGZ_558768/)
    when 'SALESMAN' then sal*1.2
    when 'MANAGER' then sal*1.1
    else sal*1.05
    end new_sal
    from emp;

    -- 创建成绩表
    create table t_grade(
    id number primary key,
    class varchar2(20),
    score number
    );
    -- 准备数据
    insert into t_grade values(1001,'语文',80);
    insert into t_grade values(1002,'java',70);
    insert into t_grade values(1003,'C++',60);
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    SIGN(n)
    如果n>0返回1,如果n<0返回-1,如果n=0返回0
    select sign(-1) from dual;
    --获得成绩表中的等级
    select class,
    case sign(score-80)
    when 1 then '优秀'
    when 0 then '优秀'
    when -1 then '良好'
    end lel
    from t_grade;

    select class,
    case sign(score-80)
    when 1 then '优秀'
    when 0 then '优秀'
    when -1 then
    case sign(score-70)
    when 1 then '良好'
    when 0 then '良好'
    else '不及格'
    end
    end lel
    from t_grade;
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    decode(expr1,match1,reustl1,…,default);
    说明:如果expr1的值和match1匹配,返回result1的结果,如果都不匹配返回defualt的值.
    ---- 如果职位是SALESMAN,工资提高20%,MANAGER工资提高10%,其他提高5%
    select ename,sal old_sal,
    decode(job,'SALESMAN',sal*1.2,'MANAGER',sal*1.1,sal*1.05) new_sal
    from emp;
    --获得成绩表中的等级
    select class,
    decode(sign(score-80),
    0,'优秀',
    1,'优秀',
    -1,decode(sign(score-70),0,'良好',1,'良好',
    -1,decode(sign(score-60),-1,'不及格','及格'))) lel
    from t_grade;
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    ---------------------

    转载于:https://www.cnblogs.com/ly570/p/11335147.html

    展开全文
  • 空值的处理

    2020-04-22 14:06:40
    1.取空值的时机: 1.1不知道取什么值,比如学生登记表,某个学生的年龄忘记填了。 1.2不能取值:比如选了课,缺考了,所以成绩表的成绩填空。 1.3由于某种原因不便填写,比如一个人的手机号码不便填写。 2.空值的...
  • 什么是空值

    2020-05-20 22:50:52
    与数据库开发相关的空值是生活中的一个小谜团,对于那些冒险进入数据库世界的新手来说,这是一个完全困惑的话题。 Null值不为零(0),长度为零(0)的字符串,空字段或根本没有任何值-那么Null到底是什么? 本主题...
  • 一直对空值和null值的概念理解不清晰,所以结合资料以及自己的理解对他们的区别和处理方式进行总结。首先就是在概念上的不同:1、空值不占空间2、null值占空间。打个比喻就是空值表示一个杯子是真空状态,什么都没有...
  • hive中的NULL(hive空值处理)

    万次阅读 2016-05-19 10:27:45
    HIVE中默认将NULL存为\N,可以在线上用hadoop fs -cat查看源文件,文件中存储大量\N, 这样量大会浪费大量空间。如果用java、python操作源数据时要注意解析。 另外,hive表的源文件中默认,列分隔符为\001(SOH),行...
  • 数据库空值和null的区别

    万次阅读 2015-09-01 10:38:55
    所谓的NULL就是什么都没有,连\0都没有,\0在字符串中是结束符,但是在物理内存是占空间的,等于一个字节,而NULL就是连这一个字节都没有。在数据库里是严格区分的,任何数跟NULL进行运算都是NULL, 判断值是否等于...
  • pandas 缺失值与空值处理

    万次阅读 多人点赞 2018-07-07 10:30:49
    相关概念空值:在pandas中的空值是""缺失值:在dataframe中为nan或者naT(缺失时间),在series中为none或者nan即可3.函数具体解释DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, in...
  • pandas删除含有空值的行

    万次阅读 2018-07-14 13:30:16
    df.dropna(axis=0, how='any', inplace=True) axis:0-行操作(默认),1-列操作 how:any-只要有空值就删除(默认),all-全部为空值才删除 inplace:False-返回新的数据集(默认),True-在愿数据集上操作...
  • 那些年我们踩过的坑,SQL 中的空值陷阱!

    千次阅读 多人点赞 2019-12-31 07:31:17
    在数据库中,空值(NULL)是一个特殊的值,通常用于表示缺失值或者不适用的值。今天我们来详细讨论一下数据库中的空值问题,主要包括 MySQL、Oracle、SQL Server、PostgreSQL 以及 SQLite。
  • matlab 空值预处理

    2012-02-26 13:26:11
    用matlab做的数据空值处理。其中包含了数值型的和字符型的数据类型。在代码中加入了详细的注释说明。有做数据分析的可以用此方法进行一些数据的预处理。
  • redis 缓存空值

    千次阅读 2019-11-23 11:24:34
    redis缓存空值 redis缓存空值可以在一定程度上应对高并发的场景下的缓存穿透 ********************************** 相关类 RedisCacheConfiguration public class RedisCacheConfiguration { private ...
  • 1 ,每列有多少空值 : data.isnull().sum() 代码 : if __name__ == '__main__': # 读文件 csv data = pd.read_csv("titanic_train.csv") # 空值统计 res = data.isnull().sum() print(res) ===============...
  • ============================================================ Author: hjjdebug Date: 2018年 08月 24日 星期五 20:27:01 CST ============================================================ ...
  • 今天小编就为大家分享一篇python处理csv中的空值方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • Spark Dataset DataFrame空值null,NaN判断和处理 import org.apache.spark.sql.SparkSession import org.apache.spark.sql.Dataset import org.apache.spark.sql.Row import org.apache.spark.sql.DataFrame import ...
  • fastjson输出空值

    千次阅读 2017-07-28 19:08:45
    fastjson如何输出空值
  • pyspark 空值填充

    千次阅读 2019-06-04 12:27:05
    在进行数据分析的时候,空值的处理是数据预处理过程中的重要环节。在利用pyspark进行数据空值填充的过程中,遇到了一个坑,坑得明明白白。就是简单的空值处理,花费了好几天的时间。其实还是API的理解不到位的原因。...

空空如也

1 2 3 4 5 ... 20
收藏数 235,237
精华内容 94,094
关键字:

空值