2017-01-24 49 views
0

從算法過程來看,包含平等條件的這個WHERE子句有困難。 (我想我無法得到下面的SQL語法,因爲我無法真正描繪WHERE carrier= f.carrier子句按照算法一步一步運行的過程(就像我看到結果集表以及它如何在順序))where子句平等理解

SELECT id 
FROM flights AS f 
WHERE distance < (SELECT AVG(distance) 
        FROM flights 
        WHERE carrier = f.carrier); 

所以,按照我的理解,運行carrier=f.carrier的過程是這樣:

  1. 因爲它是一個相關子查詢,計算機從外部子開始,這意味着它只需第一行在一個航班表中,然後進入內部子查詢。
  2. 在內部子查詢中,它會嘗試查找外部子查詢的第一行數據的相同載體,並查找該特定載體距離的平均值。它將平均值與外部子查詢的第一行記錄進行比較並返回結果。它會這樣做直到它完成整個表。

我對序列過程的理解是否正確?非常感謝您的閱讀!

+0

你的解釋對我來說是正確的。你還有其他問題要問嗎? –

+0

你的解釋是正確的。對於您運行「EXPLAIN PLAN」或查看查詢計劃(取決於您的RDBMS,術語,確切的語法和輸出會有所不同)來查看數據庫如何解釋和處理查詢可能會有所幫助。 – alroc

+0

'EXPLAIN'永遠有用。只需在'EXPLAIN'前加上你的查詢,你就可以看到查詢計劃,它將向你展示如何搜索每個表以及使用哪些索引。這非常方便。 – Matt

回答

0

你的解釋是正確的。但是,如果您使用多個表格編寫查詢,則應該習慣於符合所有列名稱的習慣。這對於相關子查詢尤其重要,其中錯誤可能非常微妙:

SELECT f.id 
FROM flights f 
WHERE f.distance < (SELECT AVG(f2.distance) 
        FROM flights f2 
        WHERE f2.carrier = f.carrier 
        ); 
0

您的解釋是正確的。這基本上是至關重要的,至少在概念上是這樣。如果數據庫擅長的是一件事,那就是優化。這意味着即使您獲得了您期望的結果,它也可能無法按照您的想法進行工作。

查看實際執行的最好方法是查看查詢計劃,這是數據庫爲運行查詢所採取的實際步驟。大多數數據庫提供查看這些工具當您的查詢運行速度不如您認爲的那樣快時,這通常是一個好主意。

1

你的解釋是正確的。只是爲了教育目的,在這裏你可以如何使用做同樣的查詢中使用聯接:

SELECT t1.id 
FROM flights t1 
INNER JOIN 
(
    SELECT carrier, AVG(distanct) AS average_distance 
    FROM flights 
    GROUP BY carrier 
) t2 
    ON t1.carrier = t2.carrier 
WHERE t1.distance < t2.average_distance 

非相關子查詢查找每個carrier的平均距離,然後將這些值連接回原來的flights表。 WHERE子句將flights的距離值與同一運營商的平均值進行比較,以確定要在結果集中保留哪些記錄。