2016-09-24 27 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

相關問題