【SQL入門】SQLを用いてデータを条件で絞る

フィルター データOUTPUT

なぜ条件を絞る必要があるか

なぜデータを条件で絞る必要があるかというと、条件を絞ることで、母集団全体だけでなく任意のグループにおける特徴量を出せて、分析アプローチの幅を広げることができるためです。 例えば、売上POSデータから商品データを分析するケースでは、条件を絞り込まずに分析しようとすると、全売上の特徴を出すことしかでませんが、うまく条件で絞り込むことによって「低価格帯における平均売上数」や「特定ブランドの商品における平均単価」のような、任意のグループにおける特徴量を出せることができます。

そういったメリットから、仮説を立ててデータで分析をする際には、データを条件で絞って特定グループにおける特徴量を調べることが多く、実際の現場で多く利用されるという意味でも「データを条件で絞る」ことが重要です。

条件で絞るとはなにか

「条件で絞る」とは、検索条件を指定して、特定のデータを抽出することです。検索条件を指定する際に使用するのが演算子です。これらの手法について説明していきます。

WHERE・HAVINGで絞り込む

WHERE

どういった条件でレコードのデータを取得するかを指定するためには、「WHERE カラム名 演算子 条件」のように、「〇〇カラムが〇〇であるレコード」といった意味になるように条件を指定します。

HAVING

GROUP BYで分類したデータを更に絞り込みたい場合は、HAVINGを用います。「GROUP BY カラム名 HAVING 条件」ようにすることで、条件を満たすグループが取得できます。

WHERE句との違いについてですが、SQLの各コマンドは以下の順番で実行されていて、WHEREは分類される前のテーブル全体を検索対象とするのに対し、HAVINGはGROUP BYによって分類されたデータが検索対象になります。

演算子

AND・OR

AND演算子を使うと、WHEREに複数の条件を指定することができます。「WHERE 条件1 AND 条件2」のようにすることで、条件1と条件2を共に満たすデータを検索することができます。

OR演算子は、AND演算子と同様に、複数の条件を扱います。「WHERE 条件1 OR 条件2」のようにすることで、条件1または条件2のどちらかを満たすデータを検索することができます。

IN

IN演算子を使うと、対象の値が指定した値のリストの中にあるかを判定することができます。「対象 IN(値1, 値2, … 値n)」のようにすることで、指定した値を含むレコードを検索することができます。

BETWEEN

BETWEEN演算子を使うと、対象の値が指定した2つの値の範囲以内にあるかを判定することができます。「WHERE カラム名 BETWEEN 最低値 AND 最大値」のようにすることで、指定の範囲内の値を含むレコードを検索することができます。

LIKE

LIKE演算子を使うと、「ある文字を含むデータ」を取得することができます。「WHERE カラム名 LIKE 文字列」のようにすることで「指定したカラムが〇〇を含むレコード」という条件となります。LIKE演算子を使用する際に覚えておく必要があるのが「ワイルドカード」です。「%」をワイルドカードとして扱います。詳しくはサンプルSQLで見ていきます。

応用例

内部結合(INNER JOIN)

INNER JOINは異なる2つのデータをつなげる際に利用するものですが、 「両方に存在するデータを抽出する結合」のため、片側を「特定のグループ」が含まれるデータにしておくことで、 結果的にデータを絞って「特定グループ」のデータだけを残すことができます。

例えば、全国模試の結果に特定高校の名簿を内部結合することで、特定高校のデータだけに絞る事ができます。 基本的にデータ結合目的がメインとなるため本記事での詳細な説明は省略します。

実際に条件を絞ってみる

準備

サンプルSQL

比較演算子

比較演算子は、値の大小を比較し、その結果を返します。不等号を使い、低価格帯(150円以下)のデータのみ集計します。

SELECT 
    *
FROM 
    test_table
WHERE test_table.price < 150;

このように演算子を用いて、条件にマッチしたレコードだけを出すことができます。次はHAVINGを使って、売上が4000円以上の商品を出してみます。

SELECT 
    test_table.product_id,
    test_table.name,
    SUM(test_table.Sales) AS Total_Sales
FROM 
    test_table
GROUP BY
    test_table.product_id,
    test_table.name
HAVING
    SUM(test_table.Sales) > 4000;

4000円以上売り上げているのが、回鍋肉弁当、鮭弁当、炭酸ジュースの3商品であることがわかりました。

次は顧客IDが2のレコードを選択します。

SELECT 
    *
FROM 
    test_table
WHERE test_table.user_id = 2;

顧客IDが2のみのレコードを出すことができました。次のように、顧客IDが2以外のレコードを出すこともできます。

SELECT 
    *
FROM 
    test_table
WHERE test_table.user_id != 2;
論理演算子

以下のようにANDを使用することで、5個以上売れていて、コストが70円以下のレコードを出すことができます。

SELECT 
    *
FROM 
    test_table
WHERE test_table.count >= 5 AND test_table.cost <= 70;

また、ORを使用すれば、どちらかを満たすレコードが出せます。

SELECT 
    *
FROM 
    test_table
WHERE test_table.count >= 5 OR test_table.cost <= 70;

どちらかの条件を満たすレコードを出すことができました。

IN演算子

IN演算子は対象の値が指定した値のリストの中にあるかを判定します。商品IDが2,3,5のレコードを選択します。

SELECT 
    *
FROM 
    test_table
WHERE test_table.product_id IN(2, 3, 5);

指定した値を含むレコードが出せました。また、IN演算子は以下のように置き換えることもできます。

SELECT 
    *
FROM 
    test_table
WHERE test_table.product_id = 2 OR test_table.product_id = 3 OR test_table.product_id = 5;
BETWEEN演算子

次の例では、注文個数が4個以上8個以下のレコードを選択しています。

SELECT 
    *
FROM 
    test_table
WHERE test_table.count BETWEEN 4 AND 8;

売上個数が4個以上8個以下のレコードを出すことができました。

LIKE演算子
前方一致

以下のように「〇〇%」とした場合、「〇〇」以降はどんな文字列にも一致するので、「〇〇」で始まる文字列を検索することができます。このような検索を「前方一致」と呼びます。

SELECT 
    *
FROM 
    test_table
WHERE test_table.name LIKE"オレンジ%";

このように商品名が「オレンジ〜」のレコードを出すことができました。前方一致なので、「イタリア産オレンジ」のような商品があった場合、このSQLでは出すことができません。

後方一致

以下のように「%〇〇」とした場合、「〇〇」より前はどんな文字列にも一致するので、「〇〇」で終わる文字列を検索することができます。このような検索を「後方一致」と呼びます。

SELECT 
    *
FROM 
    test_table
WHERE test_table.name LIKE"%ジュース";

このように商品名が「〜ジュース」のレコードを出すことができました。

部分一致

以下のように「%〇〇%」とした場合、「〇〇」の前後はどんな文字列にも一致するので、「〇〇」を含む文字列を検索することができます。このような検索を「部分一致」と呼びます。

SELECT 
    *
FROM 
    test_table
WHERE test_table.name LIKE"%弁当%";

このように商品名が「〜弁当〜」のレコードを出すことができました。

まとめ

サンプルSQLのように、WHERE句・HAVING句と演算子を使用すれば、値の計算や比較を行うことができ、データを絞り込むことができます。
このように条件で絞れば、新たなアプローチで分析を行うことや、より詳細な部分の分析ができます。

白井透
白井透

本記事内容をご利用される前にご確認お願いします

  • SinkCapitalギルドメンバーが記載したギルド内部向け記事を一般公開したものです
  • 記載内容の情報鮮度や正確性に問題があった場合も、本記事の内容を利用したことによるあらゆる問題には一切責任を負いかねます
  • 要望や指摘、意見等あれば気軽にコメントいただけると幸いです
  • 弊社にご興味のあるかたは是非弊社HP相談フォームを御覧ください

コメント

タイトルとURLをコピーしました