SQL 練習 ドリル 2 ~高度で複雑な SQL に挑戦|研修コースに参加してみた

今回参加したコースは SQL 練習 ドリル 2 ~高度で複雑な SQL に挑戦 です。
以前にもレポートした SQL 練習ドリルの続編です!
SQL の書き方をある程度、わかった / 出来るようになったとして、現場で開発・運用されているエンタープライズなアプリケーションになった途端、複雑な条件での JOIN (LEFT / RGHT の違いや INNER JOIN ) や副問合せ、集合関数などに加え、 UNION なども時々必要とされます。
この練習ドリル 2 では、そういった現場で出てきそうな、またできそうで出来ない問題にレベルアップして、 3 時間集中してクエリを書き続けます。読者のあなたもぜひ腕試ししてみませんか?
では、どのような内容だったのか、レポートします!
もくじ
コース情報
想定している受講者 | データベース、 SQL をひと通り学んでおり、特に結合、副問合せ、グループ化、集計について理解していること |
---|---|
受講目標 |
|
講師紹介
この「参加してみた」レポートでは初登場となる 宮崎 克也 さんが登壇されました!

携帯電話や政府系金融機関の関連企業でシステムエンジニア・システムコンサルタントを経験。独立後、 IT コンサルティングの傍ら、セミナー講師としても活躍。
豊富な講師経験をもとに、 IT 知識ゼロの新入社員からベテランまで、研修中の疑問を探り出し、解決に導く懇切丁寧なレクチャーで人気。
今後 SQL に関連するコースでの登壇が増えるそうなので、お楽しみに!
演習環境
今回の演習環境は MySQL 8.0 で、 SQL クライアントは GUI で操作できる A5:SQL Mk-2 をお好みで使うという環境でした。「エー・ゴ」でおなじみのツールですね。
なお、上記の環境はクラウド上に用意され、受講者はリモートから接続するだけで演習できるようになっています。
A5:SQL Mk-2 では、画面左にデータベースとテーブルがツリー状に表示されます。そこからテーブルを選んで、内容を表示することができます。そして、画面右に SQL のクエリを書いて実行すると、結果が表示されます。

使用するテーブル
用意された環境では、すでにテーブルが CREATE されていました。カラムまでは載せていませんので、あまり参考にならないかも知れませんが、念のため。


レベル 1 基本の確認
では演習に突入しましょう。
このレポートでは、合計 22 問ある演習問題の中からピックアップして紹介します。全問挑戦したい方は、ぜひコースにご参加ください!
なお、出題時の都合で問題番号は前後します。 ご了承ください。
問題 1-9
特になし
解答と解説
SELECT publish, AVG(price)
FROM books
GROUP BY publish;
-
解説
- GRUOP BY の基本どおり
- グループ化する列( publish )と集計列( price )をはっきりさせる
問題 2-2
「まったく売れていない商品」についても取り出すには、外部結合を利用する
解答と解説
SELECT p.p_name, SUM(o.quantity), SUM(p.price * o.quantity)
FROM order_desc AS o RIGHT JOIN product AS p
ON p.p_id = o.p_id
GROUP BY p.p_id, p.p_name ORDER BY SUM(p.price * o.quantity) DESC;
-
解説
- 「まったく売れていない商品」についても取り出すには、外部結合を利用する
- ここでは RIGHT JOIN (右外部結合)を使っている
- 全件表示したいテーブルがどちらなのか というと product テーブル
- ちなみに、左外部結合でも書ける
- 累計購入額も求める
- GROUP BY して集計関数
- SUM(p.price * o.quantity)
- GROUP BY では別名を使っているが、 ORDER BY には別名を使っていないので、 SELECT の列名に同じものを書いている
レベル 2 関数、結合など
問題 1-11
文字列連結のための関数、および日時の書式整形のための関数を利用する
解答と解説
SELECT CONCAT('ISBN', isbn) AS ISBNコード, title AS 書名,
DATE_FORMAT(publish_date, '%Y年%m月%d日') AS 刊行日
FROM books;
-
解説
- 日時の整形
- 取り出した文字列で足りなくて足すことはよくある
- 文字列を足すのは CONCAT
- 日付の書式整形は DATE_FORMAT 関数
%
は%Y
%m
%d
で年月日の埋め込みを表す
- データベース製品ごとに、関数や使用方法が異なる場合があるので注意
問題 1-13
列の値によって条件分岐を行う演算子を用いる
解答と解説
SELECT referer, count(*) AS カウント数,
CASE
WHEN count(*) >= 50 THEN 'A'
WHEN count(*) >= 10 THEN 'B'
ELSE 'C'
END AS ランク
FROM access_log
GROUP BY referer;
-
解説
- CASE 演算子で条件分岐する
- WHEN で各条件と対応する値を記述し、その他の条件の値は ELSE に記述する
- CASE 全体に AS で名前をつけることもできる
問題 2-5-prac1
副問合せを用いる
解答と解説
SELECT answer1, answer2
FROM quest
WHERE age >
(SELECT AVG(age) FROM quest)
ORDER BY answer1 ASC;
-
解説
- 「回答者の平均年齢を超えている人の回答」を副問合せにする
- age と回答者の平均年齢(副問合せ)を比較
>
で比較するので、副問合せは単一の値だけが返る SQL 文を記述する- 副問合せを思いつくのは難しいかもしれない
- どれだけ引き出しを持っているかが、すばやく SQL を書けることにつながる
レベル3 総合・副問合せなど
問題 2-3
自己結合を利用する
解答と解説
SELECT cc.c_title, cn.c_title
FROM contents AS cc
INNER JOIN contents AS cn
ON cc.next_id = cn.c_id
ORDER BY cc.c_id ASC;
-
解説
- 自己結合
- ふだんあまり使わないテクニックだが、たまにある
- 自分の分身と結合するようなもの
- ただし書き方は通常の結合と同じ
- どちらも同じテーブルなので、別名をつけないといけない
問題 2-4
結合は 3 つ以上のテーブルでも可能
解答と解説
SELECT b.title, a.name, b.publish_date
FROM
( books AS b
INNER JOIN author_books AS ab
ON b.isbn = ab.isbn )
INNER JOIN author AS a
ON ab.author_id = a.author_id
WHERE b.publish = '日経BP'
ORDER BY b.publish_date DESC;
-
解説
- 3 つ以上のテーブルの結合
- 3 つ以上もできるということは知っていても、それをスムーズに書けるかどうかはまた別
- JOIN の入れ子
- 丸カッコで 1 つめの結合
- その結合した結果に対してさらに INNER JOIN
- なお、この例では両方 INNER JOIN だが、 INNER JOIN と LEFT JOIN でもよい
問題 2-6
等号 (和集合)を利用する
解答と解説
SELECT u.l_name_kana, u.f_name_kana
FROM usr AS u
UNION
SELECT e.l_name_kana, e.f_name_kana
FROM employee AS e
ORDER BY 1, 2;
-
解説
- UNION や UNION ALL による和集合は、ふだん多用はしないが、たまに出てくる
まとめ
SQL 練習ドリル 2 ということで、高度で複雑な問題に取り組みましたが、手応えはいかがでしたか?
私は「まずはどのテーブルを使うのか、不足しているテーブルは何か、次に条件は … 」と考えているうちに、頭が混乱してきました。プログラミングのアルゴリズムのように処理の順番を考える訓練に、とってもふさわしい内容でした!
宮崎さんがおっしゃっていたように、アルゴリズムのように、手順に慣れて、引き出しを増やせられれば、いろいろなパターンに対応できそうですね。
また、実務で遭遇する、昔からあるデータベースは、そんなに綺麗なものではないとのこと。大量のデータが多数のテーブルに入って、リレーションも複雑で、不整形なデータもあったりするようです。
そんなデータベースに出会っても、たじろぐことないように、今回のコースよりもさらに高度で複雑な SQL のコースも企画中とのことでした!
それまでに私も練習ドリル 2 を復習しておきます!
label SEカレッジを詳しく知りたいという方はこちらから !!

IT専門の定額制研修 月額28,000円 ~/ 1社 で IT研修 制度を導入できます。
年間 670 コースをほぼ毎日開催中!!

SEプラスにしかないコンテンツや、研修サービスの運営情報を発信しています。