前回、「データベースとは?」というテーマで、データベースのイメージをご紹介していきましたが、今回はその続きとなるSQLというものをご紹介していきます。
www.digitaldolphin.jp
目次
SQLとは?
まず、そもそもSQLとは、"Structured Query Language"の略で、データベースのデータを扱うためのプログラム言語となります。そして、このSQLを利用することにより、データの更新や追加・削除、抽出などの様々な命令をデータベースに対して行うことが出来るようになります。
ただ一方で、「データベースを扱うためのプログラム言語であることはわかったが、実際にどんな時に使うの?」と正直心の中で思っている人は意外と多いのではないでしょうか。少し余談ですが、DXやテクノロジー関連の言葉や内容で分からないこと自体は恥ずべきことではなく、筆者が実際に色んなDXのプロジェクトに関わっている中でも、企業の担当者のほとんどの方は分からないのは良くない、かっこ悪いからといって、知った感じを出していることが多かったりします。そして、それがプロジェクトの推進を遅延される原因になったり、プロジェクトの炎上につながる原因となっていることがほとんどであることも事実なので、恥じずに一旦受けれて分からないことは調べましょう。話を戻しますが、SQLを使うタイミングはいつなのでしょうか。*1
基礎的なSQLの例(SELECT句、FROM句、WHERE句)
例えば、多店舗で小売業をしている企業の経営企画担当が2022年6月の店舗Aの『売上データ』を出したいと思ったとします。そうすると、担当者は、実際にPOSシステムから『売上データ』をダウンロードして、Excelで作業しようとしますが、Excelの場合には10万行、20万行というデータが存在する場合は、Excelが動かないと言った事態が発生します。では、一体どうするかというと、ほとんどの担当者はExcelでは出来ないため、一旦システム担当に依頼して必要なデータを出してもらいます。実は、その際にシステム担当の方は必要なデータを抽出するために、SQLを利用していたりします。
では、具体的にどのような感じでSQLを書いているのでしょうか。
そこで例として以下の表1にある受注データから、オンラインショップで購入をしているものを抽出する場合のSQLをご紹介します。
表1:受注データ
| 受注ID | 受注日時 | 顧客ID | 購入金額 | 購入店舗 | キャンセル日時 | 返品日時 |
|---|---|---|---|---|---|---|
| o001 | 2022/06/23 10:00:00 | c001 | ¥10,000 | 東京店 | − | − |
| o002 | 2022/06/24 11:30:00 | c002 | ¥6,600 | オンラインショップ | 2022/06/24 11:35:00 | − |
| o003 | 2022/06/24 12:00:00 | c004 | ¥6,500 | 東京店 | − | − |
| o004 | 2022/06/24 12:10:00 | c007 | ¥4,000 | 横浜店 | − | − |
| o005 | 2022/06/24 16:30:00 | c001 | ¥2,000 | オンラインショップ | − | − |
| o006 | 2022/06/25 10:00:00 | c001 | ¥10,000 | 東京店 | − | − |
| o007 | 2022/06/26 11:30:00 | c002 | ¥6,600 | オンラインショップ | − | − |
| o008 | 2022/06/26 12:00:00 | c004 | ¥6,500 | 東京店 | − | − |
| o009 | 2022/06/27 12:10:00 | c007 | ¥4,000 | 横浜店 | − | − |
| o010 | 2022/06/28 16:30:00 | c001 | ¥2,000 | オンラインショップ | − | − |
サンプル1
SELECT
受注ID
,受注日時
,顧客ID
,購入金額
,購入店舗
,キャンセル日時
,返品日時
FROM
受注データ
WHERE
キャンセル日時 IS NULL
AND 返品日時 IS NULL
AND 購入店舗 LIKE 'オンラインショップ'
;表2:サンプル1の実行結果
| 受注ID | 受注日時 | 顧客ID | 購入金額 | 購入店舗 | キャンセル日時 | 返品日時 |
|---|---|---|---|---|---|---|
| o005 | 2022/06/24 16:30:00 | c001 | ¥2,000 | オンラインショップ | − | − |
| o007 | 2022/06/26 11:30:00 | c002 | ¥6,600 | オンラインショップ | − | − |
| o010 | 2022/06/28 16:30:00 | c001 | ¥2,000 | オンラインショップ | − | − |
このSQLの中で出てくる"SELECT"、"FROM"、"WHERE"、"AND"等はそれぞれSELECT句、FROM句、WHERE句、AND句と呼ばれ、それぞれSQLにおけるデータベースに対しての命令となってます。ちなみに、それぞれの命令を組み合わせて作成しているサンプル1のようなコードをクエリと呼びます。まずはサンプル1で出来きた命令を以下にまとめます。
表3:サンプル1で出たきたSQL命令文
| # | 命令 | 意味 |
|---|---|---|
| 1 | SELECT | 必要なカラムの選択するための命令文 |
| 2 | FROM | 対象のデータベースを選択するための命令文 |
| 3 | WHERE | データベースからレコードを抽出する条件指定をするための命令文 |
| 4 | AND | 条件指定などで使われるもので、"且つ"という意味の命令文 |
表3を参考にすると、サンプル1の意味としては、『受注データ』というテーブルから「キャンセル日時」がNULLで、「返品日時」がNULLで、購入店舗が"オンラインショップ"のレコードを抽出し、その中で「受注ID」、「受注日時」、「顧客ID」、「購入金額」、「購入店舗」、「キャンセル日時」、「返品日時」というカラムを抽出するという意味となります。ここで出てきたNULLという概念は一旦何も値がない状態と理解してください。別途、NULLとは何かは簡単な記事を出します。
また、SQLに馴染んでもらうために別のサンプルを以下に共有します。
サンプル2
SELECT
*
FROM
受注データ
WHERE
キャンセル日時 IS NULL
AND 返品日時 IS NULL
AND 購入店舗 LIKE 'オンラインショップ'
;表4:サンプル2の実行結果
| 受注ID | 受注日時 | 顧客ID | 購入金額 | 購入店舗 | キャンセル日時 | 返品日時 |
|---|---|---|---|---|---|---|
| o005 | 2022/06/24 16:30:00 | c001 | ¥2,000 | オンラインショップ | − | − |
| o007 | 2022/06/26 11:30:00 | c002 | ¥6,600 | オンラインショップ | − | − |
| o010 | 2022/06/28 16:30:00 | c001 | ¥2,000 | オンラインショップ | − | − |
今回は、SELECT句の後に、"*"という文字がありますが、これは全てのカラムを意味します。実際の現場でも、ただただ必要な条件でデータを抽出したいという場合には、よく使われる記載方法のため覚えておいてください。そのため、サンプル2は実はサンプル1と同じ意味になります。では、次はどんな意味になりますでしょうか?
サンプル3
SELECT
*
FROM
受注データ
WHERE
キャンセル日時 IS NULL
AND 返品日時 IS NULL
AND 購入金額 >= 5000
;表5:サンプル3の実行結果
| 受注ID | 受注日時 | 顧客ID | 購入金額 | 購入店舗 | キャンセル日時 | 返品日時 |
|---|---|---|---|---|---|---|
| o001 | 2022/06/23 10:00:00 | c001 | ¥10,000 | 東京店 | − | − |
| o003 | 2022/06/24 12:00:00 | c004 | ¥6,500 | 東京店 | − | − |
| o006 | 2022/06/25 10:00:00 | c001 | ¥10,000 | 東京店 | − | − |
| o007 | 2022/06/26 11:30:00 | c002 | ¥6,600 | オンラインショップ | − | − |
| o008 | 2022/06/26 12:00:00 | c004 | ¥6,500 | 東京店 | − | − |
今回の意味は、表1から購入金額が5,000円以上でキャンセル・返品を抜いた受注を取得するためのコードになります。WHERE句に出てきた「購入金額 >= 5000」というものは特段説明する意味もないですが、購入金額が5,000円以上という意味になります。
バラバラとお話ししてきましたが、今回重要となるのは、以下のクエリ文になりますので、しっかりと公式的に覚えておいてください!
基礎的なSQLクエリ
SELECT
項目名1
,項目名2
,・・・
FROM
テーブル名
WHERE
条件文
;