SQLの書き方をデータ操作しながら学ぶ

目次

前提のデータ

前提として、次のような2テーブルデータがあるものとします。

users テーブル

列名意味内容の説明
id番号ユーザーを一意に識別するためのID
name名前ユーザーの名前
age年齢ユーザーの年齢
emailメールアドレスユーザーの連絡先メール

データ

idnameageemail
1太郎20taro@example.com
2花子25hanako@example.com
3次郎30jiro@example.com

orders テーブル

列名意味内容の説明
id注文番号注文を一意に識別するID
user_idユーザーID注文したユーザーを表すID
price金額注文の合計金額
created_at注文日注文が作成された日時

データ

iduser_idpricecreated_at
1130002025-01-10
2115002025-01-12
3250002025-01-15
4320002025-01-18

SQLite Onlineでテーブル作成しデータを投入する

今回はSQLite OnlineというSQLを簡単に試せるツールを使用します。

STEP
SQLite Onlineを開く

まずはこちらを開きます。

STEP
テーブルを作成する

真ん中のSQL記述枠に下記を貼り付けます。(すでに何か書いてあった場合は上書きでOK)

CREATE TABLE users (
  id INTEGER PRIMARY KEY,
  name TEXT,
  age INTEGER,
  email TEXT
);

CREATE TABLE orders (
  id INTEGER PRIMARY KEY,
  user_id INTEGER,
  price INTEGER,
  created_at TEXT
);

そのまま、「Runボタン」を押下します。

STEP
データを投入する

真ん中のSQL記述枠に下記を貼り付けます。(STEP2を上書きで貼り付け)

INSERT INTO users (id, name, age, email) VALUES
(1, '太郎', 20, 'taro@example.com'),
(2, '花子', 25, 'hanako@example.com'),
(3, '次郎', 30, 'jiro@example.com');

INSERT INTO orders (id, user_id, price, created_at) VALUES
(1, 1, 3000, '2025-01-10'),
(2, 1, 1500, '2025-01-12'),
(3, 2, 5000, '2025-01-15'),
(4, 3, 2000, '2025-01-18');

そのまま、「Runボタン」を押下します。

テーブルの作成とデータの投入ができたので、これ以降はSQLを同様に真ん中の記述枠へ上書きで貼り付けて、Runボタンで実行して進めてください。

すべてのデータを表示する

SELECT * FROM users;

users テーブルに入っているすべての行と列を表示します。

「*」は「すべて」という意味で、最初に覚える基本の書き方です。

特定の列だけを表示する

SELECT name, age FROM users;

name と age だけを取り出します。
必要な情報だけを表示したいときによく使われます。

条件を指定してデータを絞り込む

SELECT * FROM users WHERE age >= 20;

age が 20 以上のデータだけを表示します。
WHERE は「条件を指定する」ためのものです。

完全に一致するデータを探す

SELECT * FROM users WHERE name = '太郎';

name が 太郎 のデータだけを表示します。
文字列はシングルクォートで囲みます。

複数の条件を同時に指定する

SELECT * FROM users WHERE age >= 20 AND age < 30;

20歳以上かつ30歳未満のユーザーを表示します。
AND は「両方の条件を満たす」という意味です。

どちらかの条件を満たすデータを探す

SELECT * FROM users WHERE age < 18 OR age >= 65;

18歳未満、または65歳以上のユーザーを表示します。
OR は「どちらか一方」です。

条件に当てはまらないものを探す

SELECT * FROM users WHERE age != 20;

age が 20 ではないユーザーを表示します。
!= は「等しくない」という意味です。

あいまい検索をする

SELECT * FROM users WHERE name LIKE '田%';

名前が「田」で始まるユーザーを表示します。
% は「何文字でも続いてよい」という意味です。

文字列を含むデータを探す

SELECT * FROM users WHERE email LIKE '%gmail%';

gmail という文字を含むメールアドレスを持つユーザーを表示します。

並び順を指定する

SELECT * FROM users ORDER BY age;

age が小さい順に並べて表示します。
指定しない場合は登録順になります。

大きい順に並び替える

SELECT * FROM users ORDER BY age DESC;

年齢が高い順に表示します。
DESC は降順を意味します。

表示する件数を制限する

SELECT * FROM users LIMIT 5;

最初の5件だけを表示します。
データが多いときに便利です。

途中からデータを表示する

SELECT * FROM users LIMIT 5 OFFSET 5;

6件目から5件分を表示します。
ページ分割でよく使われます。

データを追加する

INSERT INTO users (name, age, email)
VALUES ('花子', 25, 'hanako@example.com');

users テーブルに新しいデータを1件追加します。
指定した列に対応する値が保存されます。

データを更新する

UPDATE users SET age = 26 WHERE name = '花子';

花子の年齢を26に変更します。
WHERE を書かないと全データが更新されます。

データを削除する

DELETE FROM users WHERE id = 1;

id が 1 のデータを削除します。
こちらも WHERE を忘れると全削除になります。

件数を数える

SELECT COUNT(*) FROM users;

users テーブルに何件のデータがあるかを数えます。

合計を計算する

SELECT SUM(price) FROM orders;

注文金額の合計を求めます。

平均を求める

SELECT AVG(age) FROM users;

ユーザーの年齢の平均値を計算します。

最大値と最小値を求める

SELECT MAX(age), MIN(age) FROM users;

一番高い年齢と一番低い年齢を表示します。

グループごとに集計する

SELECT user_id, COUNT(*) FROM orders GROUP BY user_id;

ユーザーごとに注文回数を数えます。

集計結果に条件をつける

SELECT user_id, COUNT(*)
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 3;

注文回数が3回以上のユーザーだけを表示します。
HAVING は集計後の条件指定です。

テーブルを結合する

SELECT users.name, orders.price
FROM users
JOIN orders ON users.id = orders.user_id;

ユーザー名と注文金額を一緒に表示します。
JOIN はテーブル同士をつなぐために使います。

データがなくても表示する結合

SELECT users.name, orders.price
FROM users
LEFT JOIN orders ON users.id = orders.user_id;

注文がないユーザーも含めて表示されます。

目次