力扣数据库题库学习(4.22日)

本文介绍了五个SQL查询问题,涉及左连接查找奖金少于1000的员工、筛选未被特定用户推荐的客户、找出下单最多的客户、识别学生课程人数超过5人的班级以及排除与特定公司无关的销售员。重点展示了LEFTJOIN、WHERE、GROUPBY、ORDERBY、LIMIT和HAVING子句的应用。
摘要由CSDN通过智能技术生成

577. 员工奖金

问题链接
问题图片

思路分析

Employee表与Bonus表通过empId字段可以连接,需求是查出奖金少于1000的员工名和奖金值。
这里奖金少于1000的情况就是没有奖金+有奖金但少于1000

这里我给出的解决方案就是使用左连接,将Employee表作为左表,连接Bonus表,对于没有bonus字段的情况,两个表连接之后生成的临时表就会用null填充。然后使用筛选条件,bonus为null或bonus小于1000。

成功提交的sql语句如下:

使用左连接+筛选条件

SELECT e.name,b.bonus FROM Employee e
LEFT JOIN Bonus b ON e.empId=b.empId
WHERE b.bonus<1000 OR b.bonus IS NULL
;

运行成功,结果如下

在这里插入图片描述

584. 寻找用户推荐人


问题链接

问题图片

思路分析

需求: 没有被 id = 2 的客户 推荐 的客户的姓名
那么这个筛选条件= referee_id不为2【referee_id!=2 or referee_id is null】
这个非常简单,直接使用where语句即可
已经成功提交的sql语句如下:

where筛选数据

SELECT name FROM Customer WHERE referee_id!=2 OR referee_id IS NULL;

586. 订单最多的客户

问题链接
问题图片

思路分析

我们来看题目的要求:找到下单最多的客户,看示例可以知道,我们最后的结果是获取到下单最多客户的customer_number字段。
这里的关键点就是如何获取到每个顾客下单的数量。这个方法在sql内解决方案就是按照customer_number分组,然后计算每个分组的记录数,即为单个顾客的订单量,最后将数据倒排,取出第一个数据就可以了。
下面我们来实现,代码如下

GROUP BY分组 ORDER BY 排序 LIMIT 1

SELECT customer_number FROM Orders
GROUP BY customer_number
ORDER BY COUNT(*) DESC
LIMIT 1;

596. 超过5名学生的课

问题链接
问题描述

思路分析

要求找到班级的名称,且班级的学生数>=5
我们来看这个学生表,是由每一个学生作为记录的,每一个学生对应一个班级。解决这个问题的关键就是统计出来每个班级的学生数,也就是说,将表内数据按照班级分组,统计出不同组内学生的数量【等于组内记录数】。
这么一说,其实方案就很简单了,先根据班级分组,然后统计分组记录,最后筛选出记录数>=5的班级名称即可。
看我的代码

HAVING对分组过滤

SELECT class FROM Courses
GROUP BY class
HAVING COUNT(*)>=5;

添加点知识,关于where与having的区别
HAVING 子句用于在对结果集进行分组后进行过滤,类似于 WHERE 子句对原始数据进行过滤

  1. WHERE 子句在分组之前过滤数据,而 HAVING 子句在分组之后过滤数据。
  2. WHERE 子句对行进行过滤,而 HAVING 子句对分组进行过滤。

607. 销售员

问题链接
问题图片

思路分析

找出没有任何与名为 “RED” 的公司相关的订单的所有销售人员的姓名
分析一下需求,没有任何与red公司相关的销售人员名单。这个我们一张一张表来看关联性:
SalesPerson表内没有什么与red公司直接关联的数据,Company表内有RED相关的数据,即com_id为1的这条记录; Orders表内也有相关的数据,com_id为1的都是相关的数据。
我的思路很简单,
代码很简单,如下:

-- 找到com_id为1的sales_id ==>这个提交有问题,必须使用Company 表name 过滤,而不是直接使用com_id过滤
-- 查询SalesPerson并根据sales_id过滤
SELECT name FROM SalesPerson WHERE sales_id NOT IN
(SELECT sales_id FROM Orders INNER JOIN Company ON Orders.com_id = Company.com_id WHERE name="RED");

总结

今天这5道题目主要考这几个知识点

  1. LEFT JOIN 左连接
  2. where筛选数据
  3. GROUP BY分组
  4. ORDER BY 排序
  5. LIMIT 1排序限制
  6. HAVING 子句
  7. 子查询
  • 23
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jesse_Kyrie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值