SQLのWHERE句とHAVING句の違いをわかりやすく解説
SQLにおいて、データを絞り込む際に使われるWHERE句とHAVING句。どちらも条件を指定してレコードをフィルタリングするための句ですが、役割や使い方には明確な違いがあります。本記事では、それぞれの特徴を整理し、両者の違いをわかりやすく解説します。
WHERE句とは
WHERE句は、テーブルから特定の条件に一致する行(レコード)を抽出するために使用されます。
WHERE句の主な特徴
テーブルから特定の条件に基づいてレコードをフィルタリングします。
GROUP BY句がなくても単独で使用できます。行に対する操作(単一行関数)と組み合わせて使えます。
SUMやCOUNTなどの集計関数を含めることはできません。SELECT文だけでなく、UPDATE文やDELETE文でも使用可能です。GROUP BY句と併用する場合は、必ずGROUP BY句より前に記述します。UPPERやLOWERなどの単一行関数と組み合わせて使えます。
HAVING句とは
HAVING句は、GROUP BY句によってグループ化された結果に対して条件を指定し、グループ単位でレコードを絞り込むために使用されます。
HAVING句の主な特徴
グループ化された結果から、特定の条件に基づいてレコードを抽出します。
GROUP BY句なしでは使用できません。列(カラム)に対する操作と組み合わせて機能します。
集計関数を含めることができます。
使用できるのは
SELECT文のみです。必ずGROUP BY句の後に記述します。
SUMやCOUNTなどの複数行関数(集計関数)と組み合わせて使えます。
WHERE句とHAVING句の違いまとめ
| 比較項目 | WHERE句 | HAVING句 |
|---|---|---|
| フィルタ対象 | 個々の行(レコード) | グループ化された結果 |
| GROUP BY句なしでの使用 | 可能 | 不可 |
| 集計関数の使用 | 不可 | 可能 |
| 使用できるステートメント | SELECT / UPDATE / DELETE | SELECTのみ |
| 記述位置 | GROUP BY句の前 | GROUP BY句の後 |
基本構文
WHERE句とHAVING句を組み合わせた一般的なSQL構文は以下の通りです。
SELECT column1, column2
FROM table1, table2
WHERE [ conditions ]
GROUP BY column1, column2
HAVING [ conditions ]
ORDER BY column1, column2;
まとめ
WHERE句は行レベルのフィルタリング、HAVING句はグループレベルのフィルタリングを行うというのが最大の違いです。実務では「集計前の絞り込みはWHERE句、集計後の絞り込みはHAVING句」と覚えておくと理解しやすくなります。両者を正しく使い分けることで、効率的かつ可読性の高いSQLクエリを書くことができます。
-
SQLの内部結合(INNER JOIN)と外部結合(OUTER JOIN)の違いを徹底解説
SQLで複数のテーブルを扱う際に欠かせないのが「結合(JOIN)」です。結合には大きく分けて内部結合(INNER JOIN)と外部結合(OUTER JOIN)の2種類があり、それぞれ動作や用途が異なります。本記事では、両者の違いや構文、使い分けのポイントをわかりやすく解説します。 内部結合(INNER JOIN)とは 使用する句は「INNER JOIN」および「JOIN」です。 2つ以上のテーブルを結合し、結合条件に一致するタプル(行)のみを返します。 共通の属性(カラム)が存在しない場合、結果は空になります。 タプル数が多い場合、INNER JOINはOUTER JOINと比較して高速に
-
JavaにおけるIteratorとSpliteratorの違いを徹底解説
Javaでは、コレクションの要素を反復処理するためのインターフェースとして、IteratorとSpliteratorの2つが提供されています。どちらもコレクションを走査する目的で使用されますが、設計思想や得意分野には明確な違いがあります。 Iteratorとは Iteratorは、コレクション内の要素を1つずつ順番に取り出すための標準的なインターフェースです。hasNext()で次の要素の有無を確認し、next()で要素を取得するという流れで、呼び出し側が反復を制御する「外部イテレーション」方式を採用しています。処理は逐次的(シーケンシャル)にのみ行われます。 Spliteratorとは