データベース レッスン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)でデータを分析する