1. SQLの仕様
1.1 クエリの実行順序
SQLの作成順序:
select 項目リスト
from テーブル名リスト
join on テーブル間の関連
where 条件リスト
group by グループ化する項目リスト
having グループ化後の条件リスト
order by ソートする項目リスト
limit ページングパラメータ
SQLの実行順序:
from テーブル名リスト
join on テーブル間の関連
where 条件リスト
group by グループ化する項目リスト
having グループ化後の条件リスト
select 項目リスト
order by ソートする項目リスト
limit ページングパラメータ
1.2 テーブル間のクエリ
テーブル間の関係:
- **1対多**:多側に外部キーを設定し、1側の主キーと関連付ける。
- **1対1**:テーブルの構造を分割するために使用し、片方のテーブルに外部キーを設定する。
- **多対多**:中間テーブルを作成し、2つの外部キーを含める。
テーブル間のクエリ方法:
- **内部結合**:`select ... from 表A inner join 表B on 条件...`
- **外部結合**:
- **左外部結合**:`select ... from 表A left join 表B on 条件...`
- **右外部結合**:`select ... from 表A right join 表B on 条件...`
- **自己結合**:`select ... from 表A 別名1,表A 別名2 where 条件...`
- **サブクエリ**:列、行、テーブルのサブクエリ。
1.3 CHARとVARCHARの違い
- **最大長**:CHARの最大長は255文字、VARCHARの最大長は65535バイト。
- **固定長**:CHARは固定長で、不足部分は非表示の空白で埋める。VARCHARは可変長。
- **スペース使用**:CHARはスペースを無駄にする。VARCHARはスペースを節約する。
- **検索効率**:CHARは長さを計算しなくて済むため、検索効率が高い。VARCHARは長さを計算する必要がある。
プロジェクトでの使用例:
- 値の列挙:CHARを使用。
- 説明文や名前:VARCHARを使用。
2. トランザクション
2.1 ACID
- **原子性**:トランザクション内の全ての操作が成功するか、全てが失敗する。
- **一致性**:データベースは一貫した状態から別の一致した状態へ遷移する。
- **隔離性**:他のトランザクションがこのトランザクションの完了前には見えない。
- **永続性**:コミットした後は、データが永続的に保存される。
2.2 コンカレントトランザクションの潜在的な問題
- **汚い読み**:未コミットのデータを読み込む。
- **更新の損失**:同時更新でデータが上書きされる。
- **再読み不可**:同一トランザクション内での同一データの再読みで結果が変わる。
- **幻の読み**:並行してデータが挿入され、検索結果に幻のレコードが現れる。
解決方法:トランザクションの隔離を適用する。
2.3 MySQLの隔離レベル
| 隔離レベル | 説明 |
|---|---|
| **READ UNCOMMITTED** | 未コミットのデータを読み込むことができる。 |
| **READ COMMITTED** | コミットされたデータのみを読み込む。 |
| **REPEATABLE READ** | 同一トランザクション内でデータが再読みされても同じ結果が得られる。 |
| **SERIALIZABLE** | 全ての操作をシリアライズして実行する。 |
3. インデックス
3.1 インデックスの基本
インデックスはデータを高速に検索するためのデータ構造である。
| エンジン | MyISAM | InnoDB | MEMORY |
|---|---|---|---|
| **トランザクション** | サポートなし | サポートあり | サポートなし |
| **ロック機構** | テーブルロック | 行ロック/テーブルロック | テーブルロック |
| **外部キー** | サポートなし | サポートあり | サポートなし |