我面临着加入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
4条答案
按热度按时间muk1a3rh1#
你得到了正确的答案。有两排有
salary = 10000
在Salary
. 这两行都匹配nikhil和akhil,结果是重复的。这会发生在
inner join
. 这会发生在没有NULL
价值观。大概是
salary
为了C
应该换成别的。oxcyiej72#
left join表示左表中的所有记录,只要它不在右表中。因为左边的表有空值,所以它有6个答案如果你想要4个答案,你可以有这样一个条件来省略空值:select*
从雇员作为e left join
工资(s)
on s.salary=e.salary,其中等级不为空
axzmvihb3#
首先,我假设您的示例数据集
Abhisek 20000
,不是Abhisek 2000
,因为如果你使用Abhisek 2000
.第二,使用
*
正在返回重复的列(是的,我知道那个叫salary
另一个叫做Salary
-但你要加入那个专栏。它们的价值是一样的。无需返回该值两次。)第三,你似乎不明白
JOIN
建立其结果。您看到的“额外”行来自于您没有加入唯一数据的事实。有两排Salary
值为10000
在Salary
列。所以你的
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
.rbl8hiat4#
结果是正确的。left join返回左表中的所有记录,即使右表中没有匹配的记录(用null填充字段)。结果中的其余行来自重复的10000薪水。