「基本がわかる」をテーマに、
SQL&データベースの基礎から、やさしくスタート!
そして、「SQLでどんなことができるのか」「どんなときに便利なのか」「なぜそんなしくみになっているのか」について、一つ一つステップアップしながら解説します。
本書の特徴は、文法の背景にある「設計」を丁寧に扱っている点です。SQL学習時の頻出ケースである、思ったように操作できない…… この書き方のどこが便利なのか実感が湧かない……、そんなとき、設計について少しでも知ってることが大きな力になります。
想定環境はMySQLを主軸にMariaDB、PostgreSQLとメジャーなOSS(オープンソース)製品に対応し、サポートサイトのサンプルを活用して試しながら学ぶことも可能。広くデータベース利用者の方々に向けて、長く役立つ技術知識を凝縮してお届けします。
## 本書について ……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とインデックスの処理速度