2016-09-24 32 views
0

嗨,大家好,我只是写了2个查询这给了我同样的结果,我想问问你,如果它是重要的,我把它写:做它无论我怎样写我的SQL查询(如果正确)

1)

select First_Name, monthly_discount, pack_id, main_phone_num 
from customers 
where pack_id in(select p.pack_id 
from packages p JOIN sectors s 
on s.sector_id = p.sector_id where s.sector_name = 'business') 

2)

SELECT first_name , monthly_discount , pack_id , main_phone_num , 
        secondary_phone_num 
FROM customers 
WHERE pack_id IN 
      (SELECT pack_id 
       FROM packages 
       WHERE sector_id IN 
         ( SELECT sector_id 
          FROM sectors 
          WHERE sector_name = 'Business')) 
+0

哪'RDBMS'您使用。我可能会用'EXISTS/JOIN'组合 –

回答

2

它是重要的你怎么写呢?

是的。首先,仅仅因为两个查询在数据上返回相同的结果集并不意味着它们在逻辑上执行相同的操作。例如,select 2*2select 1 + 3返回相同的值,但它们没有执行相同的计算。 SQL查询也是如此。

在你的情况下,查询相同。对于任何一组数据,它们将返回相同的结果集。

其次,即使查询功能相同,数据库也可以以不同的方式实现版本。这通常采用不同底层算法的形式(您可能会惊讶于有多少种方法需要执行join)。这可能适用于您的情况,因为injoin通常有不同的算法。

第三点可能是最重要的。查询应该这样写人类可以读取它们,了解它们并维护它们。大多数人发现嵌套in是有点难以遵循(和嵌套not in s是相当难以理解凡人)。另一方面,join更通用,需要被理解为有效地使用SQL。

您的主要考虑因素应该是查询是否真的做到了您想要的。非常接近的一个是可读性,清晰度和可维护性。

+0

非常感谢你帮助我了解了很多有关sql的一点点更多 –

0

这两个查询都提供了相同的结果,但在 的情况下,您将遇到性能问题。 使用WHERE子句可将 与JOINS的执行时间相比较。在第一个查询中,您使用JOIN和WHERE子句 ,它将第二个查询的结果与fasetr相比较。使用 JOINS的每一个地方,而不是如在第一次查询条件下面提供了更多的获取你的数据比这两个查询更快 ,

SELECT C.First_Name, C.monthly_discount, C.pack_id, C.main_phone_num 
    FROM customers C 
    INNER JOIN packages P 
    ON P.pack_id = C.pack_id 
    INNER JOIN sectors S 
    ON S.sector_id = P.sector_id 
AND S.sector_name = 'business' 
+0

非常感谢你的解释 –

+0

这是*不*相当于问题中的两个查询。 (这可能会导致同一个客户不止一次被选中)并且“where子句中的条件”成本高昂的想法是完全废话,恕我直言。 – wildplasser

相关问题