2017-01-24 6 views
0

このWHERE節をアルゴリズム処理の点から等価条件を含めて理解できません。 (アルゴリズムのようにWHERE carrier= f.carrier節が段階的に実行されるプロセスを実際に描写することができないので、私は以下のSQL文法を得ることはできないと考えています)(結果セットテーブルとその処理方法順))ここで節の等価理解

ので
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つあれば、それは最適化です。それはたとえあなたが期待している結果を得たとしても、あなたが思うように実際には機能しないかもしれないことを意味します。

実際に何が実行されているかを確認する最も良い方法は、データベースがクエリを実行する実際の手順であるクエリプランを調べることです。ほとんどのデータベースは、これらを表示するためのツールを提供します。これは、クエリがあなたが思うように速く実行されていないときは、しばしば良い考えです。

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の距離値を同じキャリアの平均値と比較して、結果セットに保持するレコードを決定します。

関連する問題