コンテンツにスキップ

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


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

SELECT title, price
FROM books;

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

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・インデックス へ進もう。