どんな記事?
この記事では 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
ここまで来たらほぼ環境完成です!!
上記のリンクにアクセスして...
こんな感じで動いていたら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分で行けると思います!
もし興味があればぜひお試しください!!
リポジトリはこちら