数据库LeetCode每日练习(二)

目录

前言

题目1: 从不订购的客户

题目2: 删除重复的电子邮件

题目3:上升的温度

题目4:第二高的薪水

本章刷题总结


前言

  • 前文精彩

数据库LeetCode每日练习(一)_小杰312的博客-CSDN博客sql操作LeetCode每日练习https://blog.csdn.net/weixin_53695360/article/details/123985354?spm=1001.2014.3001.5501

题目1: 从不订购的客户

183. 从不订购的客户

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5p2wMzEy,size_20,color_FFFFFF,t_70,g_se,x_16

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5p2wMzEy,size_12,color_FFFFFF,t_70,g_se,x_16

  • 题目要求:我们需要查询的是从来没有进行order过的客户
  • 入手思路:  直接进行筛选, 使用子查询的方式, 通过Orders表中的信息筛选cusomers表中id 没有出现在orders的customerid列中的记录;  
  • 抓住核心,关系:   附表 Oders 中 的  customerid 和 主表  customers 的  id 列对应

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5p2wMzEy,size_20,color_FFFFFF,t_70,g_se,x_16

# 解决方式1: 子查询方式

select 
    name as 'Customers'
from 
    customers 
where 
    id not in (select distinct customerid from orders);

# 解决方式2 : 外连接的方式
# 取出customers表的全部 和 orders表进行左外连接
# 连接条件利用 c.id = o.customerid. 不存在连接关系的记录o.id = null


select 
    c.name as 'Customers'
from 
    customers as c left join orders as o
    on c.id = o.customerid
where 
    o.id is null;
  • 外连接不理解的可以看我上一篇刷题中存在详细解释

数据库LeetCode每日练习(一)_小杰312的博客-CSDN博客sql操作LeetCode每日练习https://blog.csdn.net/weixin_53695360/article/details/123985354?spm=1001.2014.3001.5501

题目2: 删除重复的电子邮件

196. 删除重复的电子邮箱

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5p2wMzEy,size_20,color_FFFFFF,t_70,g_se,x_16

  •  题目要求: 删除所有重复出现的  email 记录,也就是按照 email 进行delete ,保留id 小的唯一电子邮件,所以删除的重复记录 id 是 后面的 
  • 思路:可以利用自连接的方式,自己这张表跟自己进行连接,然后比较,如果满足 p2.id > p1.id && p2.email = p1.email 我们就将这条记录删除.  (核心在于连接不仅仅可以用在select 竟然还可以用在  delete 等其他操作上)                       ---  如果需要同一张表的数据比较操作,请善用自连接操作
  • 注意 delete 是条件删除,按照后面的where 条件删除我们指定表中的条件指定记录, 我看LeetCode评论区会存在这样的疑问说,p1 和 p2 不是做了笛卡尔积嘛,咋删除的完, p1 是临时表啥的问题,    此处 p1 就是 person表本体, 我们仅仅只是利用了笛卡尔积来实现连接关系,从而在 p1表中不断地筛选出来满足 重复email 且 id 大 地记录删除掉 
# p1 和 p2 都是 person 表
delete 
    p1
from 
    person as p1, person as p2
where p1.id > p2.id && p1.email = p2.email;

题目3:上升的温度

197. 上升的温度

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5p2wMzEy,size_20,color_FFFFFF,t_70,g_se,x_16

  •  题目要求: 查找比前一天温度更高地所有日期id
  • 题目很简单,也很明显地使用自连接,因为还是本表数据比较,关键在于针对日期地差值应该如何做地问题上了, 如何表示  今天和昨天地日期关系?

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5p2wMzEy,size_20,color_FFFFFF,t_70,g_se,x_16

 我们利用 sql 提高地上述地datediff 函数即可

select 
    w1.id
from 
    weather w1 inner join weather w2
    on datediff(w1.recorddate, w2.recorddate) = 1
where
    w1.temperature > w2.temperature;

题目4:第二高的薪水

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5p2wMzEy,size_20,color_FFFFFF,t_70,g_se,x_16

  •  题目要求: 特别地简单,要求返回表中第二高的薪水
  • 思路:这种获取第几的薪水,我们第一反应肯定是进行一个sort 按照 desc 降序排序,去重排序, 接下来就利用Limit 分页查询 查询第二条记录不就是第二高薪水记录了噻.
  • 但是题目还存在一个要求是如果不存在第二高薪水放回 null 查询
  • 对于Null的处理我采取的是isfull函数

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP5p2wMzEy,size_20,color_FFFFFF,t_70,g_se,x_16

select ifnull(
    (select distinct 
        salary
    from 
        employee
    order by salary desc
    limit 1, 1
    ), null
) as 'SecondHighestSalary';

# 如果子查询select 结果不为Null则正常输出结果
# 否则输出null

本章刷题总结

  • 总结经验:  一般如果是需要通过同一张表的相互比较达到题目要求的,就一般是可以使用子连接查询或者处理。表的自连接, 就是表自己和自己连接在一起.
  • 两张表连接,不做任何条件限定就是笛卡尔积, 做出限定一般是通过逻辑外键进行限定. 外键存在附表中,    外键一般是主表中的主键
  • 在做题目的时候我们一定需要抓住主键列.   主键唯一标识记录,唯一存在且不为null.  有很多时候复杂的查询操作下,我们一般不是直接查询需求列,而是通过主键列进行条件限定查询操作
  • 各种内连接,外连接操作不仅仅只是适用在select 查询当中,在 delete update 中也一样可以使用 
  • 找最大最小,第几大第几小记录一定是通过  order by  + distinct + limit关键字入手  

  • 84
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 112
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 112
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小杰312

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

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

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

打赏作者

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

抵扣说明:

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

余额充值