Leetcode-Mysql题目及知识点总结(196.删除重复的电子邮箱)

计算机小白QAQ,因为想找数分岗暑期实习所以充了会员想集中刷一下leetcode的mysql部分。写这个系列博文和大家们交流一下,后面也会持续更新面经准备的一些问题,欢迎同好们一起交流,求大佬轻喷QAQ。因为自己初学也走了很多弯路,所以会尽量写得详细一点,如果可以帮助到后来的朋友们,请各位留言鼓励一下哈哈哈哈。

196、删除重复的电子邮箱

思路:无论这个电子邮箱名称是否重复均返回该邮箱分组id的最小值

代码:

delete from Person

where (Id,Email) not in(select * from(select min(Id),Email from Person group by Email)ts)

知识点1:sql中删除命令格式:DELETE FROM 表名称 WHERE 列名称 = 值

知识点2:聚合函数min()和max()的易错点,其实该问题没有涉及,只是想到了先提一下,min和max返回的是这一列的最大值和最小值,也就是说其余各列不会因为这一列返回最大最小值而一起变动,group by之下默认返回这一组的第一行。

知识点3:利用两列作为组合一起查找(列1,列2)的形式

知识点4:子查询结果作为表读取时需要重命名,格式:(子查询内容)表名 。

错误点:我一开始写成了这个样子

delete from Person

where (Id,Email) not in(select min(Id),Email from Person group by Email)

然后报错了(玩脱了吧叫你装13)

You can't specify target table 'Person' for delete in FROM clause

看了其他朋友的博客才明白是因为我子查询select和delete的是同一个表,两个命令没法进行,所以我们要先把子查询中得到的表再select出来一遍。这个问题只在mysql中存在Mssql和oracle是不存在的。

猜你喜欢

转载自blog.csdn.net/weixin_43167461/article/details/113177876