そのクエリにはバグがあります。価格がそれ自体と等しくないため、行が返されることはありません。
動作するには、次のようになります。
...
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