【SQL文法基礎3】さまざまな条件でデータを取得する 〜 WHERE / HAVING 〜
データ分析では、すべてのデータを取得するだけでなく、さまざまな条件をつけてデータを取得することがあります。 本章では、特定の日付の購入件数を取得したり、特定のカテゴリに該当する商品情報のみのデータを取得するなど、条件をつけてデータを取得する方法について学んでいきましょう。
特定の条件をつけてデータを取得する
WHEREを使った条件指定
データ分析では大量のデータから自分のほしいデータを取得することが重要です。例えばECサイトの担当者として、日々の購入データを確認する場合は特定の日付のデータを取得する必要があります。このように、大量のデータから特定の条件に一致するデータだけを取得したい場合は、WHEREを使って条件指定します。
まずはSQL5-1、SQL5-2を実行して、WHEREの基本的な使い方について確認しましょう。SQL5-1は、SELECTを使って購入履歴テーブル(orders)から購入ID(order_id)と購入日(order_date)を取得しています。また、LIMITを使うことで、出力結果を10件だけ取得しています。
一方で、SQL5-2はFROMのあとにWHEREが追加されています。日付の条件を指定する場合はDATE型のorder_dateを使用します。DATE型を条件で指定する場合も、シングルクォーテーション(')を使って条件を指定します。つまり、WHERE order_date = '2023-01-01'と条件を指定することで、2023年1月1日に購入があった購入履歴のデータのみを取得できます。このように、特定の条件を指定してデータを取得するときに使うのがWHEREです。
★ハンズオン〜SQLを実行してみよう〜
・SQL5-1
SELECT
order_id,
order_date
FROM
orders
LIMIT 10・表5-1:SQL5-1の実行結果
order_id | order_date |
|---|---|
C000001 | 2023-03-13 |
C000002 | 2025-12-05 |
C000002 | 2025-12-05 |
C000003 | 2023-11-27 |
C000004 | 2025-08-03 |
C000005 | 2025-01-18 |
C000005 | 2025-01-18 |
C000006 | 2023-04-08 |
C000006 | 2023-04-08 |
C000007 | 2024-09-15 |
・SQL5-2
SELECT
order_id,
order_date
FROM
orders
WHERE
order_date = '2023-01-01'
LIMIT 10・表5-2:SQL5-2の実行結果
order_id | order_date |
|---|---|
C000127 | 2023-01-01 |
C002953 | 2023-01-01 |
C003223 | 2023-01-01 |
C003223 | 2023-01-01 |
C003223 | 2023-01-01 |
C006081 | 2023-01-01 |
C009924 | 2023-01-01 |
C010784 | 2023-01-01 |
C010920 | 2023-01-01 |
C011611 | 2023-01-01 |
・・・ | ・・・ |
条件指定で使える演算子
SQL5-2では、WHEREで条件指定するとき、イコール(=)という演算子を使っています。これは指定した値と等しいデータを取得する条件です。イコール(=)以外にも、WHEREで使える演算子はいくつかあります。次の表は、WHEREの条件指定でよく使われる演算子とその意味です。WHEREの演算子について、いくつか具体例をみながら確認しましょう。
演算子 | 意味 |
|---|---|
= | 等しい |
> | 大きい |
< | 小さい |
>= | 以上 |
<= | 以下 |
<> | 等しくない |
AND | 2つ以上の条件を結合して、両方の条件に一致する |
OR | 2つ以上の条件を結合して、いずれかの条件に一致する |
NOT | 条件の反対 |
BETWEEN A AND B | AとBの間に該当する |
IN | 一覧のいずれかに一致する |
LIKE | 文字列のパターンにマッチする |
IS NULL | 空(NULL)である |
IS NOT NULL | 空(NULL)でない |
特定の値以下のデータを取得(<=)
<=の演算子は指定した値以下のデータを取得する条件です。SQL5-3は2023年1月5日以前の日付のデータを取得しています。=がついているため、2023年1月5日のデータも含まれる点に注意しましょう。
★ハンズオン〜SQLを実行してみよう〜
・SQL5-3
SELECT
order_id,
order_date
FROM
orders
WHERE
order_date <= '2023-01-05'
LIMIT 10・表5-3:SQL5-3の実行結果
order_id | order_date |
|---|---|
C000127 | 2023-01-01 |
C000283 | 2023-01-04 |
C000647 | 2023-01-03 |
C000647 | 2023-01-03 |
C001371 | 2023-01-03 |
C001371 | 2023-01-03 |
C001562 | 2023-01-03 |
C001942 | 2023-01-02 |
C002186 | 2023-01-04 |
C002243 | 2023-01-05 |
・・・ | ・・・ |
特定の値以外のデータを取得(<>)
<>の演算子は指定した値以外のデータを取得する条件です。SQL5-4は2023年5月10日以外の日付のデータを取得しています。
★ハンズオン〜SQLを実行してみよう〜
・SQL5-4
SELECT
order_id,
order_date
FROM
orders
WHERE
order_date <> '2023-05-10'
LIMIT 10・表5-4:SQL5-3の実行結果
order_id | order_date |
|---|---|
C000001 | 2023-03-13 |
C000002 | 2025-12-05 |
C000002 | 2025-12-05 |
C000003 | 2023-11-27 |
C000004 | 2025-08-03 |
C000005 | 2025-01-18 |
C000005 | 2025-01-18 |
C000006 | 2023-04-08 |
C000006 | 2023-04-08 |
C000007 | 2024-09-15 |
・・・ | ・・・ |
空のデータを取得
SQL5-5はWHEREの条件にuser_id IS NULLという条件がついているため、購入履歴テーブルのユーザーID(user_id)が空になっているデータを取得しています。一方のSQL5-6はその逆で、user_id IS NOT NULLという条件がついているため、ユーザーIDが空でないデータを取得しています。
★ハンズオン〜SQLを実行してみよう〜
・SQL5-5
SELECT
order_id,
user_id
FROM
orders
WHERE
user_id IS NULL
LIMIT 10・表5-5:SQL5-5の実行結果
order_id | user_id |
|---|---|
(該当データなし) |
・SQL5-6
SELECT
order_id,
user_id
FROM
orders
WHERE
user_id IS NOT NULL
LIMIT 10・表5-6:SQL5-6の実行結果
order_id | user_id |
|---|---|
C000001 | A000439 |
C000002 | A000211 |
C000002 | A000211 |
C000003 | A000276 |
C000004 | A000392 |
C000005 | A000172 |
C000005 | A000172 |
C000006 | A000255 |
C000006 | A000255 |
C000007 | A000276 |
・・・ | ・・・ |
さまざまな条件指定の方法
複数の条件に一致するデータを取得する「AND」
特定の条件に一致するデータを取得するWHEREですが、複数の条件を指定することもできます。そこで、複数の条件を指定して、すべての条件に一致するデータを取得するときに使うのがANDです。
SQL5-7を実行して、ANDを使った条件指定について確認してみましょう。SQL5-7では、WHERE order_date <= '2023-01-03'のあとに、AND is_discounted = 1とさらに条件が追加されています。ANDは2つ以上の条件を組み合わせて、すべての条件に一致するデータを取得するときに使用します。つまり、SQL5-7では購入日(order_date)が2023年1月3日以前(2023年1月3日も含める)で、さらに割引フラグ(is_discounted)が「1」のデータを取得しています。割引フラグ(is_discounted)とは商品を購入した時に割引価格で購入したかどうかを保存するものです。割引価格で購入した場合は割引フラグに1が入り、割引価格で購入していない場合は0が入ります。
★ハンズオン〜SQLを実行してみよう〜
・SQL5-7
SELECT
order_id,
order_date,
is_discounted
FROM
orders
WHERE
order_date <= '2023-01-03'
AND is_discounted = 1
LIMIT 10・表5-7:SQL5-7の実行結果
order_id | order_date | is_discounted |
|---|---|---|
C003337 | 2023-01-03 | 1 |
C003337 | 2023-01-03 | 1 |
C003337 | 2023-01-03 | 1 |
C003975 | 2023-01-03 | 1 |
C004948 | 2023-01-02 | 1 |
C005232 | 2023-01-02 | 1 |
C011611 | 2023-01-01 | 1 |
C017681 | 2023-01-03 | 1 |
C020290 | 2023-01-01 | 1 |
C020578 | 2023-01-03 | 1 |
・・・ | ・・・ | ・・・ |
ちなみに、AND is_discounted = 1のis_discountedはINTEGER型で整数が入ります。整数を条件で指定する場合には、AND is_discounted = '1'のようにシングルクォーテーションは使わないので注意しましょう^1。
このように、異なる2つの条件を組み合わせて、どちらの条件にも一致するデータを取得したい場合には、WHEREのあとにANDを使って条件を追加します。ちなみに、条件指定するWHEREはSELECT文の中で1回だけしか記述できません。しかし、ANDに関しては何度も記述することができます。3つ以上の条件を指定して、すべての条件に一致するデータを取得する場合はANDを複数使いましょう。
いずれかの条件に一致するデータを取得する「OR」
ANDと同じように、複数の条件を指定するときに使用されるのがORです。ANDはすべての条件に一致するデータを取得しますが、ORは複数の条件のいずれかに一致するデータを取得します。
SQL5-8を実行してORを使った条件指定について確認してみましょう。SQL5-8では、WHERE large_category = '食品'のあとにOR large_category = '日用品'とさらに条件が追加されています。ORは2つ以上の条件を組み合わせて、いずれかの条件に一致するデータを取得します。つまり、SQL5-8では大カテゴリ(large_category)が食品、もしくは日用品のデータを取得しています。
★ハンズオン〜SQLを実行してみよう〜
・SQL5-8
SELECT
product_id,
name,
large_category
FROM
products
WHERE
large_category = '食品'
OR large_category = '日用品'・表5-8:SQL5-8の実行結果
product_id | name | large_category |
|---|---|---|
B000001 | 美味しい水 500ml | 食品 |
B000002 | 美味しい水 2l | 食品 |
B000003 | 美味しい水 2l 6本セット | 食品 |
B000004 | パスタ 1kg | 食品 |
B000005 | きゅうり 3本入り | 食品 |
B000006 | トマト 大 | 食品 |
B000007 | トマト 小 | 食品 |
B000008 | 鉛筆 5本セット | 日用品 |
B000009 | 消しゴム | 日用品 |
B000010 | シャーペン | 日用品 |
・・・ | ・・・ | ・・・ |
このように、2つ以上の条件を組み合わせていずれかの条件に一致するデータを取得したい場合は、ORを使ってWHEREのあとに条件を追加します。ORもANDと同様にSELECT文の中で複数記述できます。3つ以上の条件を指定して、いずれかの条件に一致するデータを取得する場合はORを複数使いましょう。
範囲を指定してデータを取得する「BETWEEN」
2つの条件を指定する場合で、両方の条件に一致するデータの取得にはANDを使いました。一方で、2つの条件を指定する方法はAND以外にもあります。それがBETWEENを使った条件指定です。
まずはSQL5-9、SQL5-10を実行してBETWEENの使い方について確認してみましょう。SQL5-9は、ANDを使って商品の金額(price)が1,000円以下で、かつ500円以上という条件でデータを取得しています。これをBETWEENを使って条件指定したのがSQL5-10です。price BETWEEN 500 AND 1000と書き方が変わっています。これはANDを使った条件指定と同じで、商品の金額が500円以上で1,000円以下という条件になります。
このように、ある値の範囲を指定して条件指定をしたい場合はBETWEENを使用することができます。ANDでもBETWEENでも同じ条件でデータの取得ができるので、どちらを使っても問題ありません。実際に、SQL5-9とSQL5-10は出力結果がまったく同じになります。
★ハンズオン〜SQLを実行してみよう〜
・SQL5-9
SELECT
product_id,
name,
price
FROM
products
WHERE
price <= 1000
AND price >= 500・表5-9:SQL5-9の実行結果
product_id | name | price |
|---|---|---|
B000003 | 美味しい水 2l 6本セット | 690 |
B000012 | 筆箱 | 1000 |
B000016 | ノート 5冊セット | 500 |
B000017 | シャンプー 340ml | 700 |
B000018 | コンディショナー 340ml | 700 |
B000020 | 入浴剤 30袋詰め合わせ | 1000 |
B000022 | ハンドクリーム | 500 |
B000034 | スプーン 2セット | 1000 |
B000035 | フォーク 2セット | 1000 |
B000036 | コースター 5枚セット | 800 |
B000048 | 靴下3足セット | 1000 |
・SQL5-10
SELECT
product_id,
name,
price
FROM
products
WHERE
price BETWEEN 500 AND 1000・表5-10:SQL5-10の実行結果
product_id | name | price |
|---|---|---|
B000003 | 美味しい水 2l 6本セット | 690 |
B000012 | 筆箱 | 1000 |
B000016 | ノート 5冊セット | 500 |
B000017 | シャンプー 340ml | 700 |
B000018 | コンディショナー 340ml | 700 |
B000020 | 入浴剤 30袋詰め合わせ | 1000 |
B000022 | ハンドクリーム | 500 |
B000034 | スプーン 2セット | 1000 |
B000035 | フォーク 2セット | 1000 |
B000036 | コースター 5枚セット | 800 |
B000048 | 靴下3足セット | 1000 |
ただし、範囲を指定してデータ取得する場合は、BETWEENを使ったほうがどこからどこまでのデータを取得するのかが直感的にわかります。例えば、今回のように商品の金額の範囲を指定してデータを取得する場合や、購入履歴のデータを日付の範囲を指定して取得する場合などは、BETWEENを使用するとよりわかりやすくなります。
文字列のパターンにマッチするデータを取得する「LIKE」
LIKEを使った条件指定
データ分析では、特定の文字が含まれるデータを取得したい場合があります。その場合は、LIKEを使って文字列を検索することができます。例えば、商品名に「水」が含まれているデータを取得したい場合を考えてみましょう。
まずはSQL5-11を実行してLIKEの使い方を確認してみましょう。SQL5-11では、WHEREのあとにname LIKE '%水%'という条件がついています。これが商品名(name)に「水」が含まれているデータを取得するという条件になります。
★ハンズオン〜SQLを実行してみよう〜
・SQL5-11
SELECT
product_id,
name
FROM
products
WHERE
name LIKE '%水%'・表5-11:SQL5-11の実行結果
product_id | name |
|---|---|
B000001 | 美味しい水 500ml |
B000002 | 美味しい水 2l |
B000003 | 美味しい水 2l 6本セット |
B000023 | 化粧水 |
B000060 | 水洗い電動シェイバー |
ここで使われているのがパーセント(%)というワイルドカードです。ワイルドカードとは、文字列を検索するLIKE演算子で使える記号で、パーセント(%)とアンダースコア(_)の2つがあります。
ワイルドカード | 意味 |
|---|---|
%(パーセント) | 0文字以上の任意の文字列にマッチ |
_(アンダースコア) | 任意の1文字にマッチ |
%は0文字以上の任意の文字列を表すワイルドカードです。SQL5-11にある'%水%'は、「水」という単語の前後に%がついてます。つまり、商品名の先頭も最後もどんな文字がついてもよく、「水」という単語が含まれる商品を取得する条件になります。
ワイルドカードの使い方
ここ大事なポイントは、%をどこに記述するかということです。%の記述方法によって、どんな文字列が該当するかが変わってきます。先ほど解説したSQL5-11では、商品名に「水」が含まれる条件指定をしています。「水」という単語の前後に%がついているため、商品名に「水」が含まれているものすべてが出力されます。つまり、この場合は「美味しい水 2l」、「化粧水」、「水洗い電動シェイバー」などが対象になります。
ワイルドカードの使い方を理解するためにSQL5-12、SQL5-13、SQL5-14をそれぞれ実行して出力結果を確認してみましょう。まず、SQL5-12はSQL5-11と違い、条件が'水%'になっています。%が「水」のあとにしかついていないため、先頭の文字が「水」で、そのあとは0文字以上の任意の文字列という条件指定になります。つまり、「美味しい水 2l」、「化粧水」は「水」から始まっていないので、この場合は対象からは外れ、「水洗い電動シェイバー」だけが対象になります。
★ハンズオン〜SQLを実行してみよう〜
・SQL5-12
SELECT
product_id,
name
FROM
products
WHERE
name LIKE '水%'・表5-12:SQL5-12の実行結果
product_id | name |
|---|---|
B000060 | 水洗い電動シェイバー |
次に、SQL5-13を確認しましょう。SQL5-13の条件は'%水'になっています。%が「水」の前にしかついていないため、先頭は0文字以上の任意の文字列で、最後に「水」が含まれるという条件指定になります。最後に%がついていないので、文字列の最後が「水」で終わっているものだけが対象になります。つまり、この場合「美味しい水 2l」、「水洗い電動シェイバー」は対象からは外れ、「化粧水」だけが対象になります。
★ハンズオン〜SQLを実行してみよう〜
・SQL5-13
SELECT
product_id,
name
FROM
products
WHERE
name LIKE '%水'・表5-13:SQL5-13の実行結果
product_id | name |
|---|---|
B000023 | 化粧水 |
最後にSQL5-14を確認しましょう。SQL5-14の条件は'__水'になっています。これはLIKE演算子で使えるワイルドカードのアンダースコアが2つついており、最後に「水」の文字列が指定されています。アンダースコアは任意の1文字という条件になるので、アンダースコアが2つあると任意の2文字になります。したがって、この条件では、「〇〇水」という3文字の文字列で、最後が「水」で終わるという条件指定になります。つまり、この場合は「化粧水」が対象になります。
★ハンズオン〜SQLを実行してみよう〜
・SQL5-14
SELECT
product_id,
name
FROM
products
WHERE
name LIKE '__水'・表5-14:SQL5-14の実行結果
product_id | name |
|---|---|
B000023 | 化粧水 |
このように、LIKE演算子を活用することで、文字列の検索ができます。LIKE演算子で使えるワイルドカードとして、%と_の2つの条件指定を解説しましたが、データ分析でよく活用するのは%です。_は任意の1文字という狭い条件指定で、活用の範囲が限定的です。データ分析では、%の使い方を覚えておきましょう。
複数の値に一致するデータを取得する「IN」
2つの条件を指定する場合、いずれかの条件に一致するデータの取得にはORを使いました。ORは2つでも3つでも条件をつなげることができるので、複数の条件を何個も並べることができます。
複数の条件を指定するORの使い方を確認するために、SQL5-15を実行してみましょう。SQL5-15では、WHEREのあとにORを2つつなげて、3つの条件のいずれかに該当するデータを取得しています。
★ハンズオン〜SQLを実行してみよう〜
・SQL5-15
SELECT
product_id,
name,
large_category
FROM
products
WHERE
large_category = '食品'
OR large_category = '日用品'
OR large_category = '電化製品'・表5-15:SQL5-15の実行結果
product_id | name | large_category |
|---|---|---|
B000001 | 美味しい水 500ml | 食品 |
B000002 | 美味しい水 2l | 食品 |
B000003 | 美味しい水 2l 6本セット | 食品 |
B000004 | パスタ 1kg | 食品 |
B000005 | きゅうり 3本入り | 食品 |
B000006 | トマト 大 | 食品 |
B000007 | トマト 小 | 食品 |
B000008 | 鉛筆 5本セット | 日用品 |
B000009 | 消しゴム | 日用品 |
B000010 | シャーペン | 日用品 |
・・・ | ・・・ | ・・・ |
複数の条件を指定する方法としてSQL5-15でも問題はありませんが、WHEREの条件が長くなり、SQLが見づらくなってしまいます。そこで、INを使うことでWHEREの条件をシンプルにできます。INは複数の値のいずれかに一致するデータを取得するための条件として活用できます。
INを使ってSQL5-15を書き直すと、SQL5-16のようになります。SQL5-16を実行して出力結果を確認してみましょう。ORを使って3つの条件を並べたSQL5-15と比べると、INを使用することで、1つの条件として書き直すことができます。
★ハンズオン〜SQLを実行してみよう〜
・SQL5-16
SELECT
product_id,
name,
large_category
FROM
products
WHERE
large_category IN ('食品', '日用品', '電化製品')・表5-16:SQL5-16の実行結果
product_id | name | large_category |
|---|---|---|
B000001 | 美味しい水 500ml | 食品 |
B000002 | 美味しい水 2l | 食品 |
B000003 | 美味しい水 2l 6本セット | 食品 |
B000004 | パスタ 1kg | 食品 |
B000005 | きゅうり 3本入り | 食品 |
B000006 | トマト 大 | 食品 |
B000007 | トマト 小 | 食品 |
B000008 | 鉛筆 5本セット | 日用品 |
B000009 | 消しゴム | 日用品 |
B000010 | シャーペン | 日用品 |
・・・ | ・・・ | ・・・ |
WHEREの条件で使うORとINは、どちらを使っても得られる結果は同じになります。実際にSQL5-15とSQL5-16は、出力結果がどちらもまったく同じになります。なので、ORでもINでもどちらを使っても問題ありません。 ただし、ORを使って複数の条件をつなげるよりも、INを使ったほうがSQLがシンプルになり、より見やすいです。複数の条件のいずれかに一致するデータを取得したい場合は、INを使うことをおすすめします。
集約した結果に対して条件をつける
HAVINGを使った条件指定
データ分析でよく使われる集約関数は第4章で解説しましたが、集約関数と条件指定も合わせて使われることがあります。例えば、集約関数でカテゴリごとの件数を集計したときに、件数が5件以上のデータを取得したい場合はどうすればよいか考えてみましょう。
まずは、集約関数の復習としてSQL5-17を実行し、出力結果を確認してみましょう。SQL5-17では、大カテゴリ(large_category)ごとのデータの件数を集計しています。
★ハンズオン〜SQLを実行してみよう〜
・SQL5-17
SELECT
large_category,
COUNT(*)
FROM
products
GROUP BY
large_category・表5-17:SQL5-17の実行結果
large_category | COUNT(*) |
|---|---|
インテリア | 4 |
ファッション | 6 |
日用品 | 34 |
電化製品 | 9 |
食品 | 7 |
では、「大カテゴリの件数が5件以上」のデータを取得する場合はどうすればよいでしょうか。本章の「特定の条件をつけてデータを取得する」で解説したWHEREを使って「件数が5件以上」という条件を追加してみます。
まずは、SQL5-18を実行して出力結果を確認してみましょう。WHERE COUNT(*) >= 5をつけて、5件以上のデータを取得する条件を追加しています。しかし、SQL5-18を実行するとエラーになってしまいます。理由は、WHEREの中でCOUNT(*)を使っているからです。これは、GROUP BYで集計した結果をWHEREの中で指定できないということです。
★ハンズオン〜SQLを実行してみよう〜
・SQL5-18
SELECT
large_category,
COUNT(*)
FROM
products
WHERE
COUNT(*) >= 5
GROUP BY
large_category・表5-18:SQL5-18の実行結果
エラー |
|---|
aggregate functions are not allowed in WHERE |
では、「件数が5件以上」のようにGROUP BYで集計した結果を条件に指定したい場合、どうすればよいのでしょうか。ここで、WHEREの代わりに条件指定として使えるのがHAVINGです。
HAVINGを使って条件を指定したSQL5-19を実行し、出力結果を確認してみましょう。SQL5-19を実行すると、「大カテゴリの件数が5件以上」という条件でデータを取得できます。WHEREをHAVINGに変更して、HAVINGの位置をGROUP BYよりあとにすることで、SQLのエラーも解消されました。
★ハンズオン〜SQLを実行してみよう〜
・SQL5-19
SELECT
large_category,
COUNT(*)
FROM
products
GROUP BY
large_category
HAVING
COUNT(*) >= 5・表5-19:SQL5-19の実行結果
large_category | COUNT(*) |
|---|---|
ファッション | 6 |
日用品 | 34 |
電化製品 | 9 |
食品 | 7 |
SQLの実行順序について
HAVINGとWHEREの基本的な使い方は同じです。WHEREで解説した演算子の>=やBETWEENなどもHAVINGで活用できます。 では、なぜWHEREの中でCOUNT(*)を使った条件が使えず、HAVINGを使う必要があるのでしょうか。これを理解するために重要なポイントは、SQLには実行される順番があるということです。
図5-20のように、SELECT、WHERE、GROUP BYなどは、それぞれSQLの中で実行される順番が決まっています。例えば、WHEREはSQLの処理の中で、GROUP BYよりも前に実行されます。つまり、WHEREの中でGROUP BYの結果として得られる条件は指定できないということです。逆に、HAVINGはGROUP BYよりもあとに実行されます。なので、GROUP BYの結果によって得られた数値を条件として使用したいときは、WHEREではなくHAVINGを使う必要があります。
・図5-20:SQLが実行される順番

このように、SQLを実行するときには内部で実行される順番が決まっています。SELECT以外は、SQLが実行される順番と、実際にSQLを記述するときの順番がほぼ一致しています。特にWHERE、GROUP BY、HAVING、ORDER BY、LIMITは、SQLが実行される順番に実際のSQLを記述する必要があります。例えば、HAVINGをGROUP BYの前に記述することはできません。記述するとSQLの構文エラーとなってしまいます。したがって、SQLを記述するときは、SQLが実行される順番も意識しましょう。
データ分析における「WHERE / HAVING」の考え方
WHEREやHAVINGを使うことで、特定の条件をつけてデータを取得することができます。どちらも特定の条件をつけてデータを取得する方法ですが、それぞれSQLの中で実行される順番に違いがあります。また、AND、OR、BETWEEN、LIKE、INなど、さまざまな条件をつけることで、より複雑な条件でデータの取得が可能になります。図5-21のように、既存のテーブルから必要な行だけの出力結果テーブルを求めることがWHEREやHAVINGで重要な考え方です。
特定の条件をつけてSQLを実行するということは、大量にあるデータから該当するデータのみを取得することです。データの量が多くなればなるほど、条件を指定してデータを取得する必要性も高まります。もとあるデータを絞り込みたい場合には、WHEREやHAVINGを活用しましょう。
・図5-21:WHERE HAVINGの考え方

演習問題
演習問題5-1
商品情報テーブル(products)から価格(price)が1,000円以下の商品数を大カテゴリ別(large_category)に出力してください。
演習問題5-2
商品情報テーブル(products)から大カテゴリ(large_category)ごとの商品数が5件以上の大カテゴリ名と商品数を出力してください。また、出力結果は商品数が多い順に並び替えて出力してください。