空值与NULL的区别附:左连接+右连接+内连接
空值与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
join on是什么连接  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这⼀条,所以只显⽰⼀条。不像外连接,是将你作为基准的表(左外连接就是左边表为基准,右外连接就是右边表为基准)的所有⾏都显⽰出来。