1

BarsandBeersデータベースからの次の関係を検討してください。

販売(バー、ビール、価格):各バーで販売された各ビールの価格を示します(各バーは多くのビールを販売でき、多くのバーは同じビールを異なる価格で販売できることに注意してください)。

次のクエリは、任意のバーで見つけることができる最低価格のビールの名前を見つけます。

SELECT s.beer
FROM sells s
WHERE NOT EXISTS (SELECT si.beer
FROM sells si
WHERE si.price <= s.price) 

こんにちは、私はSQLをゆっくりと学んでおり、「si.price<=s.price」の部分を理解するのに苦労しています。ネストされたselectは基本的に同じ2つのテーブルを比較しているため、クエリ全体が常に空のテーブルを返すのではないでしょうか。

4

4 に答える 4

3

そのクエリにはバグがあります。価格がそれ自体と等しくないため、行が返されることはありません。

動作するには、次のようになります。

...
WHERE si.price < s.price) 


変更が行われたと仮定すると、内部クエリはテーブル内のすべての行に対して1回実行され、外部テーブルに依存します(「相互関連サブクエリ」と呼ばれます)。同じテーブルが内部クエリで使用されるため、外部テーブルのエイリアスを作成する必要があります(この場合は「s」として)。内部クエリは、実行されている行の価格よりも低い(他の)価格はないと主張します。

ちなみに、内部クエリのエイリアスは不要です。内部クエリがデフォルトのスコープであるため、「s1」を削除しても機能します。

SELECT beer
FROM sells s
WHERE NOT EXISTS (
    SELECT *
    FROM sells  -- no alias needed
    WHERE price <= s.price)

さらに、これは相互に関連するサブクエリのために「悪い」クエリであり、「n」個のクエリが実行されます(行ごとに1つ)。min()集計関数を使用することをお勧めします。

SELECT beer
FROM sells
WHERE price = (SELECT min(price) FROM sells)

このクエリはよりシンプルで理解しやすい(2つの良い点)ことを除けば、実行されるクエリは2つだけなので(1つは最小価格を見つけるためのサブクエリ、もう1つはそれを含む行全体を取得するため)実行速度が速くなります。


最後に、最後の(マイナーではありますが)バグは、同じ価格の低価格のビールが複数ある場合、これらすべてが複数の行を返すことです。最低価格のビールを返品するには、行数を1に制限し、ネクタイを解除する方法を決定する必要があります(おそらく名前で)。実際、1行だけを返すと、さらに単純なクエリが可能になります。

select beer
FROM sells
ORDER BY price
LIMIT 1

また、一貫して同点を破る必要がある場合(つまり、同じ最低価格のランダムな同じ価格のビールを返さない場合)、名前で注文します。

select beer
FROM sells
ORDER BY price, beer
LIMIT 1
于 2013-02-05T19:48:30.127 に答える
1
SELECT s.beer, s.price
FROM sells s
GROUP BY s.beer
HAVING s.price = MIN(s.price)

フィドル:http ://sqlfiddle.com/#!2 / f292c / 1

これは標準ではないことに注意してください。Mysqlでは、選択した列でグループ化しないことができます。

于 2013-02-05T19:48:49.737 に答える
1

ネストされたクエリは、同じ2つのテーブルを比較しています。ただし、実際には、テーブルから1つの行を取得し、それをテーブル内の他のすべての行と比較して、次の行に移動するようなものです。これは概念的な説明です。実際の実装はかなり異なる場合があります。

ただし、記述されているクエリは、。のために何も返しません<=。これはである必要があります<

ただし、このクエリを作成するためのはるかに簡単な方法があります。

select *
from sells
order by price
limit 1

SQLの学習に頑張ってください。

于 2013-02-05T19:48:52.673 に答える
0

価格を昇順で注文し、結果セットを1つのアイテムに制限するだけです。

SELECT bar, beer, price FROM sells ORDER BY price ASC LIMIT 1
于 2013-02-05T19:53:46.160 に答える