【SQL初心者向け】データサイエンス100本ノック導入方法【PostgreSQL】

# これってどういう記事？
突然ですが、実際にデータを使ってSQLを勉強したいなと思った時、こうは思いませんでしたか？
 - **データってどこから持ってきたらいいんだろう？**
 - **SQLの環境ってどれがいいんだろう？**

少なくとも私は思いました。

この記事では、**とにかく簡単にSQLコマンドの学習環境を作ること**を目的として、比較的簡単にクエリを扱う環境を構築できるPostgreSQLを使ってそれなりの量のデータ抽出を練習できるデータサイエンス100本ノックの環境構築について紹介します。

# 1. PostgreSQLの導入
まずはPostgreSQLをインストールします。早速他サイトさんに丸投げしてしまって恐縮ですが、こちらのサイトが大変参考になります。

https://www.javadrive.jp/postgresql/install/index1.html

上記作業の途中でパスワードの設定が求められると思います。**後程PostgreSQLを起動する際に必要になります**ので覚えておきましょう。
因みにバージョンについてですが、筆者は記事作成時点で最新の15.3を使用していますが、特に問題は感じておりません。

# 2. データサイエンス100本ノックのダウンロード
[データサイエンス100本ノックのGithub](https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess)から必要なデータをダウンロードします。
今回は以下のようにzipファイルを選択します。

<img width="600" alt="データサイエンス100本ノックGithub.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524147/e7159ce9-c6d5-874f-aa60-30a5d0f0dd08.png">

ダウンロードしたzipファイルは任意の場所に保存して構いません。保存した場所で解凍してしまいましょう。

# 3. サーバー／データベースの作成
**① PostgreSQLの起動**
**[ Windowsマーク ] → [ すべてのアプリ ] → [ PosgreSQL 15 ] → [ pgAdomin 4 ]**
でPostgreSQLを起動できます。

以下のようにパスワードが要求されますが、インストールの際に設定したものになります。

<img width="600" alt="PosgreSQL起動画面.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524147/02e63b1b-4d18-8487-7b4a-d80bb870fd97.png">

**② データベースの作成**
パスワードを入力してPostgreSQLの起動が完了するとデフォルトのサーバーとして
**[ Servers ] → [ PosgreSQL 15 ]** が存在していると思います。
新しくサーバーから作成してもいいのですが、今回はここに以下の要領でデータベースから作成したいと思います。

![PosgreSQLデータベース作成画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524147/ccf92a46-96c4-7a73-fdea-9ed2b34f1abe.png)

以上で100本ノックで使用するデータベースの作成まで行うことが出来ました。

# 4. テーブルの作成
100本ノックの問題を解いていくために必要なテーブルを作成していきます。

**① クエリツールを立ち上げる**
以下の画像に沿ってクエリツールを立ち上げます。

![PosgreSQLクエリ文入力.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524147/46c3a3f6-0a32-e7dc-e91f-e62fb770e2ea.png)

**② テーブル作成のためのクエリ文を入力する**
これからSQLのクエリ文については専門的な部分を学んでいくと思いますのでここは一旦深く考えずに以下のクエリ文を入力しましょう。
クエリ文中のパスの部分は自身が2でダウンロードした100本ノックのデータのパスに置き換えてください。以下の例はCドライブ直下に置いています。

```sql:Create Table
--customer
drop table if exists customer;
create table customer(customer_id text,
                      customer_name text not null,
                      gender_cd int,
                      gender text,
                      birth_day date,
                      age int,
                      postal_cd text,
                      address text,
                      application_store_cd text,
                      application_date text,
                      status_cd text);

copy customer from 'C:\100knocks-preprocess-master\docker\work\data\customer.csv'
    with csv header;

--category
drop table if exists category;
create table category(category_major_cd text,
                      category_major_name text,
                      category_medium_cd text,
                      category_medium_name text,
                      category_small_cd text,
                      category_small_name text);

copy category from 'C:\100knocks-preprocess-master\docker\work\data\category.csv'
    with csv header;

--geocode
drop table if exists geocode;
create table geocode(postal_cd text,
                     prefecture text,
                     city text,
                     town text,
                     street text,
                     address text,
                     full_address text,
                     longitude float,
                     latitude float);

copy geocode from 'C:\100knocks-preprocess-master\docker\work\data\geocode.csv'
    with csv header;

--product
drop table if exists product;
create table product(product_cd text,
                     category_major_cd text,
                     category_medium_cd text,
                     category_small_cd text,
                     unit_price int,
                     unit_cost int);

copy product from 'C:\100knocks-preprocess-master\docker\work\data\product.csv'
    with csv header;

--receipt
drop table if exists receipt;
create table receipt(sales_ymd int,
                     sales_epoch int,
                     store_cd text,
                     receipt_no int,
                     receipt_sub_no int,
                     customer_id text,
                     product_cd text,
                     quantity int,
                     amount int);

copy receipt from 'C:\100knocks-preprocess-master\docker\work\data\receipt.csv'
    with csv header;

--store
drop table if exists store;
create table store(store_cd text,
                   store_name text,
                   prefecture_cd int,
                   prefecture text,
                   address text,
                   address_kana text,
                   tel_no text,
                   longitude float,
                   latitude float,
                   floor_area float);

copy store from 'C:\100knocks-preprocess-master\docker\work\data\store.csv'
    with csv header;

```

これで100本ノックで使用するテーブルが完成しました。

<img width="600" alt="テーブル作成確認.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2524147/f8d55525-3240-c553-3d96-11d4f80d5711.png">

ここまで作業が出来ればデータサイエンス100本ノックを行う準備ができたと同時に、色々なSQLコマンドを練習する環境を整えることが出来ています。思う存分SQLを勉強していきましょう！

# さいごに
過去に自分がSQLコマンドを色々と勉強しようと思った時に、mysqlだったりdockerだったりといろんなものを導入した結果、SQLコマンドの基礎を学ぶという点において非常に遠回りになってしまった経験からこの記事を作成させていただきました。
もちろんこれらの知識もいろんな分野で必要なスキルではあります。しかし、一旦SQLコマンドを勉強したり試したりする、という環境を構築するのに色んなサイトを渡り歩いた結果、このように単純に構築するやり方を見つけたので是非共有させていただきたいと思った次第です。
この記事がこれからSQLを勉強される方の助けに少しでもなれば嬉しいと思っています。