Employee 表包含所有员工,他们的经理也属于员工。每个员工都有一个 Id,此外还有一列对应员工的经理的 Id。
+----+-------+--------+-----------+| Id | Name | Salary | ManagerId |+----+-------+--------+-----------+| 1 | Joe | 70000 | 3 || 2 | Henry | 80000 | 4 || 3 | Sam | 60000 | NULL || 4 | Max | 90000 | NULL |+----+-------+--------+-----------+
给定 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的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
总结:
对于left join,不管on后面跟什么条件,左表的数据全部查出来,因此要想过滤需把条件放到where后面
对于inner join,满足on后面的条件表的数据才能查出,可以起到过滤作用。也可以把条件放到where后面。
