35
29

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-02-04

どんな記事?

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

そもそもSQL100本ノックとは?

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

環境構築

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

手順は以下の通りです

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

①gitをインストールしましょう

入ってない方はgitをインストールしてください

② Dockerをインストールしましょう

以下のリンクよりDockerDesktopをインストールできます

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

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

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

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

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

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

cd 100knocks-preprocess

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

docker-compose up

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

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

3.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分で行けると思います!

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

リポジトリはこちら

35
29
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
35
29

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?