复习时遇到的一个难点,理解了之后还是觉得做题太慢,所以自己想了一个觉得还比较高效的理解来做题。
首先,要用复杂查询来做的题都可以转换成包含两个否定的说法。
eg1:查询订购了所有产品的顾客的cid值
转换后:不存在一个产品用户没有订购。
eg2:查询被所有居住在New York的顾客订购的产品pid
转换后:不存在居住在New York的某位顾客没有订购的产品。
以eg1为例我们又可以把这两个否定给去掉,变成:存在一个产品用户订购了。
变成这个说法之后就很好用除法来做了
假设有一个orders表
用orders表去除orders表的pid列
显然如果一个用户买了至少某一种产品,那么做了除法之后,我们就可以找到这个用户。
理解这个主要是为了更快的套公式!
select…
where not exists
(select…where not exists(select…))
套公式的方法就是将上面推出来做除法的两个表分别套入第三个select和第二个select
而第一个select不用考虑除法,直接是题目要求查什么就直接写。
eg2去掉两个否定得到 居住在New York的某位顾客订购的某产品。
所以要带入的表就是 orders表 和 满足city=’New York’的customer表的cid列