BigQueryサンドボックスでSQL（主にデータ抽出）の勉強を始める

# 動機
2019年12月からデータ分析の仕事をすることになりました。
SQLを書いたこともないので、とりあえずPostgreSQLをインストールして勉強しよう！
と思ってたら、来月からは「BigQuery」とやらを使ってSQLを書くらしい。
でも、勉強用に参考書（[SQL 第2版 ゼロからはじめるデータベース操作](https://www.amazon.co.jp/dp/B01HD5VWWO/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)）買っちゃったしなぁ…。

1. **そもそもBigQueryって何？？**
2. **BigQueryは個人が勉強用に使えるものなのか**
3. **買った参考書を活かせる（そのまま実装できる）のか**

# BigQueryとは
>BigQueryは、Googleが提供するサーバーレスでスケーラビリティに優れた企業向けデータウェアハウスです。
>https://cloud.google.com/bigquery/?hl=ja

#### データウェアハウスって何…？
- データベースの一種（データウェアハウス ⊂ データベース）
- ある時点のデータを保存しておく倉庫的な役割をはたすデータベースのこと
- 一般的なデータベースと違って、内容の書き換えや削除などはしない

ピンとこないですね…。
一般的なデータベースとして、例えば銀行の預金残高を管理しているデータベースを考えてみます。
こういうデータベースは入金/出金のようなイベントがあるたび、逐次テーブルの値が更新されるでしょう。

一方でデータウェアハウスは、「2019/12/21の預金残高」「2019/12/22の預金残高」…
のように、"ある時点のデータ"をひたすら保管しておくためのデータベースのようです。
データを保管する目的は主に分析のためで、過去のデータのため基本的に書き換えや削除はしないみたいです。

**膨大な過去ログが保管されているデータベースで、稼働中のサービスとは切り離されているもの**、と理解したけど合っているでしょうか…。
BigQueryではデータをクラウドに保管しておいて、ブラウザ上でSQLを書いて操作できるみたいです。
#### BigQueryは何がすごいの？
データウェアハウスには過去のデータを保存しておくため、データが大規模になりやすいです。
データの量が増えるとSQLの処理時間も増える。数秒なら良いけど、数分数時間となってくると仕事にならないと思います。

それを高速に処理できるサービスとして利用されているのがBigQueryです。
詳しいことは分かりませんが、Googleが所有する大量のマシンで分散処理をしているから速いらしいです。

# BigQueryサンドボックス？
BigQueryは「データを保存しておくこと」「クエリを実行すること」の2つについて、使用量に応じて料金がかかるみたいです。ただし、**一定の量までは無料で使用できます。**

- ストレージ（データの保存）
  - 無料枠… 1ヶ月あたり10GB
  - それ以上は… GB あたり $0.02/月
- クエリ
  - 無料枠… 1ヶ月あたり1TB
  - それ以上は… TB あたり $5

これから勉強を始める自分にとっては、無料枠が用意されているのが非常にありがたいです。
でも、Google Cloud Platformのアカウントとかクレジットカードの登録とかが必要らしい…。

でも大丈夫。そういった面倒なことは置いといて、とりあえず使ってみたい！という自分のような人向けに**BigQueryサンドボックス**というサービスがあります。
データは60日間しか保存できないものの、諸々の登録無しで無料枠分の使用が可能です。勉強用ならこれで十分だと判断しました。

# BigQueryサンドボックスの始め方
ここからは実際に手を動かしながら見ていきます。
[Google Cloud PlatformのBigQueryのページ](https://cloud.google.com/bigquery/)に移動すると、「BigQuery の無料トライアル」というボタンが表示されます。
<img width="1438" alt="スクリーンショット 2019-12-21 20.34.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554975/e0129efd-e0cd-5754-1c3d-4b89477c1497.png">
ボタンを押すと以下のページに移動します。
プロジェクトがないとダメみたいなので、作成してみます。名前は「Training」で。
<img width="1438" alt="スクリーンショット 2019-12-21 21.00.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554975/784ee108-ef99-04e8-aeb2-c5c807342307.png">
<img width="1438" alt="スクリーンショット 2019-12-21 21.02.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554975/61622789-a9dc-a099-07f0-1fec00e1d592.png">

SQLが書けそうな画面があります！
左上にはサンドボックスと書いてあるし、どうやらBigQueryサンドボックスを使用する準備ができたみたいです。
<img width="1438" alt="スクリーンショット 2019-12-21 21.04.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554975/d1fd5d78-95f6-c13f-efb0-dc07eb18440b.png">

# データセットの作成
[参考書](https://www.amazon.co.jp/dp/B01HD5VWWO/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)ではSQL（`CREATE DATABASE shop;`）でデータベースを作成するように指示されていましたが、BigQueryではGUIを操作して作成するようです。
SQLでの作成も試しましたが、サンドボックスだとデータの追加ができないみたいなので諦めます。
>サンドボックス プロジェクトでサポートされていないものは、次のとおりです。
>- データのストリーミング
>- データ操作言語（DML）のステートメント    # <- この中にINSERTやUPDATEが含まれている
>- BigQuery Data Transfer Service
>https://cloud.google.com/bigquery/docs/sandbox?hl=ja

というわけでGUIを使っていきます。
左下のプロジェクト名（自動で末尾に番号が振られていた）をクリックして「データセットを作成」ボタンを押します。
<img width="1438" alt="スクリーンショット 2019-12-21 21.13.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554975/d4089d45-f9a1-878c-9236-111b4c464627.png">

データセット「shop」を作成します。
<img width="1438" alt="スクリーンショット 2019-12-21 21.34.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554975/ffdc31fb-4092-588a-de42-4d0916d40e6b.png">

プロジェクト名の下に「shop」が作成されました。
<img width="298" alt="スクリーンショット 2019-12-22 11.28.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554975/fb73f513-1765-7bf6-c32c-d69dd00de435.png">


# テーブルを作成する
テーブルの作成もGUIから行います。csvファイルやGoogleスプレッドシートをソースとして作成できるみたい。
今回はGoogleスプレッドシートにデータを保存して、それをソースにテーブルを作成してみます。

まずはスプレッドシートで参考書を見ながら表を作成します。（保存したら表のURLをコピーしておく）
<img width="858" alt="スクリーンショット 2019-12-22 11.42.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554975/41cfa29a-e27a-dea8-2e82-7e1a7abb101a.png">

作成したらBigQueryに戻って「shop」データセットを選択し、テーブルを作成します。
<img width="1438" alt="スクリーンショット 2019-12-21 21.36.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554975/24680b18-e63d-ec82-b654-2540d5ae56fa.png">

一番上でソースを選択できるので、右から「ドライブ→作成した表のURL→Googleスプレッドシート」に変更します。
テーブル名とフィールド名は例の如く参考書を参考に設定しました。
<img width="1438" alt="スクリーンショット 2019-12-22 11.20.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554975/4af36553-c0e9-779e-b6d6-4245513ceda7.png">

データセットの下に、テーブル「Shohin」が作成されました！
<img width="719" alt="スクリーンショット 2019-12-22 11.48.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554975/7d53ff9e-cdf5-59a9-ea56-cc2f92848ebb.png">


# SQLを書いてみる
テーブルが作成できたのでいよいよSQLを書いてみます。
とりあえずテーブルがちゃんと作られたのか確認したいので、中身を全部見てみることにしました。

クエリエディタに下記のコードを打ち込みます。

```sql
select *
from shop.shohin;
```

すると、コードが認識されて実行時に処理するデータの量を表示してくれました。
勉強の範囲なら大きなデータは扱わないので大丈夫だと思いますが、実務の際には無駄に大量のデータを処理しないよう注意したいところです。
<img width="1140" alt="スクリーンショット 2019-12-23 23.21.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554975/ba4df9b9-80fc-bbee-1e75-9438f5864534.png">

実行してみます。
画面下部に先ほどGoogleスプレッドシートに記入したデータが表示されました！
<img width="644" alt="スクリーンショット 2019-12-23 23.35.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554975/0c6b4239-eab5-c6ea-1f78-42841c755ff1.png">

WHERE文なども期待通りに動きました。（結果は省略）

```sql
select *
from shop.Shohin
where hanbai_tanka > 1000;
```

# まとめ
**1. そもそもBigQueryって何？？**　
　→Googleが提供する、大規模データを高速に処理できるデータウェアハウスのこと。
**2. BigQueryは個人が勉強用に使えるものなのか**
　→Googleアカウントがあれば、無料のBigQueryサンドボックスが使用できる。一部制限あり。
**3. 買った本を活かせる（そのまま実装できる）のか**
　→INSERTやUPDATEといったテーブルの内容を変更するもの以外であれば活かせる？

今後は今回作ったプロジェクト上で、参考書のコードをガシガシ動かしていこうと思います。
「3. 買った本を活かせる（そのまま実装できる）のか」については、今後気づいたことがあれば追記します。

※qiita初投稿ですので、ルール・マナー違反や間違っている内容等ありましたら是非ともご指摘ください。

# 参考にしたページなど
[BigQueryの事始め。Web Consoleと戯れる。 - Morning Girl]
(http://kageura.hatenadiary.jp/entry/2018/02/13/BigQueryの事始め%E3%80%82Web_Consoleと戯れる%E3%80%82)
[GCPアカウントなしでも使えるBigQueryの始め方 - Qiita]
(https://qiita.com/perico_v1/items/7ea358a64cf1efa52cd9)
[データウェアハウス（DWH）とは | 定義・データベース（DB）との違い | ボクシルマガジン]
(https://boxil.jp/mag/a1657/)
[データウェアハウス (DWH)とは | 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典]
(https://wa3.i-3-i.info/word15571.html)