空值与NULL的区别
我们先来理解mysql中空值与NULL的区别是什么吧
⼀些刚刚接触MySQL的孩⼦,经常会错误的认为NULL与空字符串’ ’是相同的。这看似是⼀件不重要的事情,但是在MySQL中,这两者是完全不同的。NULL是指没有值,⽽”则表⽰值是存在的,只不过是个空值。。
这就相当于⼚⼦给职⼯分房⼦,⼀共只有⼀套,⽼张和⽼李都想要,可是经理告诉⽼张,下次有您的房⼦,可是⽼李压根就没⼈搭理他。所以⽼张的房⼦ 是“空”的,因为这是空⽩⽀票,不过毕竟经理张⼝了,⽽⽼李的房⼦就是NULL的,因为根本就没有⼈考虑过他。
⼀些根本不懂空值和NULL有什么区别,误导初学者。
所谓的NULL就是什么都没有,连都没有,在字符串中是结束符,但是在物理内存是占空间的,等于⼀个字节,⽽NULL就是连这⼀个字节都没有。 在数据库⾥是严格区分的,任何数跟NULL进⾏运算都是NULL, 判断值是否等于NULL,不能简单⽤=,⽽要⽤IS关键字, Mysql3.23.0或以后⽀持⽤ <=> ⽤来⽐较两个NULL值是否相等, 即 select * from table where id <=>NULL.
为什么会出现NULL?这是来源于数据库的左右连接,不是凭空想出来的(下⾯有脑补环节)。⽐如: A(ID, Name), B(ID, Address) 1, Name1 1, Shanghai 2, Name2 3, Beijing 当A左连接B则得到: 1, Name1, Shanghai 2, Name2, NULL 当A右连接B则得到: 1, Name1, Shanghai 3, NULL, Beijing
数据库的字段ID设为NOT NULL, 仅仅说明该字段不能为NULL, 也就是说只有在 INSERT INTO table(ID) VALUES(NULL); 这种情况下数据库会报错,⽽ INSERT INTO table(ID) VALUES( ‘ ‘);
这不能说明是NULL, 数据库系统会根据ID设的缺省值填充,或者如果是⾃增字段就⾃动加⼀ 等缺省操作。 例 值为NULL
delete from 表名 where 字段名=NULL 值为\"\"空值
delete from 表名 where 字段名='' 总结
判断NULL⽤is null 或者 is not null。 sql语句⾥可以⽤ifnull函数来处理
判断空字符串‘’,要⽤ ='' 或者 <>''。sql语句⾥可以⽤if(col,col,0)处理,即:当col为true时(⾮null,及⾮'')显⽰,否则打印0
脑补环节:
⼀般所说的左连接,外连接是指左外连接,右外连接。做个简单的测试你看吧。先说左外连接和右外连接:SQL>select * from t1;
ID NAME---------- -------------------- 1 aaa 2 bbb
SQL>select * from t2; ID AGE---------- ---------- 1 20 3 30左外连接:
SQL>select * from t1 left join t2 on t1.id=t2.id;
ID NAME ID AGE---------- -------------------- ---------- ---------- 1 aaa 1 20 2 bbb右外连接:
SQL>select * from t1 right join t2 on t1.id=t2.id;
ID NAME ID AGE---------- -------------------- ---------- ---------- 1 aaa 1 20 3 30
从上⾯的显⽰你可以看出:左外连接是以左边的表为基准。通俗的讲,先将左边的表全部显⽰出来,然后右边的表id与左边表id相同的记录就“拼接”上去,⽐如说id为1的记录。如果没有匹配的id,⽐如说t1中id为2的t2中就没有。那边就以null显⽰。右外连接过程正好相反。再看内连接:
SQL>select * from t1 inner join t2 on t1.id=t2.id;
ID NAME ID AGE---------- -------------------- ---------- ---------- 1 aaa 1 20
看到没有? 只有⼀条记录。内连接就是只取出符合过滤条件的记录 也就是t1.id=t2.id 那么符合t1.id=t2.id的记录只有id=1这⼀条,所以只显⽰⼀条。 不像外连接,是将你作为基准的表(左外连接就是左边表为基准,右外连接就是右边表为基准)的所有⾏都显⽰出来。
因篇幅问题不能全部显示,请点此查看更多更全内容