<CodeLearn/>
データベース レッスン2

SQL入門

データの作成・取得・更新・削除をSQLで操作しよう

テーブルの作成(CREATE TABLE)

データを保存する前に、まずテーブルを定義します。 テーブルには列名、データ型、制約(NOT NULL、UNIQUE など)を指定します。

-- ユーザーテーブルの作成
CREATE TABLE users (
  id        SERIAL PRIMARY KEY,        -- 自動採番の主キー
  name      VARCHAR(100) NOT NULL,     -- 名前(100文字以内、必須)
  email     VARCHAR(255) UNIQUE NOT NULL, -- メール(一意、必須)
  age       INTEGER,                   -- 年齢(省略可能)
  created_at TIMESTAMP DEFAULT NOW()   -- 作成日時(デフォルト: 現在)
);

-- 投稿テーブルの作成
CREATE TABLE posts (
  id        SERIAL PRIMARY KEY,
  user_id   INTEGER NOT NULL REFERENCES users(id), -- 外部キー
  title     VARCHAR(200) NOT NULL,
  body      TEXT,
  published BOOLEAN DEFAULT false,
  created_at TIMESTAMP DEFAULT NOW()
);

主なデータ型: INTEGER(整数)、VARCHAR(n)(可変長文字列)、TEXT(長文テキスト)、BOOLEAN(真偽値)、TIMESTAMP(日時)

データの挿入(INSERT)

INSERT INTO で新しいレコードを追加します。

-- 1件ずつ挿入
INSERT INTO users (name, email, age)
VALUES ('田中太郎', 'tanaka@example.com', 28);

INSERT INTO users (name, email, age)
VALUES ('鈴木花子', 'suzuki@example.com', 24);

-- 複数件を一度に挿入
INSERT INTO users (name, email, age) VALUES
  ('佐藤一郎', 'sato@example.com', 32),
  ('山田美咲', 'yamada@example.com', 27),
  ('高橋健一', 'takahashi@example.com', 35);

-- 投稿の挿入
INSERT INTO posts (user_id, title, body, published) VALUES
  (1, 'はじめまして', '最初の投稿です。', true),
  (1, 'SQLを学んでいます', 'データベースは面白い!', true),
  (2, '自己紹介', '鈴木花子です。', true),
  (3, '下書き投稿', 'まだ公開しません。', false);

データの取得(SELECT)

SELECT はデータベースで最もよく使う命令です。 条件の絞り込み、並び替え、件数制限を組み合わせてデータを取得します。

-- 全件取得
SELECT * FROM users;

-- 特定のカラムだけ取得
SELECT name, email FROM users;

-- WHERE で条件を絞る
SELECT * FROM users WHERE age >= 30;
SELECT * FROM users WHERE name = '田中太郎';
SELECT * FROM users WHERE age BETWEEN 25 AND 30;
SELECT * FROM users WHERE email LIKE '%@example.com';

-- AND / OR で複数条件
SELECT * FROM users WHERE age >= 25 AND age <= 30;
SELECT * FROM users WHERE name = '田中太郎' OR name = '鈴木花子';

-- ORDER BY で並び替え
SELECT * FROM users ORDER BY age ASC;        -- 年齢の昇順
SELECT * FROM users ORDER BY created_at DESC; -- 作成日時の降順

-- LIMIT / OFFSET でページネーション
SELECT * FROM users ORDER BY id LIMIT 10;           -- 先頭10件
SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 10; -- 11件目から10件

データの更新と削除(UPDATE / DELETE)

UPDATE で既存データを変更し、DELETE でデータを削除します。WHERE 句を忘れると全レコードが対象になるので注意!

-- 特定ユーザーのメールを更新
UPDATE users SET email = 'new-tanaka@example.com' WHERE id = 1;

-- 複数カラムを同時に更新
UPDATE users SET name = '田中太郎(更新)', age = 29 WHERE id = 1;

-- 条件に一致するレコードを削除
DELETE FROM users WHERE id = 5;

-- 注意: WHERE を忘れると全件削除!
-- DELETE FROM users;  ← 全レコード削除されてしまう!

-- テーブルごと削除
-- DROP TABLE posts;   ← テーブル自体が消える

テーブルの結合(JOIN)

複数のテーブルを結合して、関連するデータをまとめて取得します。 JOIN は RDB の最も強力な機能の一つです。

-- INNER JOIN: 両方にデータがある行のみ取得
SELECT users.name, posts.title
FROM users
INNER JOIN posts ON users.id = posts.user_id;

-- LEFT JOIN: 左テーブルの全行 + 右の一致する行
-- 投稿がないユーザーも取得される(posts側はNULL)
SELECT users.name, posts.title
FROM users
LEFT JOIN posts ON users.id = posts.user_id;

-- RIGHT JOIN: 右テーブルの全行 + 左の一致する行
SELECT users.name, posts.title
FROM users
RIGHT JOIN posts ON users.id = posts.user_id;

-- エイリアスを使うと読みやすい
SELECT u.name AS user_name, p.title AS post_title, p.created_at
FROM users u
INNER JOIN posts p ON u.id = p.user_id
WHERE p.published = true
ORDER BY p.created_at DESC;

INNER JOIN

両方のテーブルに一致するデータのみ

LEFT JOIN

左テーブルのデータは全て含む

RIGHT JOIN

右テーブルのデータは全て含む

GROUP BY と集計関数

GROUP BY でデータをグループ化し、 集計関数で合計・平均・件数などを計算します。

-- 主な集計関数
SELECT COUNT(*) FROM users;                    -- 総レコード数
SELECT AVG(age) FROM users;                     -- 年齢の平均
SELECT MAX(age), MIN(age) FROM users;          -- 最大値と最小値
SELECT SUM(age) FROM users;                     -- 合計

-- GROUP BY: ユーザーごとの投稿数
SELECT u.name, COUNT(p.id) AS post_count
FROM users u
LEFT JOIN posts p ON u.id = p.user_id
GROUP BY u.id, u.name
ORDER BY post_count DESC;

-- HAVING: グループ化した結果にさらに条件
-- 投稿が2件以上のユーザーだけ表示
SELECT u.name, COUNT(p.id) AS post_count
FROM users u
INNER JOIN posts p ON u.id = p.user_id
GROUP BY u.id, u.name
HAVING COUNT(p.id) >= 2;

-- 月別の投稿数集計
SELECT
  DATE_TRUNC('month', created_at) AS month,
  COUNT(*) AS post_count
FROM posts
WHERE published = true
GROUP BY DATE_TRUNC('month', created_at)
ORDER BY month;

まとめ

  • CREATE TABLE でテーブルを定義し、データ型と制約を設定する
  • INSERT で新しいレコードを追加する
  • SELECT で WHERE、ORDER BY、LIMIT を組み合わせてデータを取得する
  • UPDATE / DELETE でデータを変更・削除する(WHERE 句を忘れずに)
  • JOIN で複数テーブルを結合して関連データをまとめて取得する
  • GROUP BY と集計関数(COUNT、AVG、SUM)でデータを分析する