2013-04-22 13 views
18

これら2つのクエリの違いは何ですか?MySql - HAVING vs WHERE

SELECT f.name, 
     u.name, 
     u.id 
FROM families f 
     JOIN units u 
     ON f.unit_id = u.id 
HAVING u.id IN(43, 413, 22) 

そして:

SELECT f.name, 
     u.name, 
     u.id 
FROM families f 
     JOIN units u 
     ON f.unit_id = u.id 
WHERE u.id IN(43, 413, 22) 

これら2つのクエリの結果はまったく同じです。違いはどこですか?

+0

アン、優れた重複はhttp://stackoverflow.com/questions/2905292/where-vs-having – thomasrutter

答えて

22

sqlのhavingとwhere句の違いは、where句を集約で使用することはできませんが、having句は使用できます。これを考える1つの方法は、having句はwhere句に対する追加のフィルタであるということです。優れている

:でも早くclick

+2

素晴らしい記事と解説。ありがとう。 –

+0

その記事は非常に役に立ちます。+1 – ocean800

+1

このリンクは機能していますか?私はアクセスしようとしていますが、無効なアドレスがあります。そのエラーが発生したかどうかを確認してください。 – vvtx

8

これらのクエリでは、何もありません。しかし、GROUP BYを使用する場合、違いが見えます。 GROUP BYを使用する場合はHAVINGがグループに適用され、WHEREはデータをグループ化する前にSELECTに適用されます。

+3

で発見することができますが、私がなりた例を与えることができますこのクエリの違いを見ることができますか? –

+0

できます。 'SELECT shapeType、count(shapeType)countShapeTypeからshapeTypeまでのシェイプグループからcountShapeType> 10 ' このクエリでは、シェイプタイプごとにグループ化されたすべてのシェイプを選択し、10種類以上のタイプのみを表示します。 count文にアクセスできないため、whereステートメントでこれを行うことができます。 –

31

WHEREは、処理されている元のテーブルのデータを選択するために使用されます。

HAVINGは、クエリによって生成された結果セットのデータをフィルタリングするために使用されます。つまり、SELECT句の集計値とエイリアスを参照できます。例えば

、書くことができる:diffはエイリアスではなく、元の表の列の1つであるため

SELECT t1.val - t2.val diff 
FROM t1 JOIN t2 ON (some expression) 
HAVING diff > 10 

これはWHEREを使用して動作しないであろう。結果セットを生成するために再び選択するため、および:

SELECT t1.val - t2.val diff 
FROM t1 JOIN t2 ON (some expression) 
WHERE t1.val - t2.val > 10 

をしかし、それは二回、すべての減算を行う必要があります:代わりに書くことができます。

+0

しかし、 'having'は' where'で動作する通常の非集約述語でも使用できます。例えば。 '' 1 = 1'と '1 = 1'を持つ。これはなぜ許可されていますか? – Pacerier

+0

'HAVING'は、結果セットの各行の式を単純に評価します。それが真であれば、結果に行が保持されます。それ以外の場合は、行が削除されます。どんな表現でも許されますが、唯一の違いはエイリアスが利用できるスコープ内にあることです。 – Barmar

+0

私が意味するところは、非集約比較を「有する」に入れるのは意味がありませんか?彼らはどこに置かれてはいけませんか? – Pacerier