🎈写在前面
🙋♂️大家好呀,我是超梦。小伙伴们都知道,不管是在学习中还是日常工作中,几乎天天是要跟数据库打交道的,为了更好的操作数据库,我们的SQL知识储备是必不可少的。想要掌握好SQL,那少不了每天的练习与学习。接下来小梦会带领小伙伴们一起每天刷一道LeetCode-数据库(SQL)相关的题目,然后在文章后例举相关知识点帮助小伙伴们学习与巩固,更好的掌握SQL。
🙋♂️ 小伙伴们如果在学习过程中有不明白的地方,欢迎评论区留言提问,小梦定知无不言,言无不尽。
目录
🍕题目概述
🍕解题思路
🍟方法一
🍟方法二
🍕代码实现
🍟方法一
🍟方法二
🍕知识点小结
🍕题目概述
Employee
表+----+-------+--------+-----------+ | Id | Name | Salary | ManagerId | +----+-------+--------+-----------+ | 1 | Joe | 70000 | 3 | | 2 | Henry | 80000 | 4 | | 3 | Sam | 60000 | NULL | | 4 | Max | 90000 | NULL | +----+-------+--------+-----------+
题目:
Employee
表包含所有员工,他们的经理也属于员工。每个员工都有一个 Id,此外还有一列对应员工的经理的 Id。给定Employee
表,编写一个 SQL 查询,该查询可以获取收入超过他们经理的员工的姓名。在上面的表格中,Joe 是唯一一个收入超过他的经理的员工。查询出的结果如下所示。+----------+ | Employee | +----------+ | Joe | +----------+
👇LeetCode原题地址~
🍕解题思路
首先根据题意,Employee表包含所有员工,他们的经理也属于员工。每个员工都有一个 Id,此外还有一列对应员工的经理的 Id。那我们看到字段ManagerId就是对应员工的经理Id,由Employee表得知joe对应的经理Id是3,Henry对应的经理Id是4。经理也属于员工,id3对应的是Sam,Id4对应的是Max,也就是说joe对应的经理是Sam,Henry对应的经理是Max。
因为表既有员工信息又有经理信息,所以我们需要获取两次信息,我们可以把Employee既看成员工表又看成经理表。题目要求我们查找出员工工资大于经理的,那我们可以通过id字段与ManagerId字段做连接,加一个员工Salary大于经理Salary条件即可。具体方法如下。
🍟方法一
表中存在员工与经理两种信息,我们需要获取两次信息,然后使用Where语句做条件筛查,找出员工工资大于经理的数据。
题解1:
SELECT staff.Name AS 'Employee' FROMEmployee AS staff,Employee AS manager WHEREstaff.ManagerId = manager.Id AND staff.Salary > manager.Salary
🍟方法二
表中存在员工与经理两种信息,我们需要获取两次信息,除了使用where语句外,我们还可以使用内连接,通过on语句做条件筛查来找出员工工资大于经理的数据。
题解2:
SELECT staff.NAME AS 'Employee' FROM Employee AS staff JOIN Employee AS manager ON staff .ManagerId = manager.Id AND staff .Salary > manager.Salary
🍕代码实现
🍟方法一
SELECT staff.Name AS 'Employee' FROMEmployee AS staff,Employee AS manager WHEREstaff.ManagerId = manager.Id AND staff.Salary > manager.Salary
与预测结果一致,成功!
🍟方法二
SELECT staff.NAME AS 'Employee' FROM Employee AS staff JOIN Employee AS manager ON staff .ManagerId = manager.Id AND staff .Salary > manager.Salary
与预测结果一致,成功!
🍕知识点小结
内连接与外连接
小梦用极简单的方式带小伙伴们过一遍内连接与外连接。
表1 classa
表2 classb
1. 内连接 inner join (join 默认就是内连接)
表1与表2的交集,用上面两个表演示一下
select classa.id as aid,classb.id as bid from classa inner join classb on classa.id = classb.id;
查询的结果是classa与classb的交集
2. 左外连接 left join
结果集保留左表的所有行,但右表只包含与左表匹配的行。右表相应的空行为NULL值。
select classa.id as aid,classb.id as bid from classa left join classb on classa.id = classb.id;
3. 右外连接 right join
结果集保留右表的所有行,但左表只包含与右表匹配的行。左表相应的空行为NULL值。
select classa.id as aid,classb.id as bid from classa right join classb on classa.id = classb.id;
4. 全外连接 full join
会把两个表所有的行都显示在结果表中。
select classa.id as aid,classb.id as bid from classa full join classb on classa.id = classb.id;
小伙伴们注意啦!!!
MySQL不支持full join!!!MySQL不支持full join!!!MySQL不支持full join!!!
重要的事情要说三遍!!!那怎么实现和full join一样的效果呢?那就要通过使用union来实现,具体实现SQL语句如下
select classa.id as aid,classb.id as bid from classa left join classb on classa.id = classb.id union select classa.id as aid,classb.id as bid from classa right join classb on classa.id = classb.id;
😀感谢小伙伴们支持,如果有什么疑问,欢迎留言询问,小梦定知无不言,言无不尽!