内容説明
●傑作SQL問題集、爆誕! あなたのアタマを鍛え上げる一冊
本書は、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章の“至高のパズル”であなたをお待ちしています!
目次
表紙
ミックのSQL パズルへようこそ!
本書を読む前に/動作確認環境/サンプルコードのダウンロード/本書情報および正誤表の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 単月売上の算出
あとがき
索引
解答一覧
著者紹介
奥付
感想・レビュー
-
- 和書
- はるを呼ぶ




