Skip to content
Playground

演習: 結合

bookstore データベースで練習します。最初に USE bookstore; で切り替えてください。

5-a. 書籍とカテゴリ名を結合する

Section titled “5-a. 書籍とカテゴリ名を結合する”

漫画コーナーの棚卸しのため、漫画カテゴリの書籍一覧をカテゴリ名付きで出力します。bookscategories を結合し、categories.name が「漫画」の書籍について、タイトル、価格、カテゴリ名を、価格の安い順、同じ価格の中では書籍 ID の昇順に表示してください。カテゴリ名のカラム名は category_name とします。

期待される結果:

titlepricecategory_name
DRAGON BALL 1420漫画
ONE PIECE 1440漫画
ONE PIECE 2440漫画
進撃の巨人 1550漫画
ヒント

JOIN ... ON 結合条件 で 2 つのテーブルを結合します。JOININNER JOIN の省略形で、両方に一致する行だけを返します。AS でテーブルに別名を付けると SQL が読みやすくなります。

高額書籍の著者を確認します。booksauthors を結合し、価格が 3000 円以上の書籍について、タイトル、著者名、価格を、価格の高い順、同じ価格の中では書籍 ID の昇順に表示してください。著者名のカラム名は author_name とします。

期待される結果:

titleauthor_nameprice
SRE サイトリライアビリティエンジニアリングベッツィ・ベイヤー5280
データ指向アプリケーションデザインマーティン・クレップマン5060
リファクタリング(第2版)マーチン・ファウラー4840
Googleのソフトウェアエンジニアリングタイタス・ウィンタース4840
プログラミング言語Goアラン・ドノバン4180
Clean Codeロバート・C・マーティン4104
ファインマン物理学 I 力学リチャード・P・ファインマン3740
達人プログラマー(第2版)アンドリュー・ハント3520
人月の神話 新装版フレデリック・P・ブルックス Jr.3520
ヒント

書籍の author_id と著者の idON で結びます。外部キーと主キーの結合の典型例です。

技術書カテゴリの高額書籍カタログを作成します。booksauthorscategories の 3 テーブルを結合し、カテゴリが「技術書」で価格が 4000 円以上の書籍について、タイトル、著者名、カテゴリ名、価格を、価格の高い順、同じ価格の中では書籍 ID の昇順に表示してください。著者名のカラム名は author_name、カテゴリ名のカラム名は category_name とします。

期待される結果:

titleauthor_namecategory_nameprice
SRE サイトリライアビリティエンジニアリングベッツィ・ベイヤー技術書5280
データ指向アプリケーションデザインマーティン・クレップマン技術書5060
リファクタリング(第2版)マーチン・ファウラー技術書4840
Googleのソフトウェアエンジニアリングタイタス・ウィンタース技術書4840
プログラミング言語Goアラン・ドノバン技術書4180
Clean Codeロバート・C・マーティン技術書4104
ヒント

JOIN は 3 つ以上のテーブルに対しても連鎖できます。FROM 表1 JOIN 表2 ON ... JOIN 表3 ON ... の形で左から結合を積み重ねます。

5-d. 販売実績のない書籍を調べる

Section titled “5-d. 販売実績のない書籍を調べる”

長期在庫の洗い出しのため、販売実績のない書籍を特定します。bookssalesLEFT JOIN で結合し、sales 側にレコードが存在しない書籍のタイトルと価格を、価格の高い順に表示してください。

期待される結果:

titleprice
SRE サイトリライアビリティエンジニアリング5280
データ指向アプリケーションデザイン5060
Googleのソフトウェアエンジニアリング4840
ファインマン物理学 I 力学3740
ヒント

LEFT JOIN は左側のテーブルの全行を残し、右側に一致がなければ右側の列を NULL で埋めます。WHERE で右側列が IS NULL の行を選ぶと、右側に一致しなかった行(販売記録のない書籍)が得られます。

5-e. 書籍ごとの販売数を集計する

Section titled “5-e. 書籍ごとの販売数を集計する”

売れ筋ランキングを作成します。bookssales を結合し、書籍ごとの販売数量の合計を、合計数量の多い順、同数の場合は書籍 ID の昇順に上位 10 件表示してください。タイトルと合計数量のカラム名を total_qty とします。

期待される結果:

titletotal_qty
サピエンス全史 下16
ハリー・ポッターとアズカバンの囚人15
ノルウェイの森 上14
ハリー・ポッターと賢者の石14
幸せになる勇気14
海辺のカフカ 上12
LIFE SHIFT12
嫌われる勇気12
容疑者Xの献身11
白夜行11
ヒント

JOIN してから GROUP BY で書籍単位にまとめ、SUM(s.quantity) で合計数量を算出します。GROUP BY には SELECT 句で使う非集計列を書きます。上位 N 件の取り出しは ORDER BY ... LIMIT N です。

5-f. 特定顧客の購入履歴を調べる

Section titled “5-f. 特定顧客の購入履歴を調べる”

顧客からの問い合わせに対応するため、customerssalesbooks の 3 テーブルを結合し、顧客「田中 健」の購入履歴を、購入日時の古い順に表示してください。書籍タイトル、数量、合計金額、購入日時を出力します。

期待される結果:

titlequantitytotal_pricesold_at
ONE PIECE 214402024-04-25 11:20:00
容疑者Xの献身18582024-08-10 15:50:00
リファクタリング(第2版)296802024-08-16 16:30:00
銃・病原菌・鉄 上112102024-10-11 09:10:00
ガリレオの苦悩18252024-11-09 11:45:00
海辺のカフカ 下111002025-01-08 10:00:00
ヒント

customers → sales → books と中間テーブル(sales)を介して 3 テーブルを連鎖結合します。WHERE で顧客を絞り込みます。

5-g. カテゴリ別の売上金額を集計する

Section titled “5-g. カテゴリ別の売上金額を集計する”

カテゴリごとの売上構成を分析します。salesbookscategories の 3 テーブルを結合し、カテゴリごとの売上金額の合計を、売上金額の多い順に表示してください。カテゴリ名と売上金額合計のカラム名を category_name, total_revenue とします。

期待される結果:

category_nametotal_revenue
文学118096
ビジネス115990
技術書114756
児童書97680
自己啓発81114
歴史75526
漫画18500
ヒント

販売記録 sales に書籍情報 (books) を介してカテゴリ (categories) を対応付け、カテゴリごとに SUM(s.total_price) を求めます。

5-h. 都道府県別の売上件数を集計する

Section titled “5-h. 都道府県別の売上件数を集計する”

都道府県別の販売活動の規模を把握します。salescustomers を結合し、都道府県ごとの売上件数を、件数の多い順、同数の場合は都道府県名の昇順に表示してください。件数のカラム名は sales_count とします。

期待される結果:

prefecturesales_count
東京都93
神奈川県38
大阪府37
兵庫県16
愛知県15
京都府13
福岡県11
広島県9
千葉県8
宮城県7
北海道3
埼玉県3
ヒント

sales × customers で販売記録と顧客の居住地を紐付け、GROUP BY c.prefecture でまとめて COUNT(*) を求めます。

5-i. 書籍を多く持つ著者を調べる

Section titled “5-i. 書籍を多く持つ著者を調べる”

複数作品を持つ著者を特定します。booksauthors を結合し、書籍を 2 冊以上登録している著者について、著者名と書籍数を、書籍数の多い順、同数の場合は著者 ID の昇順に表示してください。著者名のカラム名は author_name、書籍数のカラム名は book_count とします。

期待される結果:

author_namebook_count
村上春樹5
東野圭吾3
J.K.ローリング3
ユヴァル・ノア・ハラリ3
夏目漱石2
伊坂幸太郎2
ヘミングウェイ2
アガサ・クリスティー2
ピーター・ドラッカー2
稲盛和夫2
岸見一郎2
ジャレド・ダイアモンド2
塩野七生2
尾田栄一郎2
ヒント

著者ごとに書籍をグループ化し、HAVING でグループの件数を絞り込みます。WHERE は結合前の行単位の絞り込み、HAVING は集計後のグループ単位の絞り込み。

ロイヤルティプログラムの対象として、購入金額の多い顧客を特定します。salescustomers を結合し、合計購入金額の多い上位 10 名について、顧客 ID、名前、購入回数、合計金額を、合計金額の多い順、同額の場合は顧客 ID の昇順に表示してください。購入回数のカラム名は purchase_count、合計金額のカラム名は total_amount とします。

期待される結果:

idnamepurchase_counttotal_amount
5伊藤 優奈1339336
15井上 千尋932204
22橋本 涼726268
8中村 拓海624794
29石井 さくら623364
20森 健太郎722990
30坂本 健司1022926
31遠藤 美香720042
40野村 雄介718898
33藤井 智子918359
ヒント

JOIN + GROUP BY + 複数集計 + ORDER BY + LIMIT の総合問題です。COUNT(*) で購入回数、SUM(s.total_price) で合計金額を同時に算出します。