5-2. SQL基礎(SELECT・INSERT・UPDATE・DELETE・JOIN)
このセクションで学ぶこと
Section titled “このセクションで学ぶこと”- SQL が何をする言語なのか
SELECT/INSERT/UPDATE/DELETEの役割JOINを使って複数テーブルを結び付ける理由- SQL を書くときに、なぜ条件や対象を明確にする必要があるのか
RDB を設計しただけでは、データはまだ活用できない。
実際に取り出し、追加し、更新し、削除するために使うのが SQL である。
1. SQL とは何か
Section titled “1. SQL とは何か”SQL は Structured Query Language の略で、リレーショナルデータベースを操作するための言語 である。
SQL では主に次のことを行う。
- データを検索する
- データを追加する
- データを更新する
- データを削除する
- 複数テーブルを結び付けて読む
たとえば「価格が 3000 円以上の本を出したい」という要求は、SQL で表現できる。
SELECT title, priceFROM booksWHERE price >= 3000;SQL は「どう取り出すか」より「何が欲しいか」を書く
Section titled “SQL は「どう取り出すか」より「何が欲しいか」を書く”プログラミング言語では、for 文で 1 件ずつ調べることが多い。
一方 SQL では、「どの表から」「どの列を」「どの条件で」欲しいかを書く。
JavaScript 的な発想1件ずつ取り出す ↓条件に合うものだけ残す
SQL 的な発想条件に合うものをこの表から欲しいこれが SQL の大きな特徴である。
2. サンプルテーブルを見る
Section titled “2. サンプルテーブルを見る”ここでは次の 2 つのテーブルを例にする。
authors+----+--------+| id | name |+----+--------+| 10 | Sato || 11 | Suzuki |+----+--------+
books+----+--------------+-----------+-------+| id | title | author_id | price |+----+--------------+-----------+-------+| 1 | Git | 10 | 2200 || 2 | JavaScript | 11 | 3200 || 3 | Network | 10 | 2800 |+----+--------------+-----------+-------+books.author_id が authors.id を参照しているので、書籍と著者を結び付けて読める。
3. SELECT: データを検索する
Section titled “3. SELECT: データを検索する”SELECT は、表から必要なデータを取り出す 命令である。
SELECT title, priceFROM books;この SQL は、books テーブルから title と price を読む。
条件を付ける WHERE
Section titled “条件を付ける WHERE”SELECT title, priceFROM booksWHERE price >= 2800;結果イメージ:
+------------+-------+| title | price |+------------+-------+| JavaScript | 3200 || Network | 2800 |+------------+-------+WHERE を付けないと全件が対象になる。
そのため、必要な範囲だけ取得したいときは条件が重要である。
並べ替える ORDER BY
Section titled “並べ替える ORDER BY”SELECT title, priceFROM booksORDER BY price DESC;DESC は大きい順、ASC は小さい順である。
4. INSERT: データを追加する
Section titled “4. INSERT: データを追加する”INSERT は、新しい行を追加する 命令である。
INSERT INTO books (id, title, author_id, price)VALUES (4, 'Database', 11, 2600);ポイントは、列の順と値の順が対応していることだ。
(id, title, author_id, price) ↓ ↓ ↓ ↓ 4 'Database' 11 2600なぜ列名を書くのか
Section titled “なぜ列名を書くのか”列名を書かずに値だけ並べることもできるが、順番を間違えると事故につながる。
初学者のうちは 列名を明示する書き方 のほうが安全である。
5. UPDATE: 既存データを更新する
Section titled “5. UPDATE: 既存データを更新する”UPDATE は、すでにある行の値を変更する 命令である。
UPDATE booksSET price = 3000WHERE id = 3;この SQL は、id = 3 の本だけ価格を 3000 にする。
WHERE を忘れるとどうなるか
Section titled “WHERE を忘れるとどうなるか”UPDATE booksSET price = 3000;これは全行が対象になる。
id=1 も id=2 も id=3 もすべて 3000 になるつまり UPDATE は便利だが、どの行を変えるのか を明確にしないと危険である。
6. DELETE: データを削除する
Section titled “6. DELETE: データを削除する”DELETE は、行を削除する 命令である。
DELETE FROM booksWHERE id = 1;これで id = 1 の行だけが削除される。
DELETE でも WHERE が重要である。
DELETE FROM books;これは books テーブルの全行を削除する。
初学者が最も注意すべき点の 1 つは、更新系 SQL では WHERE の有無を必ず確認すること である。
7. JOIN: テーブルを結び付ける
Section titled “7. JOIN: テーブルを結び付ける”正規化すると、著者名は authors テーブル、書籍タイトルは books テーブルのように分かれる。
そのため、画面表示では複数テーブルを組み合わせて読む必要がある。
そこで使うのが JOIN である。
SELECT books.title, authors.nameFROM booksJOIN authors ON books.author_id = authors.id;結果イメージ:
+------------+--------+| title | name |+------------+--------+| Git | Sato || JavaScript | Suzuki || Network | Sato |+------------+--------+JOIN の意味
Section titled “JOIN の意味”books.author_id == authors.id 10 == 10 11 == 11つまり ON books.author_id = authors.id は、
「どの行どうしを対応付けるか」 を決める条件である。
なぜ JOIN が必要なのか
Section titled “なぜ JOIN が必要なのか”JOIN がなければ、
- 書籍テーブルから著者名を直接読めない
- 正規化した恩恵を受けつつ一覧表示しにくい
という問題が起きる。
JOIN は、分けて保存したデータを使うときに再び組み立てる技術 である。
8. SQL を書くときの確認観点
Section titled “8. SQL を書くときの確認観点”SQL を書くときは、次の順で考えると整理しやすい。
- どのテーブルを見るのか
- どの列が必要か
- 何件を対象にしたいか
- 更新や削除なら、どの行だけを変えるのか
- 複数テーブルなら、どう結び付けるのか
欲しい情報は何か ↓どの表にあるか ↓条件は何か ↓更新系なら WHERE は十分か ↓JOIN の対応は正しいかSQL は短く見えるが、1 行の意味が大きい。
そのため、「何を対象にしているか」を常に意識することが重要である。
| キーワード | 説明 |
|---|---|
| SQL | RDB を操作するための言語 |
| SELECT | データを検索する |
| INSERT | 新しい行を追加する |
| UPDATE | 既存の行を更新する |
| DELETE | 行を削除する |
| JOIN | 複数テーブルを結び付ける |
| WHERE | 対象行を絞り込む条件 |
| ORDER BY | 並び順を決める |
次のステップ
Section titled “次のステップ”演習問題 に取り組んで、SQL の読み書きに慣れよう。
理解できたら 5-3. トランザクション・ACID・インデックス へ進もう。