Blog

SQLを考える問題を解いてみよう

はじめに

こんにちは。たかたかと申します。

私は23卒で入社したのですが、社会人一年目ももうすぐ終わりそうな時期に差し掛かっており、時が経つのは早いなぁと思うばかりです。(年齢的には若い筈なのに)

さて、私はジョブローテーション最後の配属先である、サービスインフラチームで活動をしていました。

ここでは、ニフティのシングルサインオンや会員管理データベースなど、ニフティのサービスを裏から支えるシステムの運用に携わりました。(こちらに詳しく書かれている記事があるので、興味がある方は参考にしてみてください)

その中で特定の条件にマッチした会員データを抽出する機会があり、状況に応じてSQLを考えたりする必要がありました。

私は情報系の勉強はしてきたつもりではいましたが、SQL自体あまり触った経験がなく、この際ある程度マスターしてしまおうということで学習をしたりしていました。

こんな感じの事やってました〜というのを、内容を会社的に問題にならないように改変した上で問題形式にしてみたので、皆さんも考えてみてください。

では問題です

問題1

同じ誕生日の人が身近にいると親近感が湧く方ですか?一種の仲間意識が芽生えたりしますか?

ということで、1980-01-01以降の日付で、誕生日毎にカウントを出力するSQLを書いてください。

出力例

テーブル例

person_idnamebirthday
1takeshi1985-04-12
2yumi1990-08-25
3hiroshi1975-11-30
4sachiko1988-03-15
5sacchan1988-03-15
6hamako1988-03-15
7momoko1988-03-15
8kenji1995-07-09
persons テーブル

解答例

余談

COUNT(*)とCOUNT(Primary Key)とCOUNT(1)のどれが一番処理速度が早いかという議論がたまに行われていたりします。調べてみたところ、Primary Keyが良いだったり、どれもそんなに変わらないよと言われていたりします。ケースバイケースかもしれませんが、どれが一番最適なのか考えてみると良いかもしれませんね。

問題2

私はtakeshiさんの誕生日を盛大に祝いたいと考えています。

しかし私はtakeshiさんの食べ物の好みを知らず、このままだと喜んでいただけないでしょう。

そこであなたにはtakeshiさんの好きな食べ物を抽出するSQLの作成をお願いしたいです。

出力例

テーブル例

person_idnamebirthday
1takeshi1985-04-12
2yumi1990-08-25
3hiroshi1975-11-30
4sachiko1988-03-15
5sacchan1988-03-15
6hamako1988-03-15
7momoko1988-03-15
8kenji1995-07-09
persons テーブル
food_idfood_name
1りんご
2ぶどう
3カレー
4おにぎり
foods テーブル
food_idperson_id
11
32
23
14
favorite_foods テーブル

解答例

余談

join句辺りは昔の私には何が何だかよく分からない文法でしたね。

left joinやright joinの内容を理解できず頭を抱えていました。

問題3

会社名と学校名をまとめて表示したいのに、別々のテーブルに保存されています。

schoolsテーブルとcompaniesテーブルのnameを合体させたデータを抽出するSQLを作成してください。

出力例

テーブル例

school_idschool_name
1ooschool
2xxschool
3wwschool
4aaschool
5bbschool
schools テーブル
company_idcompany_name
1xxcompany
2wwcompany
3aacompany
companies テーブル

解答例

余談

union句の存在を知った時、こんなこともできるのかと衝撃が走りましたね。

最後に

いかがでしたでしょうか?

SQLは、抽出方法ならまだしも、速度や可読性などを考え始めるとまた奥の深い世界なのかなぁと思います。

それでは、またどこかで会いましょう!

ニフティでは、
さまざまなプロダクトへ挑戦する
エンジニアを絶賛募集中です!
ご興味のある方は以下の採用サイトより
お気軽にご連絡ください!

ニフティに興味をお持ちの方は
キャリア登録をぜひお願いいたします!

connpassでニフティグループに
参加いただくと
イベントの
お知らせが届きます!