2016-07-26 12 views
1

以下は、複数のインストラクタの給与を得るすべてのインストラクタの名前を選択するためのsqlクエリです(これは、最低の1人のインストラクタを残しています)。このクエリーは、KorthのSilberchatzによるDatabase System Conceptsからのものです。しかし、私はどのようにクエリが使用されているかを視覚化することはできません。これは、このようにするために必要なことです。以下のSQLクエリの説明

あなたは私が推測するテーブルを視覚化することができます。

select distinct T.name 
from instructor as T,instructor as S 
where T.salary > S.salary; 
+0

クロスジョインです。説明のために添付のリンクを参照してください。http://stackoverflow.com/questions/3538225/how-does-select-from-two-tables-separated-by-a-comma-work-select- from-t1-t2 –

答えて

2

そのクエリを書くことのもう一つの方法はこれです...一般CROSS JOIN秒で

SELECT DISTINCT 
    T.name 
FROM 
    instructor AS T 
CROSS JOIN 
    instructor AS S 
WHERE 
    T.salary > S.salary 

は悪い考えです。そして、ここで彼らは本当に悪い考えです。 100人のインストラクターがいる場合、4950の異なる組み合わせを評価して99人のインストラクターのユニークなリストを取得します。
- Instructor001が支払われる99人のインストラクターを持って少ない
- Instructor002が支払われる98人のインストラクターを少なく
ている - ...
- 総計4950個の組み合わせ

の場合 - Instructor100は少ない
を支払わされている00インストラクターを持っています1000人のインストラクターが499500の組み合わせを評価し、999人のインストラクターのユニークなリストを取得します。

良いアイデアはそう...

SELECT 
    i.Name 
FROM 
    instructor i 
WHERE 
    i.salary > (SELECT MIN(salary) FROM instructor) 

それとも...

SELECT 
    i.Name 
FROM 
    instructor i 
WHERE 
    i.Name <> (SELECT Name FROM instructor ORDER BY Salary ASC LIMIT 1) 

それとも...

SELECT 
    i.* 
FROM 
    instructor i 

EXCEPT 

SELECT 
    i.* 
FROM 
    instructor i 
ORDER BY 
    Salary ASC 
LIMIT 1 

だろう、あなたは正しい、そうではありません必要があります(または良いアイデア)そのようにそれを行うには。

+1

「MIN」ではありませんか? – Blank

+1

@JPG - うん、私のお父さんのアイルランド?それは私が考えることができる最善の言い訳です。 Ooops、ありがとう。 – MatBailie

0

少しこのクエリをリファクタリングしましょう。

SELECT DISTINCT T.name 
FROM instructor as T 
JOIN instructor as S ON T.salary > S.salary; 

これはまったく同じことですが、異なる構文で表現されています(効率的です)。これにより、より読みやすくなります。

今度は、Tテーブルは、照会するベーステーブルです。次に、Sエイリアスの下の同じテーブルに参加して、他の授業料が安い(T.salary > S.salary)インストラクターと一致するようにします。つまり、Sインストラクターが存在しない結果の行をTから除外します。あなたが少ない複数のSインストラクターが支払われているTインストラクターを重複して取得しないようにするために、SELECT句でDISTINCTキーワードを使用して終わりに

+0

それはまだ本当に悪い考えです。 'JOIN'を使用しても、依然としてデカルト積があります。 – MatBailie

+0

'salary'フィールドにインデックスがある場合は、そうしないでください。もちろん、同じ結果を達成する他の(より良い)方法がありますが、ここで最も重要なことは、クエリロジックを説明することです。それは単なる運動です。 –

+0

インデックスの場合でも、これはデカルト積である。 100人のインストラクターのリストを取ってください、インストラクターは99人の他の人に対して最も参加することを支払った。第2位は98人に、第2位は最高です。 100人目の最高人数が0人になるまで。合計で4950の組み合わせが得られます。そこであなたは 'DISTINCT'を適用します。 1000人のインストラクターが499500の組み合わせを提供します。そんなこと... – MatBailie