はじめに
Webアプリケーションを開発していると、
- ユーザー情報を取得したい
- 登録したデータを更新したい
- 条件に合うデータだけ検索したい
- 複数のテーブルからデータを取得したい
といった場面が出てきます。
そのときに使うのが SQL(Structured Query Language) です。
この記事では、MySQLを使うことを前提に、SQLの基本について初心者向けにまとめます。
1. MySQLとSQLの違い
まず最初に、MySQLとSQLは同じものではありません。
簡単にいうと、
| 用語 | 意味 |
|---|---|
| MySQL | データを保存・管理するためのデータベース管理システム |
| SQL | データベースに命令するための言語 |
です。
イメージとしては、
MySQL = データを管理してくれるシステム
SQL = MySQLに対して出す指示
と考えるとわかりやすいです。
例えば、
SELECT *
FROM users;
というSQLをMySQLに送ると、
「usersテーブルに入っているデータを取得してください」
という命令になります。
2. データベースの基本構造
SQLを理解するためには、まずデータベースの構造を知っておく必要があります。
例えば、ユーザー情報を管理するデータベースがあるとします。
データベース
└── usersテーブル
├── id
├── name
├── email
└── age
テーブルの中には、実際のデータが入っています。
| id | name | age | |
|---|---|---|---|
| 1 | 田中 | tanaka@example.com | 25 |
| 2 | 佐藤 | sato@example.com | 30 |
| 3 | 鈴木 | suzuki@example.com | 18 |
Excelの表をイメージするとわかりやすいです。
- テーブル → Excelのシート
- カラム → 列
- レコード → 行
というイメージです。
3. SELECT:データを取得する
SQLで最も基本的なのが SELECT です。
データベースからデータを取得するときに使います。
3-1. すべてのデータを取得する
SELECT *
FROM users;
* は「すべて」という意味です。
つまり、
SELECT *
FROM users;
は、
usersテーブルのすべてのカラムを取得する
という意味になります。
3-2. 必要なカラムだけ取得する
すべてのデータが必要ない場合は、取得したいカラムを指定します。
SELECT name, email
FROM users;
結果は、
| name | |
|---|---|
| 田中 | tanaka@example.com |
| 佐藤 | sato@example.com |
| 鈴木 | suzuki@example.com |
のようになります。
SELECT * でも取得できますが、実際の開発では必要なカラムだけ指定することが大切です。
理由は、必要のないデータまで取得すると、
- 通信量が増える
- 処理量が増える
- SQLの意図がわかりにくくなる
といった問題につながるためです。
4. WHERE:条件を指定する
次に覚えたいのが WHERE です。
WHERE を使うと、取得するデータに条件を付けられます。
例えば、
20歳以上のユーザーだけ取得したい
場合は、
SELECT *
FROM users
WHERE age >= 20;
と書きます。
結果は、
| id | name | age | |
|---|---|---|---|
| 1 | 田中 | tanaka@example.com | 25 |
| 2 | 佐藤 | sato@example.com | 30 |
となります。
5. WHEREで使える比較演算子
よく使う比較演算子を覚えておきましょう。
| 演算子 | 意味 |
|---|---|
= |
等しい |
!= |
等しくない |
> |
より大きい |
< |
より小さい |
>= |
以上 |
<= |
以下 |
例えば、
SELECT *
FROM users
WHERE age = 20;
なら、
年齢が20歳のユーザー
を取得します。
SELECT *
FROM users
WHERE age >= 20;
なら、
20歳以上のユーザー
を取得します。
6. AND・OR:複数の条件を指定する
複数の条件を指定したい場合は、AND や OR を使います。
AND
AND は「両方の条件を満たす」という意味です。
SELECT *
FROM users
WHERE age >= 20
AND age < 30;
これは、
20歳以上、かつ30歳未満
のユーザーを取得します。
OR
OR は「どちらかの条件を満たす」という意味です。
SELECT *
FROM users
WHERE age = 20
OR age = 30;
これは、
20歳または30歳のユーザー
を取得します。
7. LIKE:文字列を検索する
文字列の一部を検索したい場合は LIKE を使います。
例えば、
名前に「田」が含まれているユーザーを検索する
場合、
SELECT *
FROM users
WHERE name LIKE '%田%';
と書きます。
% は、
0文字以上の任意の文字
を表します。
そのため、
LIKE '%田%'
なら、
- 田中
- 山田
- 田村
などが対象になります。
8. ORDER BY:並び替える
取得したデータを並び替える場合は ORDER BY を使います。
例えば、年齢が若い順に並べたい場合、
SELECT *
FROM users
ORDER BY age ASC;
とします。
ASC は昇順です。
反対に、
SELECT *
FROM users
ORDER BY age DESC;
とすると降順になります。
覚え方
ASC → 小さい → 大きい
DESC → 大きい → 小さい
9. LIMIT:取得件数を制限する
取得する件数を制限したい場合は LIMIT を使います。
SELECT *
FROM users
LIMIT 10;
これは、
最大10件取得する
という意味です。
例えば一覧画面で「最初の20件だけ表示する」といった処理で使われます。
10. INSERT:データを登録する
ここまではデータを「取得」していました。
次はデータを登録します。
データを登録するときは INSERT INTO を使います。
INSERT INTO users (name, email, age)
VALUES ('山田', 'yamada@example.com', 25);
これによって、
| name | age | |
|---|---|---|
| 山田 | yamada@example.com | 25 |
というデータが登録されます。
11. UPDATE:データを更新する
既存のデータを変更するときは UPDATE を使います。
例えば、
idが1のユーザーの名前を「高橋」に変更する
場合、
UPDATE users
SET name = '高橋'
WHERE id = 1;
とします。
ここで非常に重要なのが WHERE です。
WHEREを付け忘れるとどうなる?
例えば、
UPDATE users
SET name = '高橋';
と書いてしまうと、
usersテーブルの全ユーザーの名前が「高橋」になります。
これは実際の開発でも非常に危険なミスです。
そのため、
UPDATE
DELETE
を実行するときは、
「WHEREは必要ないか?」
を必ず確認する習慣をつけることが大切です。
12. DELETE:データを削除する
データを削除するときは DELETE を使います。
例えば、
DELETE FROM users
WHERE id = 1;
とすると、idが1のデータを削除できます。
こちらも WHERE の付け忘れには注意が必要です。
DELETE FROM users;
とすると、usersテーブルのデータをすべて削除します。
13. COUNT:件数を数える
データの件数を取得したい場合は COUNT を使います。
SELECT COUNT(*)
FROM users;
例えばusersテーブルに100件のデータがあれば、
100
が返ってきます。
Webアプリケーションでは、
- ユーザー数
- 商品数
- 注文数
- 投稿数
などを取得するときによく使います。
14. GROUP BY:データをグループ化する
GROUP BY は少し難しく感じるかもしれません。
簡単にいうと、
同じ値を持つデータをグループにまとめる
ためのものです。
例えば、ユーザーの住所を管理しているとします。
| id | name | prefecture |
|---|---|---|
| 1 | 田中 | 東京 |
| 2 | 佐藤 | 東京 |
| 3 | 鈴木 | 大阪 |
| 4 | 山田 | 大阪 |
| 5 | 高橋 | 東京 |
都道府県ごとのユーザー数を知りたい場合、
SELECT prefecture, COUNT(*)
FROM users
GROUP BY prefecture;
とします。
結果は、
| prefecture | COUNT(*) |
|---|---|
| 東京 | 3 |
| 大阪 | 2 |
となります。
つまり、
東京
├── 田中
├── 佐藤
└── 高橋
大阪
├── 鈴木
└── 山田
のようにグループ化してから、それぞれの件数を数えています。
15. JOIN:複数のテーブルを結合する
SQLを勉強する上で、最も重要なものの一つが JOIN です。
実際のWebアプリケーションでは、すべての情報を1つのテーブルに入れることはあまりありません。
例えば、
usersテーブル
| id | name |
|---|---|
| 1 | 田中 |
| 2 | 佐藤 |
ordersテーブル
| id | user_id | product |
|---|---|---|
| 1 | 1 | PC |
| 2 | 1 | マウス |
| 3 | 2 | キーボード |
という構成があるとします。
ここで、
「誰が何を購入したのか」
を取得したい場合、usersとordersを結合します。
SELECT users.name, orders.product
FROM users
JOIN orders
ON users.id = orders.user_id;
結果は、
| name | product |
|---|---|
| 田中 | PC |
| 田中 | マウス |
| 佐藤 | キーボード |
となります。
16. JOINはなぜ必要なのか?
例えば、
users
には「ユーザー情報」を保存し、
orders
には「注文情報」を保存します。
それぞれ役割が違います。
users
↓
ユーザーを管理
orders
↓
注文を管理
そして、
users.id
↓
orders.user_id
という関係を持たせます。
このように複数のテーブルに分けて管理することで、データを整理しやすくなります。
必要なときに JOIN して、
「ユーザー情報+注文情報」
のように組み合わせて利用します。
17. INNER JOINとLEFT JOIN
JOINにはいくつか種類があります。
初心者の段階では、まず INNER JOIN と LEFT JOIN を理解するとよいです。
INNER JOIN
両方のテーブルに一致するデータだけ取得します。
SELECT users.name, orders.product
FROM users
INNER JOIN orders
ON users.id = orders.user_id;
例えば注文していないユーザーがいた場合、そのユーザーは結果に含まれません。
LEFT JOIN
左側のテーブルのデータをすべて取得します。
SELECT users.name, orders.product
FROM users
LEFT JOIN orders
ON users.id = orders.user_id;
例えば注文していないユーザーがいても、そのユーザーは結果に含まれます。
田中 → PC
田中 → マウス
佐藤 → キーボード
鈴木 → NULL
NULL は、
値が存在しない
という意味です。
18. NULLとは?
SQLでは NULL という特別な値があります。
これは、
データが存在しない・値が入っていない
ことを表します。
例えば、
| id | name | phone |
|---|---|---|
| 1 | 田中 | 090-xxxx-xxxx |
| 2 | 佐藤 | NULL |
の場合、佐藤さんは電話番号が登録されていない状態です。
NULLを検索するときは、
SELECT *
FROM users
WHERE phone IS NULL;
とします。
逆にNULLではないデータを検索する場合は、
SELECT *
FROM users
WHERE phone IS NOT NULL;
とします。
ここで注意したいのが、
WHERE phone = NULL
とは書かないことです。
NULLは通常の値とは少し扱いが違うため、
IS NULL
IS NOT NULL
を使います。
19. AS:名前を付ける
SQLでは、取得した結果に別名を付けることもできます。
SELECT name AS user_name
FROM users;
AS を使うことで、
name
↓
user_name
という名前で結果を表示できます。
COUNT(*) などにも使えます。
SELECT COUNT(*) AS user_count
FROM users;
こうすると結果が、
| user_count |
|---|
| 100 |
のようになり、何の数字なのかがわかりやすくなります。
20. DISTINCT:重複を除く
重複したデータを除外したい場合は DISTINCT を使います。
例えば、
SELECT DISTINCT prefecture
FROM users;
とすると、都道府県の重複を除いて取得できます。
東京
大阪
東京
福岡
大阪
というデータがあった場合、
東京
大阪
福岡
となります。
21. WHEREとHAVINGの違い
WHERE と HAVING は似ていますが、役割が違います。
簡単にいうと、
-
WHERE→ グループ化する前のデータを絞る -
HAVING→ グループ化した後のデータを絞る
です。
例えば、
SELECT prefecture, COUNT(*) AS user_count
FROM users
WHERE age >= 20
GROUP BY prefecture
HAVING COUNT(*) >= 10;
の場合、
users
↓
20歳以上だけにする
↓
都道府県ごとにまとめる
↓
10人以上の都道府県だけ残す
という流れになります。
22. SQLを書く順番
SQLを書くときは、基本的に以下の順番で考えると整理しやすいです。
SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
LIMIT
例えば、
SELECT prefecture, COUNT(*) AS user_count
FROM users
WHERE age >= 20
GROUP BY prefecture
HAVING COUNT(*) >= 10
ORDER BY user_count DESC
LIMIT 5;
というSQLがあったとします。
一見すると難しそうですが、1つずつ分解すると、
FROM
↓
usersテーブルから
WHERE
↓
20歳以上だけに絞る
GROUP BY
↓
都道府県ごとにまとめる
HAVING
↓
10人以上の都道府県だけにする
ORDER BY
↓
人数が多い順に並べる
LIMIT
↓
上位5件だけ取得する
SELECT
↓
都道府県と人数を表示する
という処理です。
23. 実際のWebアプリケーションではどう使うのか
例えば、タスク管理アプリを作っているとします。
データベースに、
tasks
--------------------------------
id
title
completed
user_id
created_at
というテーブルがあるとします。
未完了のタスクを取得する
「自分の未完了タスクを取得する」なら、
SELECT id, title
FROM tasks
WHERE user_id = 1
AND completed = 0;
となります。
タスクを登録する
INSERT INTO tasks (title, completed, user_id)
VALUES ('SQLを勉強する', 0, 1);
タスクを完了にする
UPDATE tasks
SET completed = 1
WHERE id = 10
AND user_id = 1;
このようにSQLは、
Webアプリケーションの「データを扱う部分」を支える重要な技術
です。
24. SQLを書くときに意識したいこと
SQLは「動けばOK」ではありません。
実際の開発では、読みやすさや性能も重要です。
① 必要なカラムだけ取得する
できるだけ、
SELECT *
FROM users;
ではなく、
SELECT id, name, email
FROM users;
のように必要なカラムを指定します。
② UPDATE・DELETEではWHEREを確認する
特に重要です。
UPDATE users
SET name = '田中';
や、
DELETE FROM users;
は、全データを変更・削除する可能性があります。
実行前に、
「本当にこの条件で大丈夫か?」
を確認する癖をつけたいです。
③ 大量データでは取得件数を考える
何十万件、何百万件とデータが入っているテーブルに対して、
SELECT *
FROM users;
を実行すると、大量のデータを取得することになります。
必要に応じて、
LIMIT
を使ったり、条件を付けたりします。
25. インデックスとは?
SQLを勉強していると、次に「インデックス」という言葉が出てきます。
インデックスは簡単にいうと、
データを検索しやすくするための「索引」
です。
本で例えると、
本全体を最初から読む
↓
目的のページを探す
よりも、
目次を見る
↓
目的のページを開く
ほうが速いですよね。
データベースのインデックスも似ています。
例えば、
SELECT *
FROM users
WHERE email = 'tanaka@example.com';
のような検索を頻繁に行う場合、email にインデックスを作ることで検索を効率化できる場合があります。
ただし、インデックスは何でも付ければよいわけではありません。
インデックスを作ると、
- 検索が速くなる場合がある
- 一方でデータ登録・更新時の負荷が増える
- ストレージも使用する
といった特徴があります。
そのため、実際の開発では「どの検索が多いのか」を考えて設計します。
26. SQLの基本まとめ
ここまで紹介したSQLをまとめると、以下のようになります。
| SQL | 役割 |
|---|---|
SELECT |
データを取得する |
INSERT |
データを登録する |
UPDATE |
データを更新する |
DELETE |
データを削除する |
WHERE |
条件を指定する |
ORDER BY |
並び替える |
LIMIT |
件数を制限する |
GROUP BY |
データをグループ化する |
HAVING |
グループ化後の条件を指定する |
JOIN |
テーブルを結合する |
COUNT |
件数を数える |
DISTINCT |
重複を除く |
LIKE |
文字列を検索する |
AS |
別名を付ける |
27. まず覚えるならこの5つ
SQLにはたくさんの構文がありますが、最初からすべて覚える必要はありません。
まずは、
SELECT
WHERE
INSERT
UPDATE
DELETE
の5つを理解するのがおすすめです。
その後、
ORDER BY
LIMIT
JOIN
GROUP BY
COUNT
を覚えると、Webアプリケーションでよく見るSQLがかなり読めるようになります。
28. まとめ
今回はMySQLとSQLの基本についてまとめました。
最初はSQLの構文が難しく感じるかもしれません。
しかし、基本的には、
どのテーブルから?
↓
FROM
どのデータを?
↓
WHERE
何を取得する?
↓
SELECT
どう並べる?
↓
ORDER BY
何件取得する?
↓
LIMIT
というように、日本語で考えてからSQLに変換すると理解しやすくなります。
SQLは暗記するよりも、
「このデータベースから、どんなデータを取り出したいのか?」
を考えることが大切です。
まずは SELECT と WHERE から実際にSQLを書いてみて、慣れてきたら JOIN や GROUP BY に進むと理解しやすいと思います。
今後はSQLの文法だけでなく、
- テーブル設計
- 主キー・外部キー
- 正規化
- インデックス
- トランザクション
- SQLの実行速度
-
EXPLAINを使ったSQLの調査
なども学んでいくと、より実務で使えるデータベースの知識につながります。