「電脳少女プログラミング2088 ─壊レタ君を再構築─」SQL編

# はじめに
前回、電脳少女プログラミングを初めてやってみました。
今回はSQL問題に挑戦してみます。SQLは昔学校で学んだ気がしますが、あまり記憶にない...ので、いい機会と思って勉強したいと思います。


# データセンター[Dランク]
まず、問題はこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690695/406c829e-7157-449f-ab7c-d5249c6a18f8.png)

対象のテーブルはこちら。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690695/d8fdebcf-5197-40f6-883f-33ac4677fbbf.png)

SQLにはSELECT文というデータを引き出せるSQL文があるようです。基本形は「SELECT 列名 FROM テーブル名;」で、以下のように対象のテーブルと列を指定したら、無事期待出力と同様の結果を出力できました。

```SQL
SELECT person.id,person.name
From person;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690695/96ec6272-5dbf-4313-80f8-72bd5f04a97f.png)

無事クリア！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690695/beb8a5bc-dee8-475a-96b9-926db2f05624.png)


# 二人が通った教室[Cランク]
続いてCランクの問題に挑戦。
問題はこちらです。テーブルは先ほどの問題と同じでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690695/e2e80fe0-ce20-4fc6-94fa-41b64186fef8.png)

先ほど同様にmemoryのidとtalkを出力してみると、
```SQL
SELECT memory.id,memory.talk
FROM memory
```
10件のみならずすべての会話が出力されました。
```SQL
id	talk
1	アラン、敵の動きを見て！　右から来る！　私たちはここで防衛ラインを固めるんだ。絶対に突破させるな！
2	レベッカ、しっかりして！　 私たちがいる！　あなたは一人じゃない、必ず助けるから。今はただここで耐えて
3	アラン、また会えたね。ここでまた共に戦えることがどれだけ嬉しいか分かる？君がいてくれると心強いよ
4	エリック、修理が間に合わないかもしれない。でも君ならできると信じてる。全力を尽くして、私たちの命運は君にかかってる
5	あぁ……レベッカが…どうしてこんなことに……。あの無茶な指示がなければ、彼女はまだここにいたかもしれない……
6	シャドウレインシティの戦いで、アランと再会。変なやつだけど頼りになる仲間だ。彼がいなければ、私たちはここまでこれなかった
7	アラン、もう戻ってこないんだね…。あの笑顔がもう見れないなんて信じられない。悔しいよ……君が死んだのに、もう私は涙の一滴も出ない
8	エリック、なぜだ…なぜこんなことを…。君が私たちを裏切るなんて信じたくない。いつも笑顔で励ましてくれたのに
9	ドクター・カレン、私はもう終わりなのね？死ぬ前に一つだけお願いがあるの
10	よぉ、レイミ。今日もいい天気だな。このまま俺と二人で戦場を散歩なんてどうだい？
11	この戦闘糧食、コンクリートより硬いんだけど、これが敵を倒す新兵器……？　そんなわけないよね……うぅ……お腹が痛い
12	僕も君たちみたいにサイボーグになりたかったんだ。子どもの頃の儚い夢だったけど。今はこの立場には満足してる。……本当さ
13	サイボーグ以前に、お前らはまず人間としてやり直すべきだな。戦争は地獄だが、お前らがいると地獄より臭くなる！
14	あんたの存在が、私の人生の最大の失敗だ
15	レイミ、無茶しないでね。あなたが倒れたら、仲間が倒れたら、みんなが悲しむんだから
16	ま、アランのつまらない話も、結局みんなで笑い合えるいいネタになるから、アランはアランで役に立ってるんだと思うよ
17	ああ、もう一度確認してくれ。誰のミスだ？　私ではないな？　糞ったれどもが勝手にやったことだろう。そうだろう？　この件は上手く処理するんだ
18	このロボットを君が直したの！？　すごいじゃないか！　僕にも……できるかな？
19	いつかこのスラム街から出たら何がしたい？　いや、こんなに高い場所にいると、すごく自由な気持ちになってさ
20	でも、君がもっとすごいものを作るって言ってたから。そのために僕ももっと成長するんだ
21	まずは、安心して暮らせる場所がほしい。それから、君が言ってたように、みんなが幸せになれる未来を作りたいな
22	お願い、行きたくないよ！　お母さん、助けて…！　……どうして…どうして私が──
23	よく聞け！　今日からお前らは人じゃない。お前らは機械だ！　機械が口答えするか？　しないだろ？　分かったら黙って俺の言う事を聞け！
24	私は君の本質を守るために最善を尽くす。……私はひどい大人だ。結局、これっぽちの反抗しかできないんだから
25	レベッカ、あなたは思い出せる？　大切な人との思い出を。戦争に行くたびにね、少しずつ大事な記憶が消えていくのが分かるの。
```

idの小さい順10件に絞る必要があるため、方法を探したところ、ORDER BYとLIMITでできるようでした。
ORDER BYにてmemory.idを指定し、ASCで昇順を指定。LIMITは上限10件ですね。これを動作確認したところ、

```SQL
SELECT memory.id,memory.talk
FROM memory
ORDER BY memory.id ASC
LIMIT 10;
```

無事10件出力されました。
```SQL
id	talk
1	アラン、敵の動きを見て！　右から来る！　私たちはここで防衛ラインを固めるんだ。絶対に突破させるな！
2	レベッカ、しっかりして！　 私たちがいる！　あなたは一人じゃない、必ず助けるから。今はただここで耐えて
3	アラン、また会えたね。ここでまた共に戦えることがどれだけ嬉しいか分かる？君がいてくれると心強いよ
4	エリック、修理が間に合わないかもしれない。でも君ならできると信じてる。全力を尽くして、私たちの命運は君にかかってる
5	あぁ……レベッカが…どうしてこんなことに……。あの無茶な指示がなければ、彼女はまだここにいたかもしれない……
6	シャドウレインシティの戦いで、アランと再会。変なやつだけど頼りになる仲間だ。彼がいなければ、私たちはここまでこれなかった
7	アラン、もう戻ってこないんだね…。あの笑顔がもう見れないなんて信じられない。悔しいよ……君が死んだのに、もう私は涙の一滴も出ない
8	エリック、なぜだ…なぜこんなことを…。君が私たちを裏切るなんて信じたくない。いつも笑顔で励ましてくれたのに
9	ドクター・カレン、私はもう終わりなのね？死ぬ前に一つだけお願いがあるの
10	よぉ、レイミ。今日もいい天気だな。このまま俺と二人で戦場を散歩なんてどうだい？
```

クリア！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690695/21692bcf-20a5-4689-b5ec-7e2393e5e1f2.png)

# 会員制ジム[Cランク]
続いて同じくCランク問題。少し複雑になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690695/4f45fc46-75d8-4fcb-b069-587179c1c25f.png)

新たに「カテゴリ」テーブルが追加されたようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690695/3d5ce2cb-b582-4b9c-a405-23690fd738cc.png)

JOINでmemory.category_idとcategory.idを関連付けし、WHERE,ANDで条件を指定したところ、
```SQL
SELECT memory.id,memory.talk
FROM memory
JOIN category ON memory.category_id = category.id 
WHERE memory.importance >= 3
AND category.name = "悲しみ"
```
正しい回答を得られました。
```SQL
id	talk
5	あぁ……レベッカが…どうしてこんなことに……。あの無茶な指示がなければ、彼女はまだここにいたかもしれない……
7	アラン、もう戻ってこないんだね…。あの笑顔がもう見れないなんて信じられない。悔しいよ……君が死んだのに、もう私は涙の一滴も出ない
14	あんたの存在が、私の人生の最大の失敗だ
22	お願い、行きたくないよ！　お母さん、助けて…！　……どうして…どうして私が──
25	レベッカ、あなたは思い出せる？　大切な人との思い出を。戦争に行くたびにね、少しずつ大事な記憶が消えていくのが分かるの。
```

クリア！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690695/aa62f1ec-1699-4259-ad04-0d659f92694a.png)

今回はこの辺で終わろうかなと思います。

# おわりに
SQLの基本を学べた気がします。やはりゲーム形式だと精神的ハードルが低く、学習に最適だなと思いました。
より難易度の高い問題も挑みたいところです。