SQL チートシート
SQLは、データベースに保存されているデータを検索・追加・変更・削除するための言語です。
たとえば、こんな表があるとします。
サンプルテーブル
テーブル名: users
| id | name | age | |
|---|---|---|---|
| 1 | 田中 | 16 | tanaka@example.com |
| 2 | 佐藤 | 18 | sato@example.com |
| 3 | 鈴木 | 17 | suzuki@example.com |
SQLでは、この表に対して
- データを見る
- データを探す
- データを追加する
- データを書き換える
- データを削除する
などができます。
1. データを見る SELECT
全部見る
SELECT * FROM users;
意味:
SELECT = データを見る
* = 全部の列
FROM = ~から
users = usersテーブル
つまり、
usersテーブルのデータを全部見せて
という意味です。
特定の列だけ見る
SELECT name, age FROM users;
結果:
name age
田中 16
佐藤 18
鈴木 17
2. 条件を付ける WHERE
年齢が18歳の人
SELECT *
FROM users
WHERE age = 18;
18歳以上
SELECT *
FROM users
WHERE age >= 18;
18歳未満
SELECT *
FROM users
WHERE age < 18;
よく使う比較記号:
| 書き方 | 意味 |
|---|---|
= |
等しい |
!= |
等しくない |
<> |
等しくない |
> |
より大きい |
< |
より小さい |
>= |
以上 |
<= |
以下 |
3. 文字を検索する
文字列は基本的に ' で囲みます。
SELECT *
FROM users
WHERE name = '田中';
数字は囲まなくてOKです。
WHERE age = 18
文字は囲みます。
WHERE name = '田中'
4. 複数の条件 AND / OR
両方満たす AND
SELECT *
FROM users
WHERE age >= 16
AND age <= 18;
意味:
16歳以上、かつ18歳以下
どちらか満たす OR
SELECT *
FROM users
WHERE name = '田中'
OR name = '佐藤';
意味:
田中 または 佐藤
5. ~を含む LIKE
「田」で始まる
SELECT *
FROM users
WHERE name LIKE '田%';
% は
何文字あってもOK
という意味です。
「田」を含む
SELECT *
FROM users
WHERE name LIKE '%田%';
「中」で終わる
SELECT *
FROM users
WHERE name LIKE '%中';
6. 複数の候補から探す IN
SELECT *
FROM users
WHERE name IN ('田中', '佐藤', '鈴木');
これは、
WHERE name = '田中'
OR name = '佐藤'
OR name = '鈴木'
とほぼ同じ意味です。
7. 範囲を指定する BETWEEN
SELECT *
FROM users
WHERE age BETWEEN 16 AND 18;
意味:
16以上18以下
8. 並び替える ORDER BY
小さい順
SELECT *
FROM users
ORDER BY age ASC;
ASC = 昇順
16
17
18
大きい順
SELECT *
FROM users
ORDER BY age DESC;
DESC = 降順
18
17
16
9. 表示件数を制限する LIMIT
最初の10件だけ表示:
SELECT *
FROM users
LIMIT 10;
10件飛ばして次の10件
MySQL / PostgreSQLなど:
SELECT *
FROM users
LIMIT 10 OFFSET 10;
10. データを追加する INSERT
INSERT INTO users (name, age, email)
VALUES ('山田', 17, 'yamada@example.com');
意味:
usersテーブルに山田さんを追加する
複数件まとめて追加
INSERT INTO users (name, age, email)
VALUES
('山田', 17, 'yamada@example.com'),
('高橋', 18, 'takahashi@example.com');
11. データを変更する UPDATE
UPDATE users
SET age = 18
WHERE id = 1;
意味:
IDが1の人の年齢を18に変更する
複数の項目を変更
UPDATE users
SET
name = '田中太郎',
age = 17
WHERE id = 1;
⚠ UPDATEの超重要注意
これを書くと、
UPDATE users
SET age = 18;
全員の年齢が18になります。
基本的に、
WHERE
を忘れないようにします。
安全のため、変更前に
SELECT *
FROM users
WHERE id = 1;
で対象を確認すると安心です。
12. データを削除する DELETE
DELETE FROM users
WHERE id = 1;
意味:
IDが1のデータを削除
⚠ DELETEも超重要
これを実行すると、
DELETE FROM users;
usersテーブルのデータが全部消えます。
そのため基本的には、
DELETE FROM users
WHERE id = 1;
のように WHERE を付けます。
13. 重複を消す DISTINCT
例えば:
Tokyo
Tokyo
Chiba
Tokyo
Chiba
というデータがある場合、
SELECT DISTINCT prefecture
FROM users;
結果:
Tokyo
Chiba
14. 件数を数える COUNT
SELECT COUNT(*)
FROM users;
結果:
3
条件付き
SELECT COUNT(*)
FROM users
WHERE age >= 18;
15. 最大・最小・平均・合計
最大値
SELECT MAX(age)
FROM users;
最小値
SELECT MIN(age)
FROM users;
平均
SELECT AVG(age)
FROM users;
合計
SELECT SUM(age)
FROM users;
よく使うもの:
| 関数 | 意味 |
|---|---|
COUNT() |
件数 |
MAX() |
最大 |
MIN() |
最小 |
AVG() |
平均 |
SUM() |
合計 |
16. グループごとに集計する GROUP BY
例えば:
| name | prefecture |
|---|---|
| 田中 | Tokyo |
| 佐藤 | Tokyo |
| 鈴木 | Chiba |
都道府県ごとの人数を数える:
SELECT prefecture, COUNT(*)
FROM users
GROUP BY prefecture;
結果:
Tokyo 2
Chiba 1
17. NULL
NULL は、
データが入っていない
という意味です。
例えばメールアドレスが登録されていない人を探す場合:
SELECT *
FROM users
WHERE email IS NULL;
NULLではない
SELECT *
FROM users
WHERE email IS NOT NULL;
これはダメです。
WHERE email = NULL
NULL は = では比較しません。
18. 列に別名を付ける AS
SELECT name AS user_name
FROM users;
例えば:
SELECT COUNT(*) AS user_count
FROM users;
結果:
user_count
3
19. テーブルを作る CREATE TABLE
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(100),
age INT,
email VARCHAR(255)
);
各部分の意味
id INT
id という数字の列。
name VARCHAR(100)
最大100文字程度の文字列。
PRIMARY KEY
データを一意に識別するID。
20. よく使うデータ型
| 型 | 用途 |
|---|---|
INT |
整数 |
BIGINT |
大きな整数 |
VARCHAR(255) |
文字列 |
TEXT |
長い文章 |
BOOLEAN |
true / false |
DATE |
日付 |
TIME |
時刻 |
DATETIME |
日時 |
TIMESTAMP |
日時 |
DECIMAL |
小数 |
21. 自動でIDを増やす
MySQLの場合:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100)
);
これなら、
INSERT INTO users (name)
VALUES ('田中');
とすると、自動的に
id = 1
などが設定されます。
PostgreSQLの場合は、
GENERATED ALWAYS AS IDENTITY
などを使います。
22. テーブルを削除する DROP TABLE
DROP TABLE users;
⚠ テーブル自体が消えます。
データだけではなく、
usersというテーブルそのもの
が削除されます。
23. テーブルの中身だけ全部消す TRUNCATE
TRUNCATE TABLE users;
テーブル自体は残ります。
users
├─ 構造 → 残る
└─ データ → 全部消える
24. 列を追加する ALTER TABLE
ALTER TABLE users
ADD COLUMN birthday DATE;
25. 列を削除する
ALTER TABLE users
DROP COLUMN birthday;
26. JOIN
JOIN は、
複数のテーブルをくっつける
ために使います。
例えば:
users
| id | name |
|---|---|
| 1 | 田中 |
| 2 | 佐藤 |
posts
| id | user_id | title |
|---|---|---|
| 1 | 1 | こんにちは |
| 2 | 1 | SQL勉強中 |
| 3 | 2 | テスト |
この2つをつなげます。
SELECT users.name, posts.title
FROM posts
JOIN users
ON posts.user_id = users.id;
結果:
田中 こんにちは
田中 SQL勉強中
佐藤 テスト
27. JOINを図で考える
users
id ─────┐
1 田中 │
2 佐藤 │
│
▼
posts
user_id
1 → 田中の投稿
1 → 田中の投稿
2 → 佐藤の投稿
この
posts.user_id
と
users.id
を使ってつなげています。
ON posts.user_id = users.id
28. INNER JOIN
SELECT *
FROM users
INNER JOIN posts
ON users.id = posts.user_id;
両方に対応するデータがあるものだけ表示します。
JOIN とだけ書いた場合、多くのDBでは INNER JOIN と同じです。
29. LEFT JOIN
SELECT *
FROM users
LEFT JOIN posts
ON users.id = posts.user_id;
users 側は、投稿がなくても表示されます。
30. 外部キー FOREIGN KEY
CREATE TABLE posts (
id INT PRIMARY KEY,
user_id INT,
title VARCHAR(255),
FOREIGN KEY (user_id)
REFERENCES users(id)
);
これは、
posts.user_id
↓
users.id
という関係を作ります。
31. UNIQUE
同じ値を登録できないようにします。
CREATE TABLE users (
id INT PRIMARY KEY,
email VARCHAR(255) UNIQUE
);
これなら、
test@example.com
test@example.com
のように同じメールアドレスを2個登録できません。
32. NOT NULL
絶対に値を入れる必要がある列です。
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
33. DEFAULT
何も指定しなかった場合の初期値です。
CREATE TABLE users (
id INT PRIMARY KEY,
active BOOLEAN DEFAULT TRUE
);
34. コメント
SQLでは、
-- コメント
SELECT * FROM users;
のように書けます。
複数行:
/*
これは
複数行コメント
です
*/
35. SQLを書く基本順番
SQLはだいたいこの順番で書きます。
SELECT
FROM
JOIN
WHERE
GROUP BY
HAVING
ORDER BY
LIMIT
例えば:
SELECT name, age
FROM users
WHERE age >= 16
ORDER BY age DESC
LIMIT 10;
36. よく使うSQLまとめ
全件取得
SELECT *
FROM users;
1人検索
SELECT *
FROM users
WHERE id = 1;
名前検索
SELECT *
FROM users
WHERE name = '田中';
部分一致
SELECT *
FROM users
WHERE name LIKE '%田%';
追加
INSERT INTO users (name, age)
VALUES ('田中', 16);
更新
UPDATE users
SET age = 17
WHERE id = 1;
削除
DELETE FROM users
WHERE id = 1;
並び替え
SELECT *
FROM users
ORDER BY age DESC;
10件取得
SELECT *
FROM users
LIMIT 10;
件数
SELECT COUNT(*)
FROM users;
37. 特に覚えればいいもの
最初はこれだけ覚えればかなり使えます。
SELECT
データを見る。
FROM
どのテーブルから見るか。
WHERE
条件を付ける。
INSERT
追加する。
UPDATE
変更する。
DELETE
削除する。
ORDER BY
並び替える。
LIMIT
件数を制限する。
JOIN
別のテーブルとつなげる。
38. SQLを日本語っぽく読む
例えば:
SELECT name, age
FROM users
WHERE age >= 18
ORDER BY age DESC
LIMIT 10;
これをそのまま日本語にすると、
SELECT name, age
→ 名前と年齢を取得
FROM users
→ usersから
WHERE age >= 18
→ 18歳以上だけ
ORDER BY age DESC
→ 年齢が高い順に並べて
LIMIT 10
→ 最大10人まで
つまり、
usersテーブルから18歳以上の人を、年齢が高い順に10人取得する
というSQLです。
39. UPDATE / DELETEする前の安全確認
かなり重要です。
例えば削除したい場合、いきなり
DELETE FROM users
WHERE age < 18;
を実行するのではなく、最初に
SELECT *
FROM users
WHERE age < 18;
を実行します。
対象が正しいことを確認したら、
DELETE FROM users
WHERE age < 18;
を実行します。
同じように UPDATE でも、
SELECT *
FROM users
WHERE id = 10;
で確認してから、
UPDATE users
SET age = 18
WHERE id = 10;
を実行すると事故を減らせます。
40. 超簡易まとめ
-- 見る
SELECT * FROM users;
-- 探す
SELECT * FROM users WHERE id = 1;
-- 追加
INSERT INTO users (name) VALUES ('田中');
-- 変更
UPDATE users SET name = '佐藤' WHERE id = 1;
-- 削除
DELETE FROM users WHERE id = 1;
-- 並び替え
SELECT * FROM users ORDER BY id DESC;
-- 最大10件
SELECT * FROM users LIMIT 10;
-- 件数
SELECT COUNT(*) FROM users;
-- 2つのテーブルをつなぐ
SELECT *
FROM users
JOIN posts ON users.id = posts.user_id;
一番大事な注意
UPDATE users SET ...
と
DELETE FROM users
は、WHERE がないと全データが対象になります。
迷ったら先に、
SELECT *
FROM ...
WHERE ...;
を実行して、対象を確認してから変更・削除します。