JOIN 和 NULL
Posted Jesse_Li
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JOIN 和 NULL相关的知识,希望对你有一定的参考价值。
NULL值得数据出现在数据库发展的最初阶段的确给开发和使用者带来了很大的便利,这是因为它为我们节省了太多的磁盘空间,而且在那个年代磁盘是相当昂贵的。但是随着科技的发展,硬件系统的改进突飞猛进,NULL又给我们带来了很大的困扰。
下面我们来看下当我们进行JOIN操作时候,NULL值给我们带来的困扰。
CREATE TABLE dbo.Student ( Sno int null ,Name nvarchar(23) ) CREATE TABLE dbo.Score ( Sno int ,Score INT ) INSERT INTO dbo.Student(Sno,Name)VALUES(1,\'Jesse\'); INSERT INTO dbo.Student(Sno,Name)VALUES(2,\'Jessca\'); INSERT INTO dbo.Student(Sno,Name)VALUES(3,\'June\'); INSERT INTO dbo.Student(Sno,Name)VALUES(4,\'Supper\'); INSERT INTO dbo.Score(Sno,Score)VALUES (1,45) INSERT INTO dbo.Score(Sno,Score)VALUES (1,56) INSERT INTO dbo.Score(Sno,Score)VALUES (2,100) INSERT INTO dbo.Score(Sno,Score)VALUES (3,25) INSERT INTO dbo.Score(Sno,Score)VALUES (5,99) SELECT * FROM dbo.Student SELECT * FROM dbo.Score
下面向学生表中插入一条id 为NULL的值。
INSERT INTO dbo.Student(Sno,Name)VALUES(NULL,\'Mike\');
看下几种JOIN 的结果
SELECT * FROM dbo.Student SELECT * FROM dbo.Score SELECT * FROM dbo.Student a LEFT JOIN dbo.Score b ON a.Sno=b.Sno SELECT * FROM dbo.Student a INNER JOIN dbo.Score b ON a.Sno=b.Sno SELECT * FROM dbo.Student a RIGHT JOIN dbo.Score b ON a.Sno=b.Sno SELECT * FROM dbo.Student a FULL JOIN dbo.Score b ON a.Sno=b.Sno
这条NULL的值完全被作为一条新的id 值处理。
下面我们再为score插入一条NULL
INSERT INTO dbo.Score(Sno,Score)VALUES (NULL,98)
SELECT * FROM dbo.Student SELECT * FROM dbo.Score SELECT * FROM dbo.Student a LEFT JOIN dbo.Score b ON a.Sno=b.Sno SELECT * FROM dbo.Student a INNER JOIN dbo.Score b ON a.Sno=b.Sno SELECT * FROM dbo.Student a RIGHT JOIN dbo.Score b ON a.Sno=b.Sno SELECT * FROM dbo.Student a FULL JOIN dbo.Score b ON a.Sno=b.Sno
wi
此时,已经出来了好多的NULL,左表的NULL和右表的NULL都没有同时出现在一条记录里面,这意味着,NULL和NULL不是相等的。
以上是关于JOIN 和 NULL的主要内容,如果未能解决你的问题,请参考以下文章
spark关于join后有重复列的问题(org.apache.spark.sql.AnalysisException: Reference '*' is ambiguous)(代码片段