SQL100本ノックの環境構築と少し実践！🐘

## どんな記事？
この記事では **Windows** でSQL100本ノックをするための環境構築と
実際の問題を少し解説した記事です。
ほかにも注意事項などいくつか書いてあります！

## そもそもSQL100本ノックとは？

**データサイエンス初学者のための実践的な学習環境 「データサイエンス100本ノック（構造化データ加工編）」**のことです！
SQLだけでなくPython、Rでもノックが用意されています...！！（すごすぎる）

https://digitalpr.jp/r/39499


## 環境構築
さっそく環境構築していきましょう！

手順は以下の通りです

① gitのインストール
② Dockerのインストール
③ 100本ノックリポジトリをクローン
④ コンテナ作成コマンドを実⾏する


### ①gitをインストールしましょう
入ってない方はgitをインストールしてください

https://git-scm.com/book/ja/v2/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-Git%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

### ② Dockerをインストールしましょう
以下のリンクよりDockerDesktopをインストールできます

https://docs.docker.jp/docker-for-windows/install.html


Dockerの使い方は以下参照ください

https://qiita.com/gold-kou/items/44860fbda1a34a001fc1

### ③ 100本ノックリポジトリをクローンしましょう

ここで①でインストールしたgitが活躍します！🎉

https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess


コマンドプロンプトを開いて以下のコマンドを打ちましょう

```
git clone https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess.git
```

次に以下のコマンドでディレクトリを移動しましょう

```
cd 100knocks-preprocess
```

最後にdockerを立ち上げましょう
（※docker desktopもさきに起動しておきましょう)

```
docker-compose up
```

ここまで来たらほぼ環境完成です！！

http://localhost:8888

上記のリンクにアクセスして...

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/756651/3f8643e8-9279-f16c-7a45-e6f5e0b579f0.png)

こんな感じで動いていたらOKです！！🎉🙌




## 問題解いてみる🔥

### 問題を解く前に..
**preprocess_knock_SQL.ipynb**を開いてください

**/work**/preprocess_knock_SQL.ipynbにあります

開いたら一番最初のセルを実行しましょう！
**ctrl+Enter** か 上の**▷ボタン**で実行できます

うまくデータベースと接続できたら
**Connected: padawan@dsdojo_db**とでます

その下の使い方にも書いてありますが
セルの最初には

```
%%sql
```

と書きましょう！
```#hoge``` などコメントを残すとSyntaxErrorがでます、注意してください


以上で準備完了です！


### 問題 S-001~S-010

すみません、もう1つだけ**注意事項**です！
**SELECT * FROM table** といったSQL文は気を付けてください

今回、ダミーデータがたくさんあるので
すべてのデータを表示しようとすると、**すーーっごく重くなります**

もし間違えて実行してしまったら待つかdockerを再起動しましょう
筆者は何度かやらかしました...(>_<)

それでは..
問題を解いてきます！
(本記事では%%sqlを省略してます)
(**ネタバレ注意**です)

#### S-001
>レシート明細テーブル（receipt）から全項目の先頭10件を表示し、どのようなデータを保有しているか目視で確認せよ。

```
SELECT * FROM receipt LIMIT 10;
```

久々のSQL...

#### S-002
>レシート明細のテーブル（receipt）から売上日（sales_ymd）、顧客ID（customer_id）、商品コード（product_cd）、売上金額（amount）の順に列を指定し、10件表示させよ。

```
SELECT sales_ymd,customer_id,product_cd,amount
FROM receipt
LIMIT 10;
```

少しずつ思い出してきました

#### S-003
>レシート明細のテーブル（receipt）から売上日（sales_ymd）、顧客ID（customer_id）、商品コード（product_cd）、売上金額（amount）の順に列を指定し、10件表示させよ。ただし、sales_ymdはsales_dateに項目名を変更しながら抽出すること。

```
SELECT sales_ymd AS sales_date,customer_id,product_cd,amount
FROM receipt
LIMIT 10;
```

この問題ですが**ASは省略できます**
個人的にはわかりやすいかなとASを書いてますが、実務ではどちらのほうがいいんですかね...

#### S-004
>レシート明細のテーブル（receipt）から売上日（sales_ymd）、顧客ID（customer_id）、商品コード（product_cd）、売上金額（amount）の順に列を指定し、以下の条件を満たすデータを抽出せよ。
顧客ID（customer_id）が"CS018205000001"

```
SELECT sales_ymd,customer_id,product_cd,amount
FROM receipt
WHERE customer_id='CS018205000001';
```

WHEREが出てきました！！(謎テンション)

文字列はダブルクォーテーション(")
シングルクォーテーション(')でくくりましょう！

#### S-005
>レシート明細のテーブル（receipt）から売上日（sales_ymd）、顧客ID（customer_id）、商品コード（product_cd）、売上金額（amount）の順に列を指定し、以下の条件を満たすデータを抽出せよ。

>顧客ID（customer_id）が"CS018205000001"
売上金額（amount）が1,000以上

```
SELECT sales_ymd,customer_id,product_cd,amount
FROM receipt
WHERE customer_id='CS018205000001' AND amount>=1000;
```

解答はANDを小文字にしてました
小文字のほうがいいんですかね？


#### S-006
>レシート明細テーブル（receipt）から売上日（sales_ymd）、顧客ID（customer_id）、商品コード（product_cd）、売上数量（quantity）、売上金額（amount）の順に列を指定し、以下の条件を満たすデータを抽出せよ。

>顧客ID（customer_id）が"CS018205000001"
売上金額（amount）が1,000以上または売上数量（quantity）が5以上

```
SELECT sales_ymd,customer_id,product_cd,quantity,amount
FROM receipt
WHERE customer_id='CS018205000001' AND (amount>=1000 OR quantity>=5);
```

#### S-007
>レシート明細のテーブル（receipt）から売上日（sales_ymd）、顧客ID（customer_id）、商品コード（product_cd）、売上金額（amount）の順に列を指定し、以下の条件を満たすデータを抽出せよ。

>顧客ID（customer_id）が"CS018205000001"
売上金額（amount）が1,000以上2,000以下

```
SELECT sales_ymd,customer_id,product_cd,amount
FROM receipt
WHERE customer_id='CS018205000001' AND (amount BETWEEN 1000 AND 2000);
```
BETWEENの書き方スマートで個人的に好きです

#### S-008
>レシート明細テーブル（receipt）から売上日（sales_ymd）、顧客ID（customer_id）、商品コード（product_cd）、売上金額（amount）の順に列を指定し、以下の条件を満たすデータを抽出せよ。

>顧客ID（customer_id）が"CS018205000001"
商品コード（product_cd）が"P071401019"以外

```
SELECT sales_ymd,customer_id,product_cd,amount
FROM receipt
WHERE customer_id='CS018205000001' AND product_cd!='P071401019';
```

どんどん解いちゃいます！！

#### S-009
>以下の処理において、出力結果を変えずにORをANDに書き換えよ。
>select * from store where not (prefecture_cd = '13' or floor_area > 900)

```
select * from store where prefecture_cd != '13' and  floor_area <= 900
```
OO_cd のcdはcodeの略っぽいです(今更)


#### S-010
>店舗テーブル（store）から、店舗コード（store_cd）が"S14"で始まるものだけ全項目抽出し、10件だけ表示せよ。

```
SELECT *
FROM store
WHERE store_cd LIKE 'S14%'
LIMIT 10;
```

とりあえず10問できた...!!!


## まとめ
### 最高！！！
さくさく動くし、データベースも用意されてあり**大満足**です！！

dockerやgitの環境がある方はcloneとcompose upでいけるので
環境構築は**2~3分**で行けると思います！

もし興味があればぜひお試しください！！

リポジトリはこちら

https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess