web-dev-qa-db-ja.com

HAVING句の後にWHERE句を含めることは可能ですか?

HAVING句の後にWHERE句を使用することはできますか?

最初に頭に浮かぶのはサブクエリですが、よくわかりません。

P.S.答えが肯定的である場合、いくつかの例を挙げていただけますか?

16
cc.

いいえ、同じクエリではありません。

where句は、havinggroup byの前にあります。グループ化する前にレコードを除外する場合は、条件がwhere句になり、グループ化されたレコードを除外する場合は、条件がhaving句になります。

select ...
from ...
where ...
group by ...
having ...

なんらかの奇妙な理由でこれらのどちらも使用できない場合は、クエリをサブクエリにして、外部クエリにwhere句を配置できるようにする必要があります。

select ...
from (
   select ...
   from ...
   where ...
   group by ...
   having ...
) x
where ...
29
Guffa

HAVING句は、GROUPBYの後の単なるWHERE句です。 WHERE条件をHAVING句に入れてみませんか?

5
Nestor

それがトリックの質問である場合、WHEREとHAVINGが、前述のように、サブクエリで同じレベルにない可能性があります。

私はそのようなものがうまくいくと思います

HAVING value =(SELECT max(value)FROM foo WHERE crit = 123)

p.s。:なぜあなたは尋ねたのですか?特定の問題がありますか?

p.s.s:わかりました、ばかげています、「インタビュー*」タグを見逃しました...

5
pascal

SELECTヘルプから

WHERE、GROUP BY、およびHAVING句の処理順序次の手順は、WHERE句、GROUP BY句、およびHAVING句を含むSELECTステートメントの処理順序を示しています。

FROM句は初期結果セットを返します。

WHERE句は、検索条件を満たさない行を除外します。

GROUP BY句は、GROUP BY句の一意の値ごとに、選択した行を1つのグループに収集します。

選択リストで指定された集計関数は、各グループの要約値を計算します。

HAVING句は、検索条件を満たさない行をさらに除外します。

だから、あなたはできません。

2
Adriaan Stander

同じ範囲内で、答えはノーです。サブクエリが許可されている場合は、HAVINGの使用を完全に回避できます。

HAVINGは時代錯誤だと思います。 Hugh Darwenは、HAVINGを「構造化クエリの愚かさ」と呼んでいます。

古いSQLでは、集計結果にWHERE句を使用できなかったため、HAVINGWHEREと同じ意味)を発明する必要がありました。

SELECT D#, AVG(Salary) AS Avg_Sal
  FROM Emp
 GROUP 
    BY D#
HAVING AVG(Salary) > 999;

しかし、1979年に次のように書くことができれば、HAVINGがあったと思います。

SELECT * 
  FROM (
        SELECT D#, AVG(Sal) AS Avg_Sal
          FROM Emp
         GROUP 
            BY D# 
       )
      AS dummy
WHERE Avg_Sal > 999;

ダーウェンの質問に対する答えはノーだと強く思う。

1
onedaywhen