コンテンツにスキップ

5-2. SQL基礎(SELECT・INSERT・UPDATE・DELETE・JOIN)

  • SQL が何をする言語なのか
  • SELECT / INSERT / UPDATE / DELETE の役割
  • JOIN を使って複数テーブルを結び付ける理由
  • SQL を書くときに、なぜ条件や対象を明確にする必要があるのか

RDB を設計しただけでは、データはまだ活用できない。
実際に取り出し、追加し、更新し、削除するために使うのが SQL である。


SQL は Structured Query Language の略で、リレーショナルデータベースを操作するための言語 である。

SQL では主に次のことを行う。

  • データを検索する
  • データを追加する
  • データを更新する
  • データを削除する
  • 複数テーブルを結び付けて読む

たとえば「価格が 3000 円以上の本を出したい」という要求は、SQL で表現できる。

SELECT title, price
FROM books
WHERE price >= 3000;

SQL は「どう取り出すか」より「何が欲しいか」を書く

Section titled “SQL は「どう取り出すか」より「何が欲しいか」を書く”

プログラミング言語では、for 文で 1 件ずつ調べることが多い。
一方 SQL では、「どの表から」「どの列を」「どの条件で」欲しいかを書く。

JavaScript 的な発想
1件ずつ取り出す
条件に合うものだけ残す
SQL 的な発想
条件に合うものをこの表から欲しい

これが SQL の大きな特徴である。


ここでは次の 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_idauthors.id を参照しているので、書籍と著者を結び付けて読める。


SELECT は、表から必要なデータを取り出す 命令である。

SELECT title, price
FROM books;

この SQL は、books テーブルから titleprice を読む。

SELECT title, price
FROM books
WHERE price >= 2800;

結果イメージ:

+------------+-------+
| title | price |
+------------+-------+
| JavaScript | 3200 |
| Network | 2800 |
+------------+-------+

WHERE を付けないと全件が対象になる。
そのため、必要な範囲だけ取得したいときは条件が重要である。

SELECT title, price
FROM books
ORDER BY price DESC;

DESC は大きい順、ASC は小さい順である。


INSERT は、新しい行を追加する 命令である。

INSERT INTO books (id, title, author_id, price)
VALUES (4, 'Database', 11, 2600);

ポイントは、列の順と値の順が対応していることだ。

(id, title, author_id, price)
↓ ↓ ↓ ↓
4 'Database' 11 2600

列名を書かずに値だけ並べることもできるが、順番を間違えると事故につながる。
初学者のうちは 列名を明示する書き方 のほうが安全である。


UPDATE は、すでにある行の値を変更する 命令である。

UPDATE books
SET price = 3000
WHERE id = 3;

この SQL は、id = 3 の本だけ価格を 3000 にする。

UPDATE books
SET price = 3000;

これは全行が対象になる。

id=1 も id=2 も id=3 も
すべて 3000 になる

つまり UPDATE は便利だが、どの行を変えるのか を明確にしないと危険である。


DELETE は、行を削除する 命令である。

DELETE FROM books
WHERE id = 1;

これで id = 1 の行だけが削除される。

DELETE でも WHERE が重要である。

DELETE FROM books;

これは books テーブルの全行を削除する。

初学者が最も注意すべき点の 1 つは、更新系 SQL では WHERE の有無を必ず確認すること である。


正規化すると、著者名は authors テーブル、書籍タイトルは books テーブルのように分かれる。
そのため、画面表示では複数テーブルを組み合わせて読む必要がある。

そこで使うのが JOIN である。

SELECT books.title, authors.name
FROM books
JOIN authors ON books.author_id = authors.id;

結果イメージ:

+------------+--------+
| title | name |
+------------+--------+
| Git | Sato |
| JavaScript | Suzuki |
| Network | Sato |
+------------+--------+
books.author_id == authors.id
10 == 10
11 == 11

つまり ON books.author_id = authors.id は、 「どの行どうしを対応付けるか」 を決める条件である。

JOIN がなければ、

  • 書籍テーブルから著者名を直接読めない
  • 正規化した恩恵を受けつつ一覧表示しにくい

という問題が起きる。
JOIN は、分けて保存したデータを使うときに再び組み立てる技術 である。


SQL を書くときは、次の順で考えると整理しやすい。

  1. どのテーブルを見るのか
  2. どの列が必要か
  3. 何件を対象にしたいか
  4. 更新や削除なら、どの行だけを変えるのか
  5. 複数テーブルなら、どう結び付けるのか
欲しい情報は何か
どの表にあるか
条件は何か
更新系なら WHERE は十分か
JOIN の対応は正しいか

SQL は短く見えるが、1 行の意味が大きい。
そのため、「何を対象にしているか」を常に意識することが重要である。


キーワード説明
SQLRDB を操作するための言語
SELECTデータを検索する
INSERT新しい行を追加する
UPDATE既存の行を更新する
DELETE行を削除する
JOIN複数テーブルを結び付ける
WHERE対象行を絞り込む条件
ORDER BY並び順を決める

演習問題 に取り組んで、SQL の読み書きに慣れよう。

理解できたら 5-3. トランザクション・ACID・インデックス へ進もう。