はじめに
こんにちは。たかたかと申します。
私は23卒で入社したのですが、社会人一年目ももうすぐ終わりそうな時期に差し掛かっており、時が経つのは早いなぁと思うばかりです。(年齢的には若い筈なのに)
さて、私はジョブローテーション最後の配属先である、サービスインフラチームで活動をしていました。
ここでは、ニフティのシングルサインオンや会員管理データベースなど、ニフティのサービスを裏から支えるシステムの運用に携わりました。(こちらに詳しく書かれている記事があるので、興味がある方は参考にしてみてください)
その中で特定の条件にマッチした会員データを抽出する機会があり、状況に応じてSQLを考えたりする必要がありました。
私は情報系の勉強はしてきたつもりではいましたが、SQL自体あまり触った経験がなく、この際ある程度マスターしてしまおうということで学習をしたりしていました。
こんな感じの事やってました〜というのを、内容を会社的に問題にならないように改変した上で問題形式にしてみたので、皆さんも考えてみてください。
では問題です
問題1
同じ誕生日の人が身近にいると親近感が湧く方ですか?一種の仲間意識が芽生えたりしますか?
ということで、1980-01-01以降の日付で、誕生日毎にカウントを出力するSQLを書いてください。
出力例
1 2 3 4 5 6 |
birthday | count ------------+------- 1988-03-15 | 4 1990-08-25 | 1 1995-07-09 | 1 1985-04-12 | 1 |
テーブル例
person_id | name | birthday |
---|---|---|
1 | takeshi | 1985-04-12 |
2 | yumi | 1990-08-25 |
3 | hiroshi | 1975-11-30 |
4 | sachiko | 1988-03-15 |
5 | sacchan | 1988-03-15 |
6 | hamako | 1988-03-15 |
7 | momoko | 1988-03-15 |
8 | kenji | 1995-07-09 |
解答例
1 2 3 4 5 6 7 8 9 |
SELECT birthday, COUNT(*) as count FROM persons WHERE birthday >= '1980-01-01' GROUP BY birthday; |
余談
COUNT(*)とCOUNT(Primary Key)とCOUNT(1)のどれが一番処理速度が早いかという議論がたまに行われていたりします。調べてみたところ、Primary Keyが良いだったり、どれもそんなに変わらないよと言われていたりします。ケースバイケースかもしれませんが、どれが一番最適なのか考えてみると良いかもしれませんね。
問題2
私はtakeshiさんの誕生日を盛大に祝いたいと考えています。
しかし私はtakeshiさんの食べ物の好みを知らず、このままだと喜んでいただけないでしょう。
そこであなたにはtakeshiさんの好きな食べ物を抽出するSQLの作成をお願いしたいです。
出力例
1 2 3 4 |
person_name | favorite_food -------------+--------------- takeshi | Ramen takeshi | Pizza |
テーブル例
person_id | name | birthday |
---|---|---|
1 | takeshi | 1985-04-12 |
2 | yumi | 1990-08-25 |
3 | hiroshi | 1975-11-30 |
4 | sachiko | 1988-03-15 |
5 | sacchan | 1988-03-15 |
6 | hamako | 1988-03-15 |
7 | momoko | 1988-03-15 |
8 | kenji | 1995-07-09 |
food_id | food_name |
---|---|
1 | りんご |
2 | ぶどう |
3 | カレー |
4 | おにぎり |
food_id | person_id |
---|---|
1 | 1 |
3 | 2 |
2 | 3 |
1 | 4 |
解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 |
SELECT p.name as person_name, f.food_name as favorite_food FROM persons p INNER JOIN favorite_foods ff ON p.person_id = ff.person_id INNER JOIN foods f ON ff.food_id = f.food_id WHERE p.name = 'takeshi'; |
余談
join句辺りは昔の私には何が何だかよく分からない文法でしたね。
left joinやright joinの内容を理解できず頭を抱えていました。
問題3
会社名と学校名をまとめて表示したいのに、別々のテーブルに保存されています。
schoolsテーブルとcompaniesテーブルのnameを合体させたデータを抽出するSQLを作成してください。
出力例
1 2 3 4 5 6 7 8 9 10 11 |
name ----------- xxcompany wwschool wwcompany xxschool bbschool aaschool ooschool aacompany |
テーブル例
school_id | school_name |
---|---|
1 | ooschool |
2 | xxschool |
3 | wwschool |
4 | aaschool |
5 | bbschool |
company_id | company_name |
---|---|
1 | xxcompany |
2 | wwcompany |
3 | aacompany |
解答例
1 2 3 4 5 6 7 8 9 |
SELECT school_name as name FROM schools UNION SELECT company_name as name FROM companies; |
余談
union句の存在を知った時、こんなこともできるのかと衝撃が走りましたね。
最後に
いかがでしたでしょうか?
SQLは、抽出方法ならまだしも、速度や可読性などを考え始めるとまた奥の深い世界なのかなぁと思います。
それでは、またどこかで会いましょう!
ニフティでは、
さまざまなプロダクトへ挑戦する
エンジニアを絶賛募集中です!
ご興味のある方は以下の採用サイトより
お気軽にご連絡ください!
Tech TalkやMeetUpも開催しております!
こちらもお気軽にご応募ください!
connpassでニフティグループに
参加いただくと
イベントの
お知らせが届きます!