試験公開中

このエントリーをはてなブックマークに追加

ミックの楽しいSQLパズル 解いて身につくSQLの考え方&書き方

インプレス

2,750円 (2,500円+税)

本書は実務に即した練習問題を通じ、SQLの本質を学ぶ一冊です。単なるコードの模写ではなく、自ら手を動かすパズル形式で「SQLを考える力」を鍛えます。ウィンドウ関数やCASE式、再帰など標準SQLを幅広く網羅し、基礎から応用まで段階的に習得可能です

関連サイト

本書の関連ページが用意されています。

内容紹介

●傑作SQL問題集、爆誕! あなたのアタマを鍛え上げる一冊

p>本書は、DB関連書籍で高い評価を得てきたミック氏が、実務で培った知見を凝縮した「新しいSQLパズル(練習問題)」です。単なるサンプルコードをなぞるのではなく、読者自身が手を動かし、考えながら解き進めることで、SQLの本質をつかむことを目指しています。

収録されたパズルは基礎から応用へ段階的にレベルアップし、ウィンドウ関数、結合、CASE式、サブクエリ、再帰など、実務で必須となる標準SQLを幅広く網羅。解答だけでなく、「どう考えるか」「別解だとどう書けるか」といった思考プロセスを丁寧に解説し、複数の書き方を比較することで、より良いSQLを選択する“審美眼”を養えます。

さらに、一部の問題では実行計画にも踏み込み、処理性能の観点から最適な書き方を理解できるよう工夫。初級者から中級者まで、「SQLを考える力」を無理なく、そして着実に鍛えられる一冊です。

【本書のパズル・チラ見せ!】 ■第1章 宣言的言語としてのSQL
パズル1-1 データベースの絶対法則――主キー制約
パズル1-2 上司は誰?――参照整合性制約  ほか

■第2章 SQLの論理
パズル2-1 作業依頼――全称量化①
パズル2-2 自然数列の生成――再帰と構成  ほか

■第3章 SQLの高度な応用
パズル3-1 住所の変遷を追う――再帰とポインタチェイン
パズル3-2 可能な日付の組み合わせ――列の組み合わせ  ほか

■第4章 SQLで数学パズルを解く
パズル4-1 順列――自己非等値結合
パズル4-2 完全数――HAVING句での条件  ほか

■第5章 ウィンドウ関数――SQLで魔法をかける
パズル5-1 移動平均――ウィンドウ関数の基礎
パズル5-2 90%ile 3秒――パーセンタイル  ほか

■第6章 SQLで木構造を扱う
パズル6-1 隣接リストモデル
パズル6-2 入れ子集合モデル  ほか

■第7章 卒業試験
パズル7-1 すべての列についての条件指定――全称量化/存在量化
パズル7-2 ピザ屋の売上――順位による選択  ほか

全7章の“至高のパズル”であなたをお待ちしています!

書誌情報

  • 著者: ミック
  • 発行日: (紙書籍版発行日: 2026-02-20)
  • 最終更新日: 2026-02-20
  • バージョン: 1.0.0
  • ページ数: 384ページ(PDF版換算)
  • 対応フォーマット: PDF, EPUB
  • 出版社: インプレス

対象読者

著者について

ミック

データベース(DB)エンジニアとして20 年以上のキャリアを持ち、BI/DWHなど大量データを扱うシステム構築に精通。リレーショナルデータベースやSQLに関する技術書を多数執筆しており、代表作に『達人に学ぶSQL徹底指南書 第2版』『[改訂新版]SQL実践入門』『SQL 第2版 ゼロからはじめるデータベース操作』などがある。現在は、SIerにて最新技術のトレンド調査に従事。講演・執筆を通じて、初心者から上級者まで幅広くDB 技術の「実務力」を伝えている。

目次

本書を読む前に

  • 動作確認環境
  • サンプルコードのダウンロード
  • 本書情報および正誤表のWeb ページ

第1章 宣言的言語としてのSQL

  • パズル1-1 データベースの絶対法則――主キー制約
  • 問題❶ 主キーとランダムな値
  • パズル1-2 上司は誰?――参照整合性制約
  • 問題❷ 外部キーの設定
  • 問題❸ 自分の上司を特定する
  • パズル1-3 アルファベット――正規表現
  • 問題❹ アルファベットを少なくとも1文字含む
  • 問題❺ アルファベットを1文字も含まない
  • 問題❻ すべてアルファベットの文字列
  • パズル1-4 タバコは20 歳になってから――条件法
  • 問題❼ 20歳未満の喫煙者を探す
  • パズル1-5 都道府県の切り出し――文字列操作
  • 問題❽ 都道府県だけ切り出す

第2章 SQL の論理

  • パズル2-1 作業依頼――全称量化①
  • 問題❾ 工場の作業工程の管理
  • パズル2-2 自然数列の生成――再帰と構成
  • 問題❿ 自然数列を生成
  • 問題⓫ レコードに連番を振る
  • パズル2-3 テーブルのピボット――CASE 式
  • 問題⓬ テーブルのピボットを作る
  • 問題⓭ 続・テーブルのピボット
  • パズル2-4 誕生日が一致しないのは誰だ?――3値論理とNULL の罠
  • 問題⓮ 誕生日の一致する人物を求める
  • 問題⓯ 誕生日の一致しない人物を求める
  • パズル2-5 複数レコードへの条件設定――更新における分岐
  • 問題⓰ 入館証の確認と更新
  • パズル2-6 n 番目の値――レコードの順序
  • 問題⓱ 前からn 番目のレコード
  • 問題⓲ 続・前からn番目のレコード[一般化版]
  • パズル2-7 列方向の最大値/最小値――NULLの回避
  • 問題⓳ 列方向の最大値/最小値[PostgreSQL版]
  • 問題⓴ 列方向の最大値/最小値[他DBMS 対応版]
  • 問題21 列方向の最大値/最小値[引数3個の場合]

第3章 SQL の高度な応用

  • パズル3-1 住所の変遷を追う――再帰とポインタチェイン
  • 問題22 一番昔の住所を求める
  • パズル3-2 可能な日付の組み合わせ――列の組み合わせ
  • 問題23 有意味な組み合わせの作成
  • パズル3-3 重なる期間の結合――特性関数
  • 問題24 連続した勤務期間を求める
  • パズル3-4 期間のコンフリクト検出――境界値トラップ
  • 問題25 予約期間の重複を判定
  • パズル3-5 存在しない組み合わせ――差集合
  • 問題26 アイスクリームのラインナップ
  • パズル3-6 集合の相等性――テーブルのコンペア
  • 問題27 テーブルに違いはあるか?
  • 問題28 どの行が違うか?
  • 問題29 どの行が同じか?
  • パズル3-7 排他的論理和――完全外部結合
  • 問題30 2つのテーブルを統合
  • 問題31 一致しない行を抽出
  • パズル3-8 都市間の経路を求める――再帰共通表式
  • 問題32 都市間の最短経路
  • パズル3-9 相互フォローの検出――INTERSECT
  • 問題33 相互フォロー関係を見つける

第4章 SQL で数学パズルを解く

  • パズル4-1 順列――自己非等値結合
  • 問題34 2 つ選ぶ場合の順列
  • 問題35 3 つ選ぶ場合の順列
  • 問題36 組み合わせ
  • パズル4-2 完全数――HAVING句での条件
  • 問題37 完全数を求める
  • パズル4-3 ナップザック問題――ビットフラグによるフィルタリング
  • 問題38 部分集合の全組み合わせ――行持ちデータの場合
  • 問題39 部分集合の全組み合わせ――列持ちデータの場合
  • パズル4-4 素数――全称量化②
  • 問題40 素数を求める
  • パズル4-5 連番の歯抜けを探す――全単射
  • 問題41 テーブルの歯抜けチェック
  • パズル4-6 連番のカタマリを探す――連続と断絶
  • 問題42 連続する中で最大のシーケンスを探す
  • 問題43 部分的なシーケンスも含めて求める

第5章 ウィンドウ関数――SQL で魔法をかける

  • パズル5-1 移動平均――ウィンドウ関数の基礎
  • 問題44 移動平均を求める
  • 問題45 トレンド分析
  • パズル5-2 90%ile 3秒――パーセンタイル
  • 問題46 レスポンスタイム要件を満たすか
  • パズル5-3 四分位――NTILE関数
  • 問題47 分布を4 つに分ける
  • 問題48 剰余類
  • パズル5-4 中央値――ウィンドウ関数の威力
  • 問題49 体重の中央値
  • パズル5-5 累計――空のウィンドウ関数が持つ意味
  • 問題50 売上の累計
  • 問題51 データと件数を一括で取得する
  • パズル5-6 最頻値――HAVING句の力
  • 問題52 給与の最頻値
  • パズル5-7 列方向の折りたたみ――IGNORE NULLS
  • 問題53 最初に現われる非NULL 値を探す

第6章 SQL で木構造を扱う

  • パズル6-1 隣接リストモデル
  • 問題54 隣接リストモデルの基本――階層の深さ
  • 問題55 上司の抽出(隣接リストモデル)
  • 問題56 リーフノードの抽出(隣接リストモデル)
  • パズル6-2 入れ子集合モデル
  • 問題57 入れ子集合モデルの基本――階層の深さ
  • 問題58 上司の抽出(入れ子集合モデル)
  • 問題59 リーフノードの抽出(入れ子集合モデル)
  • 問題60 ルートノードの抽出(入れ子集合モデル)
  • パズル6-3 経路列挙モデル
  • 問題61 経路列挙モデルの基本――階層の深さ
  • 問題62 上司の抽出(経路列挙モデル)
  • 問題63 リーフノードの抽出(経路列挙モデル)
  • 問題64 ルートノードの抽出(経路列挙モデル)
  • パズル6-4 閉包テーブルモデル
  • 問題65 閉包テーブルモデルの基本――階層の深さ
  • 問題66 上司の抽出(閉包テーブルモデル)
  • 問題67 リーフノードの抽出(閉包テーブルモデル)
  • 問題68 ルートノードの抽出(閉包テーブルモデル)

第7章 卒業試験

  • パズル7-1 すべての列についての条件指定――全称量化/存在量化/問題69 すべての列が条件を満たす行の抽出
  • 問題70 少なくとも1 つの列を満たす条件
  • 問題71 「 ちょうどn個」を満たす条件
  • 問題72 行持ちテーブルでの件指定
  • パズル7-2 ピザ屋の売上――順位による選択/問題73 売上の順位を算出する
  • 問題74 厳密な順位付け
  • パズル7-3 ラベルの読み替え――CASE式の応用/問題75 新しい分類での集計――アドホックな集計キー
  • 問題76 数値範囲での階級化
  • パズル7-4 範囲の重複――次元の拡張/問題77 線分の重複――1次元
  • 問題78 長方形の重複判定――2次元
  • パズル7-5 最小と最大の枝番/問題79 枝番の最小値と最大値
  • パズル7-6 重複行の削除――論理と集合/問題80 誤登録された重複データの削除
  • パズル7-7 累計の逆算――ウィンドウ関数大活躍/問題81 単月売上の算出

あとがき

索引

解答一覧

Home 書籍一覧 ミックの楽しいSQLパズル 解いて身につくSQLの考え方&書き方 ▲ ページトップへ戻る