左连接或内连接

Posted

技术标签:

【中文标题】左连接或内连接【英文标题】:Left join or inner join 【发布时间】:2019-07-12 02:15:15 【问题描述】:

我有一个表,Table_employee 有员工 ID、薪水、经理(每个员工各自经理的 ID)和另一个表 Table_manager 包含每个经理的名字、姓氏和每个经理的 ID。

我试图创建另一个表格,显示经理的名字、姓氏和每位经理负责的员工人数以及这些员工的总薪水。

我无法显示经理的名字和姓氏。

我的代码如下。任何帮助将不胜感激。

非常感谢!

select 
   e.manager, 
   COUNT(e.employee_id), 
   SUM(e.salary) 
FROM 
   Table_employee e 
   Right outer join Table_manager m ON e.manager=m.employee_id 
GROUP BY 
   manager 
ORDER BY 
   manager

【问题讨论】:

【参考方案1】:

使用LEFT JOIN 和聚合。如果您正在学习 SQL,请忘记RIGHT JOIN。几乎从不需要它。并且LEFT JOIN 更容易理解(“将所有内容保留在 first 表中”与“将所有内容保留在 last 表中,无论它可能是什么”)。

所以:

select m.employee_id, m.firstname, m.lastname, 
       count(e.employee_id), sum(e.salary)
from Table_manager m left join
     Table_employee e
     ON e.manager = m.employee_id
group by m.employee_id, m.firstname, m.lastname
order by m.employee_id;

【讨论】:

【参考方案2】:

我认为您只需要将名字和姓氏添加到分组依据?我错过了一些复杂性吗?

select e.manager, m.firstname, m.lastname, COUNT(e.employee_id), SUM(e.salary)
FROM Table_employee e
Right outer join Table_manager m ON e.manager=m.employee_id\
GROUP BY manager, m.firstname, m.lastname
ORDER BY manager

但是,交换顺序让经理在左边,员工在右边更有意义,这样您就不会错过没有员工的经理:

select e.manager, m.firstname, m.lastname, COUNT(e.employee_id), SUM(e.salary)
FROM Table_manager m
Right outer join Table_employee e ON e.manager=m.employee_id
GROUP BY manager, m.firstname, m.lastname
ORDER BY manager

【讨论】:

以上是关于左连接或内连接的主要内容,如果未能解决你的问题,请参考以下文章

SQL中的左连接与右连接,内连接有啥区别

MySQL连接查询之内连接左连接右连接自连接

sql左连接 右连接 内连接 外连接都是啥

如果查询中包含内连接,为啥左连接会变成内连接?

Linq 和 SQL的左连接右连接内链接

左连接 ,右连接,内连接和全外连接的4者区别