LeetCode习题总结-数据库(2)

第二十一天LeetCode刷题-数据库

第二十一天习题(1)—— 对表中指定重复元素的查找操作

此题仅为个人总结参考,如有错误还请指出

首先先上原题:

来源:力扣(LeetCode)
原题链接:https://leetcode-cn.com/problems/duplicate-emails/

看到此题,一般地。如果我们需要将表中的重复元素查询出来,通常我们可以对整个表先进行一次子查询操作,并利用count函数group by语句完成对表中每项元素的统计操作;以此结果生成一张子表。通过对这张辅助表查询次数大于1的数据项,即可完成对整张表重复元素的查询。具体的查询过程可参考下表中的方法。

方法1——使用子查询方式来实现对重复元素的查找

# Write your MySQL query statement below
select Email from
(
select Email, count(Email) as 计数 from Person group by Email
) as 计数表
where 计数 >1

该算法在执行器里面的消耗内存空间和时间开销如下图所示:
在这里插入图片描述

方法2——使用having来实现group by后的重复元素的查找

此外,除了利用子查询的方式来完成对重复元素的检索以外。我们还可以利用条件筛选的方式来实现对分组后的结果进行相应的排序操作。在使用筛选操作的时候,我们第一个通常想到的方法便是where的条件判断,但是在此如果使用 where count(Email) > 1 来实现对出现次数大于2的元素的进行筛选的话,数据库一定会提示这句存在相应的语法问题。这是由于在sql语法中规定,像SUM()、AVG()这样的聚合函数是不能接在where语句后面的。而基于此,我们可以通过利用having语句来实现对条件的筛选功能。因此,having则更像是对group by分组统计后的结果进行了进一步的筛选操作。因此,使用使用having来实现条件筛选的数据库查询操作具体如下:
LeetCode习题总结-数据库(2)_第1张图片

# Write your MySQL query statement below
select Email
from Person
group by Email
having count(Email)>1

该算法在执行器里面的消耗内存空间和时间开销如下图所示:
LeetCode习题总结-数据库(2)_第2张图片

第二十一天习题(2)—— 对表中元素值为空的元素查找操作

首先先上原题:

来源:力扣(LeetCode)
原题链接:https://leetcode-cn.com/problems/customers-who-never-order/

题目通过给定下图的这两张表,要求查询出对应订单表中没有购物记录的顾客信息。面对此类型的查询需求,我们一般的方法可以通过联结的子联结方式来实现。而从参考第一天的数据库习题的第一题讲解中(即实现对两表的合并来完成对个人信息的查询)来看。一般的联结方式有三种:即左连接右联结内联结。而如果需要利用子查询来完成相应的操作,我们则需要使用内联结的方式,将两表所共有的内容进行合并。这样合并后的列表必定是购买过商品的用户列表。然后我们再次通过子查询的方式,就可以查询出未购买商品的用户ID值了。该方法的具体查询过程如下所示:
LeetCode习题总结-数据库(2)_第3张图片

方法1——使用子查询方式来实现对表中元素值为空的元素查找

# Write your MySQL query statement below
select Name as Customers from customers 
where id not in 
    (select customers.id from customers 
    inner join orders 
    where customers.id = orders.customerid );

该算法在执行器里面的消耗内存空间和时间开销如下图所示:
LeetCode习题总结-数据库(2)_第4张图片

方法2——使用联结来实现对表中元素值为空的元素查找

除了利用子查询的方式来实现对元素值为空的元素查询。还有一种方法便是直接的利用内联结来实现对公共部分的合并操作,以此来实现对购买过产品用户的合并操作。然后直接运用on语句where语句的条件筛选功能来直接实现对指定元素的查找操作。该方法实现查询操作的具体流程如下:

# Write your MySQL query statement below
select a.Name as Customers
from Customers as a left join Orders as b on a.Id = b.CustomerId 
where b.CustomerId is null

该算法在执行器里面的消耗内存空间和时间开销如下图所示:
LeetCode习题总结-数据库(2)_第5张图片

第二十一天习题(3)—— 对表中重复的元素进行删除操作

首先先上原题:

来源:力扣(LeetCode)
原题链接:https://leetcode-cn.com/problems/delete-duplicate-emails/solution/dui-guan-fang-ti-jie-zhong-delete-he-de-jie-shi-by/

该题通过给定一个列表,要求查询出指定表中所重复的元素并对其完成删除操作。而在数据库中,常见的对数据的删除操作中,我们一般使用delete语句来完成对数据库中单条数据的删除操作,而不是使用drop语句来实现对表数据的删除操作,因为drop语句的语法功能是需要删除整个表的所有信息,而不是简单地对数据进行删除操作。而由于需要删除的是重复性质的元素,所以我们需要对每条元素完成相应的对比操作,通过对标表中的元素值来判断是否是所需要删除的重复元素。而针对比较操作,我们自然就可以利用联结操作当中的自联结操作来实现对表中重复重复元素的比对。我们在利用完自联结操作后,我们便可利用条件筛选的方式去筛选出表中重复的元素取进行相应的删除操作了。具体的操作流程可以参考下面的方法:
LeetCode习题总结-数据库(2)_第6张图片

方法——使用内联结方式来实现对表中元素值重复的元素进行删除操作

# Write your MySQL query statement below
delete p1 
from Person as p1 inner join Person as p2
where p1.email = p2.email and p1.Id > p2.Id

该算法在执行器里面的消耗内存空间和时间开销如下图所示:
LeetCode习题总结-数据库(2)_第7张图片

总结

通过对这三题进行总结,我们发现这三题主要还是针对于重复元素和特殊值元素(如空值)的查询和删除操作。而针对于此类特殊元素的基本操作,我们一般使用的便是利用三大联结操作和条件筛选操作来完成对表中重复元素或者特殊值元素的查询和删除操作。通过对联结操作完成对表中元素的合并,此后再通过条件筛选语句来依次完成对符合条件的元素的筛查工作。所以在面对此题的时候,我们更多可以的利用这两种方法的结合来完成相关的数据筛选工作。

你可能感兴趣的:(LeetCode习题总结-数据库(2))