0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【MySQL入門】SQLの基本を初心者向けにまとめてみた

0
Posted at

はじめに

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 email 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 email
田中 tanaka@example.com
佐藤 sato@example.com
鈴木 suzuki@example.com

のようになります。

SELECT * でも取得できますが、実際の開発では必要なカラムだけ指定することが大切です。

理由は、必要のないデータまで取得すると、

  • 通信量が増える
  • 処理量が増える
  • SQLの意図がわかりにくくなる

といった問題につながるためです。


4. WHERE:条件を指定する

次に覚えたいのが WHERE です。

WHERE を使うと、取得するデータに条件を付けられます。

例えば、

20歳以上のユーザーだけ取得したい

場合は、

SELECT *
FROM users
WHERE age >= 20;

と書きます。

結果は、

id name email 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:複数の条件を指定する

複数の条件を指定したい場合は、ANDOR を使います。

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 email 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 JOINLEFT 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の違い

WHEREHAVING は似ていますが、役割が違います。

簡単にいうと、

  • 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は暗記するよりも、

「このデータベースから、どんなデータを取り出したいのか?」

を考えることが大切です。

まずは SELECTWHERE から実際にSQLを書いてみて、慣れてきたら JOINGROUP BY に進むと理解しやすいと思います。

今後はSQLの文法だけでなく、

  • テーブル設計
  • 主キー・外部キー
  • 正規化
  • インデックス
  • トランザクション
  • SQLの実行速度
  • EXPLAIN を使ったSQLの調査

なども学んでいくと、より実務で使えるデータベースの知識につながります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?