mysql中空值的sql左连接

eni9jsuy  于 2021-06-21  发布在  Mysql
关注(0)|答案(4)|浏览(303)

我面临着加入mysql的概念问题
让我们考虑两张table

Employee                        Salary
name      salary           Salary    Grade
Nikhil    10000            10000     A
Akhil     10000            20000     B
Shubham   NULL             10000     C
Abhishek  2000

sql查询是

select *
from Employee as e LEFT JOIN
     SALARY as s
     on s.Salary = e.salary

在输出中,我得到6行而不是4行。

name      salary   Salary    Grade
Nikhil    10000    10000     A
Akhil     10000    10000     C  
Nikhil    10000    10000     C   
Akhil     10000    10000     A      
Shubham   NULL     NULL      NULL
Abhishek  2000     20000     B
muk1a3rh

muk1a3rh1#

你得到了正确的答案。有两排有 salary = 10000Salary . 这两行都匹配nikhil和akhil,结果是重复的。
这会发生在 inner join . 这会发生在没有 NULL 价值观。
大概是 salary 为了 C 应该换成别的。

oxcyiej7

oxcyiej72#

left join表示左表中的所有记录,只要它不在右表中。因为左边的表有空值,所以它有6个答案如果你想要4个答案,你可以有这样一个条件来省略空值:select*
从雇员作为e left join
工资(s)
on s.salary=e.salary,其中等级不为空

axzmvihb

axzmvihb3#

首先,我假设您的示例数据集 Abhisek 20000 ,不是 Abhisek 2000 ,因为如果你使用 Abhisek 2000 .
第二,使用 * 正在返回重复的列(是的,我知道那个叫 salary 另一个叫做 Salary -但你要加入那个专栏。它们的价值是一样的。无需返回该值两次。)
第三,你似乎不明白 JOIN 建立其结果。您看到的“额外”行来自于您没有加入唯一数据的事实。有两排 Salary 值为 10000Salary 列。
所以你的 LEFT JOIN 开始于 Salary 并尝试在 Employee 表中的每个记录。这就是如何从 JOIN :
它在哪里查找任何记录 Salary.Salary = 10000 AND Employee.salary = 10000 . (这就是 JOIN 对于“a级”。)它会找到2个匹配项-一个是nikhil,一个是akhil。所以你从这里得到两行 JOIN .
它在哪里查找任何记录 Salary.Salary = 20000 AND Employee.salary = 20000 . (这就是 JOIN 对于“b级”。)它找到1个匹配项(假设阿披实的“真实”值是20000,而不是2000) JOIN . 您现在有3行。
它在哪里查找任何记录 Salary.Salary = 10000 AND Employee.salary = 10000 . (这就是 JOIN 对于“c级”。)它会找到2个匹配项-一个是nikhil,一个是akhil。所以你从这里得到两行 JOIN . 你现在有5行了。
最后,你的shubham还有一排。shubham没有任何匹配 JOIN ,但它是原作的一部分 SELECT ... FROM 条款。所以你还是把那一排还给我。你现在有6排了。
最后,另一位受访者建议您可以消除 NULL 这样做的结果是: WHERE grade <> NULL . 那是错误的。这将消除所有行。如果你想过滤掉 NULL 值,则需要添加以下内容: WHERE grade IS NOT NULL .

rbl8hiat

rbl8hiat4#

结果是正确的。left join返回左表中的所有记录,即使右表中没有匹配的记录(用null填充字段)。结果中的其余行来自重复的10000薪水。

相关问题