Employee 表包含所有员工,他们的经理也属于员工。每个员工都有一个 Id,此外还有一列对应员工的经理的 Id。

  1. +----+-------+--------+-----------+
  2. | Id | Name | Salary | ManagerId |
  3. +----+-------+--------+-----------+
  4. | 1 | Joe | 70000 | 3 |
  5. | 2 | Henry | 80000 | 4 |
  6. | 3 | Sam | 60000 | NULL |
  7. | 4 | Max | 90000 | NULL |
  8. +----+-------+--------+-----------+

给定 Employee 表,编写一个 SQL 查询,该查询可以获取收入超过他们经理的员工的姓名。在上面的表格中,Joe 是唯一一个收入超过他的经理的员工。

+----------+
| Employee |
+----------+
| Joe      |
+----------+

解决思路:
员工的ManagerId对应着相应的经理,因为查询的是员工的信息,所有使用inner join来查询,员工的ManagerId对应着经理的ID,然后在比较工资大小。进行相应的查询,也可以使用From两个表 加上Where条件判断即可。
我的SQL

SELECT
    e. NAME AS Employee
FROM
    employee e
INNER JOIN employee e1 ON e.ManagerId = e1.id
AND e.Salary > e1.Salary

我看了一下别人的SQL 判断工资不放在on里面 放在Where语句中。虽然结果是通过了。但是还是要工资判断要放到Where子句中。这里感觉inner join on 后面加Where 和在on里面判断是一样的。但是Left join 就不一样了
其他SQL:

示例1:SELECT e1.Name as 'Employee'
FROM Employee e1, Employee e2
where e1.ManagerId = e2.Id and e1.Salary > e2.Salary;
示例2:SELECT e1.Name AS Employee
     FROM Employee e1 INNER JOIN  Employee e2 ON e1.ManagerId = e2.id
     WHERE e1.Salary > e2.Salary

具体详见博客:https://blog.csdn.net/jihuanliang/article/details/17362767

在使用left jion时,on和where条件的区别如下:

1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
总结:

  1. 对于left join,不管on后面跟什么条件,左表的数据全部查出来,因此要想过滤需把条件放到where后面

  2. 对于inner join,满足on后面的条件表的数据才能查出,可以起到过滤作用。也可以把条件放到where后面。