基本がわかるSQL入門
――データベース&設計の基礎から楽しく学ぶ

書籍の概要

この本の概要

「基本がわかる」をテーマに,
SQL&データベースの基礎から,やさしくスタート!

そして,「SQLでどんなことができるのか」「どんなときに便利なのか」「なぜそんなしくみになっているのか」について,一つ一つステップアップしながら解説します。

本書の特徴は,文法の背景にある「設計」を丁寧に扱っている点です。SQL学習時の頻出ケースである,思ったように操作できない…… この書き方のどこが便利なのか実感が湧かない……,そんなとき,設計について少しでも知ってることが大きな力になります。

想定環境はMySQLを主軸にMariaDB,PostgreSQLとメジャーなOSS(オープンソース)製品に対応し,サポートサイトのサンプルを活用して試しながら学ぶことも可能。広くデータベース利用者の方々に向けて,長く役立つ技術知識を凝縮してお届けします。

こんな方におすすめ

  • これからSQL&データベースについて学ぶ方々
  • データベース利用者の方々

本書の動作確認環境について

本書掲載のSQL文は,以下のデータベース管理システム(ソフトウェア)を使用して動作確認を行いました。サンプルデータによる実行結果は,MySQLによるものを掲載しています。

  • MySQL 8.0.21(一部の例を除き,5.7でも実行可能)
  • MariaDB 10.4
  • PostgreSQL 12.4

上記はいずれも無償で入手できます。それぞれ,ビジネスの現場でも広く利用されており,Linux,Windows,macOSにも対応しています(本書のサポートページから辿れるURLにて,Linux/Windows/macOSにおける環境構築について補足解説を参照できます)。

本書のサンプル

本書の紙面イメージは次のとおりです。画像をクリックすることで拡大して確認することができます。

サンプル画像1

サンプル画像2

サンプル画像3

サンプル画像4

サンプル画像5

目次

本書について ……SQLって何だろう? どのように学ぶ?

本書の構成

本書の動作確認環境

本書の補足情報について

第1章 SQL&DBの基礎知識 ……SQLって何だろう?

1.1 データベース用の言語「SQL」 ……まずはどんな姿か見てみよう

  • データを管理する「テーブル」
  • SELECT文の構造
  • 複数のテーブルからデータを取得する
  • 新しい列を作って表示する
  • なぜ複数のテーブルに分かれているのか

1.2 DBMSの基本機能 ……データベース管理システムの役割って何?

  • データ操作機能
  • 同時実行制御
  • トランザクション管理
  • 機密保護
  • 障害回復

1.3 RDBの特徴 ……リレーショナルデータベースってどんなDB?

  • 常に「表」で考える
  • 一意性制約と参照制約
  • RDBと3層スキーマ

第2章 SQL初級編 ……実際に書いて試してみよう

2.1 SQLの種類と基本的な書式 ……書き方のルールを確認しよう

  • 標準SQLとSQLの方言
  • SQLの5つの記述ルール
  • ❶各単語は半角スペースまたは改行で区切り,文末には「;」を付ける
  • ❷キーワードは大文字でも小文字でもよい
  • ❸テーブル名や列名には(原則として)半角英数字と「_」を使う
  • ❹文字列や日付は「'〜'」で囲む
  • ❺コメントは「--」の後ろか,「/*」と「*/」の間に書く

2.2 テーブルの作成と削除 ……CREATE TABLE,DROP TABLE

  • テーブルの作成 CREATE TABLE
  • テーブルの削除 DROP TABLE

2.3 参照制約(外部キー)の設定 ……FOREIGN KEY,REFERENCES

  • 外部キーがあるテーブルにデータを登録する

2.4 データの追加 ……INSERT INTO

2.5 データの変更 ……UPDATE

  • 更新できないデータが含まれていた場合

2.6 データの削除 ……DELETE

  • 参照されているデータの削除

2.7 データの問い合わせ ……SELECT

  • テーブルを表示する 問い合わせ❶
  • データを並べ替える 問い合わせ❷
  • データを集計する 問い合わせ❸
  • 集計結果で並べ替える 集計補足❶
  • 別の列名で表示する 集計補足❷
  • テーブルを結合する 問い合わせ❹
  • 結合した結果を絞り込む,並べ替える 結合補足❶
  • 結合した結果を集計する 結合補足❷

2.8 ビューの作成と削除 ……CREATE VIEW/DROP VIEW

  • ビューの作成
  • ビューの削除

2.9 バッカス記法(BNF) ……読めると便利! マニュアルの書式

第3章 CREATE TABLE詳細 ……テーブルではどんなことを定義できるのか

3.1 実表と導出表 ……SELECTできる2つの「表」

  • テーブルとビューの定義

3.2 「列」(カラム)の設定 ……どんなデータを保存したいか考えよう

  • データの「型」とは何か
  • 列の初期値 DEFAULT句
  • 登録できる値の制限 CHECK制約
  • 文字列/数値/日付時刻以外のデータ型
  • ドメイン(定義域)とは何か

3.3 特別な値「NULL」 ……わからない値だって保存したい

  • NULLの禁止

3.4 キー(識別子) ……PRIMARY KEY,UNIQUE,NOT NULL

  • 主キーと候補キー
  • 主キーとそのほかの候補キーの宣言
  • 複合キーの宣言

3.5 参照制約(外部キー) ……FOREIGN KEY,REFERENCES

  • 参照制約(外部キー)の宣言
  • キーの値を変更したらどうなるか

3.6 テーブル定義の変更 ……ALTER TABLE

  • 列と制約の追加
  • 列と制約の変更/削除
  • 参照制約(外部キー制約)の追加と削除

3.7 インデックスの作成と削除 ……CREATE INDEX,DROP INDEX

  • インデックスの作成
  • インデックスの削除
  • インデックスと更新速度

第4章 正規化 ……RDBにとっての「正しい形」とは

4.1 正規化の目的 ……すべては正しいデータを保つため

  • 正規化で防ぎたい「更新不整合」とは
  • スタートは第1正規形,最初のゴールは第3正規形

4.2 テーブルの構造は列×行のみ ……第1正規形と繰り返し項目の排除

  • 導出項目の排除
  • 繰り返し項目の排除

4.3 テーブルの列は主キーと主キーで決定する項目のみ ……第2正規形,第3正規形,ボイスコッド正規形

  • 無損失分解
  • 部分関数従属を取り除く 第2正規形
  • 推移的関数従属を取り除く 第3正規形
  • ボイスコッド正規形 BCNF
  • ボイスコッド正規形までのまとめ

4.4 多値従属性と結合従属性 ……第4正規形,第5正規形

  • 多値従属性
  • 結合従属性

4.5 このほかの正規形 ……ドメインキー正規形,第6正規形

  • ドメイン制約に着目する「ドメインキー正規形」
  • 識別子から決定できる値を1つまでにする「第6正規形」

第5章 ER図 ……「モノ」と「関係」を図にしてみよう

5.1 データモデリング技法「ERモデル」 ……データベース設計でどう使う?

  • ERモデルと関係モデル
  • データベースへの「写像」
  • エンティティは「テーブル」になる
  • リレーションシップは「参照制約」になる
  • 参照される側は「1」にする

5.2 ER図 ……箱と箱を結ぶ線のルール

  • さまざまな図法
  • ER図を読み解く3つのポイント
    • ❶エンティティと属性の表記
    • ❷主キーと外部キーの表記
    • ❸ カーディナリティの表記
  • モデリングツール

5.3 カーディナリティの検討 ……参照できる形に整えよう

  • 1対多の場合
  • 1対多は「親子関係」か「参照関係」を表している
  • 多対多の場合
  • 多対1の場合
  • 1対1の場合
  • 1対1の意味を考える
  • 1対1の外部キー

5.4 識別子(キー)の検討 ……本当にその識別子で大丈夫?

  • 使われていない識別子は存在しないか
  • 識別子に複合キーが潜んでいないか
  • 存在しない識別子を使っていないか

5.5 スーパータイプとサブタイプ ……区分コードを見つけたら考えよう

  • is-aの関係になっているか
  • orの関係になっているか
  • どちらでテーブルを作るか

第6章 データ操作 ……データを自在にSELECTしよう

6.1 SELECTの基礎構文 ……必要なデータを取り出す,重複を取り除く

  • 列の指定,列の連結と計算,別名 SELECT句,AS,CONCAT,||
  • 重複の除去 DISTINCT
  • 行の指定(絞り込み) WHERE句
  • 条件を組み合わせる AND,OR,NOT
  • 並び順を変える ORDER BY
  • 行数の指定 LIMIT(MySQL/MariaDB/PostgreSQL)

6.2 関数と演算子 ……値の比較,計算,パターンマッチング

  • 大小の比較と数値の計算 = < >  > <  >= <= + - * /
  • NULLの判定 IS NULL,IS NOT NULL
  • 範囲の指定 BETWEEN
  • いずれかの値に当てはまるか IN
  • あいまい検索 LIKE
  • 正規表現による検索 SIMILAR TO,REGEXP,~演算子
  • 文字列の演算子とおもな関数
  • 日付時刻の演算子とおもな関数
  • NULLの変換 NULLIF,COALESCE

6.3 結合(JOIN) ……複数のテーブルを組み合わせる

  • クロス結合 CROSS JOIN
  • 内部結合 INNER JOIN(JOIN)
  • 外部結合 LEFT OUTER JOIN,RIGHT OUTER JOIN,FULL OUTER JOIN
  • 自己結合 同じテーブルでの結合
  • 等価結合時の列指定 USING()
  • 自然結合 NATURAL JOIN
  • 2つより多いテーブルの結合
  • 複数の列によるJOIN

6.4 NULLとUNKNOWN ……わからない値をどう扱う?

  • TRUE/FALSE/UNKNOWNによる論理演算
  • TRUEとFALSEのみで判定する IS演算子

6.5 集約関数 ……データのグループ化と集計

  • 集約関数 COUNT,AVG,SUM,MAX,MIN
  • 複数の列でグループ化する GROUP BY
  • 小計と合計を付ける ROLLUP
  • GROUP BY使用時のSELECT句 GROUP BY
  • 集約結果で絞り込む HAVING,WHERE
  • 列の一部の値で集計する GROUP BY,SUBSTRING()
  • 列ごとに異なる条件で集計する CASE,GROUP BY

6.6 テーブルの連結(UNION) ……データを「縦」につなげたい

  • SELECT結果の連結 UNION,UNION ALL
  • 列の数や型を調整するには

6.7 CASE式 ……SELECT文で場所分け(条件分岐)

  • 値を置き換える 単純CASE式
  • 値ごとに式を書く 検索CASE式
  • WHERE句で使用する列の優先順位を決める 検索CASE式(WHERE句)
  • 任意の値で区切ってカウントする 検索CASE式(SELECT句)

6.8 サブクエリー ……SELECT文とSELECT文を組み合わせる

  • SELECT文の結果を使って絞り込む サブクエリー(WHERE句)
  • 各行に対してSELECT文を実行する 相関サブクエリー
  • 列の値をSELECT文で作る SELECT句のサブクエリー
  • 複数の値で絞り込む IN,NOT IN
  • 複数の値と比較する ALL,SOME,ANY
  • サブクエリーとNULL
  • 存在しているかどうかを調べる EXISTS,NOT EXISTS

6.9 ウィンドウ関数 ……データを区切って集計,順位付けする

  • ウィンドウ関数の基本 無名ウィンドウ,名前付きウィンドウ
  • どう区切るのかを決める,連番を付ける PARTITION BY,ORDER BY,ROW_NUMBER()
  • 全体の集計を行う PARTITION BYを使わないウィンドウ関数
  • 区画別の集計とランキング RANK,DENSE_RANK,ORDER BY
  • 区画内の行の位置を指定する LAG,LEAD,FIRST_VALUE,LAST_VALUE,NTH_VALUE
  • 直前の値と同じだったらスペースにする LAG,CASE,名前付きウィンドウ

6.10 データの更新 ……クエリーを使って更新しよう

  • INSERTとSELECTによる一括登録
  • ほかのテーブルの値を使って更新対象を指定する
  • ほかのテーブルの値を使って更新する

6.11 [補講]関係演算 ……集合論から見たSQL

  • 和 UNION,UNION ALL
  • 差 EXCEPT,EXCEPT ALL,NOT EXISTS,OUTER JOIN
  • 共通 INTERSECT,INTERSECT ALL,INNER JOIN
  • 直積 CROSS JOIN
  • 関係演算で追加された演算
  • 選択 WHERE
  • 射影 SELECT
  • 結合 JOIN
  • 商 サブクエリー

第7章 ケーススタディー ……データベース設計&SELECT文の組み立て方

7.1 フクロウ塾のデータベース設計 ……ER図,フィールド&書式,DBに持たせるルール

  • 氏名フィールドの検討と文字列の書式
  • 氏名に常にスペースを入れたい場合のCHECK制約
  • マスターを追加すべきか検討する コースの再検討❶
  • 複合キーで選択可能なコースを制限する コースの再検討❷
  • データベースでルールを管理するかを検討する コースの再検討❸
  • データベースで管理する場合 コースの再検討❸-[A]
  • データベースでは管理しない場合 コースの再検討❸-[B]

7.2 データ抽出のバリエーション ……サブクエリーとウィンドウ関数の活用

  • 最高得点者のリスト サブクエリーの場合
  • 最高得点者のリスト ウィンドウ関数の場合
  • 内部結合と外部結合の検討 難易度別コースの最高得点❶
  • 最高得点の確認 難易度別コースの最高得点❷
  • 氏名の取得 難易度別コースの最高得点❸
  • 最高得点者のリスト完成 難易度別コースの最高得点❹
  • 前回の記録との比較 前回よりも10点以上点数が下がった
  • 同じ中学校に通っている生徒
  • 複数の子が通っている中学校のリスト
  • 同じ中学校で別の校舎に通っている生徒のリスト

索引

構文索引

Column

  • クラウドで利用できるおもなデータベース
  • 識別子に使用可能な文字
  • DBMSのキーワード ……予約語
  • トランザクションの活用 ……START TRANSACTION,ROLLBACK,COMMIT
  • SQLによる「権限」の設定 ……GRANT,REVOKE
  • 更新可能なビュー
  • NULLとCHECK制約
  • データベースはSQLだけじゃない?! ……NoSQLの基礎知識
  • SQLの「実行計画」とは
  • 関係モデルの基礎用語 リレーションとリレーションシップ
  • 2種類のエンティティ イベント,リソース
  • 新しいエンティティの意味
  • 正規形とER図
  • 新しい識別子
  • SELECT文の評価順序
  • JOIN,WHERE,ORDER BYとインデックスの処理速度

著者プロフィール

西村めぐみ(にしむらめぐみ)

1990年代,生産管理ソフトウェアの開発およびサポート業務/セミナー講師を担当。その後,書籍および雑誌での執筆,PCおよびMicrosoft Officeのeラーニング教材作成/指導,新人教育にも携わる。おもな著書は『図解でわかるLinuxのすべて』(日本実業出版社),『シェルの基本テクニック』(IDGジャパン),『[新版 zsh&bash対応]macOS×コマンド入門 ──ターミナルとコマンドライン,基本の力』(技術評論社)など。