SQLの基礎
RDB(リレーショナルデータベース)を操作するための言語であるSQLの基礎を学びます。
SQLとは
**SQL(Structured Query Language)**は、RDBを操作するための標準言語です。
SQLでできること
| 分類 | 説明 | 例 |
|---|---|---|
| データ操作(DML) | データの追加・取得・更新・削除 | SELECT, INSERT, UPDATE, DELETE |
| データ定義(DDL) | テーブルの作成・変更・削除 | CREATE, ALTER, DROP |
| データ制御(DCL) | アクセス権限の管理 | GRANT, REVOKE |
ポイント:1年目は**データ操作(DML)**をまず覚えましょう。
基本のCRUD操作
SELECT(データの取得)
テーブルからデータを取得します。
-- 全ての列を取得
SELECT * FROM users;
-- 特定の列だけ取得
SELECT name, email FROM users;
-- 条件を指定して取得
SELECT * FROM users WHERE id = 1;
-- 複数の条件(AND)
SELECT * FROM users WHERE status = 'active' AND age >= 20;
-- 複数の条件(OR)
SELECT * FROM users WHERE status = 'active' OR role = 'admin';
INSERT(データの追加)
テーブルにデータを追加します。
-- 1件追加
INSERT INTO users (name, email) VALUES ('田中太郎', 'tanaka@example.com');
-- 複数件追加
INSERT INTO users (name, email) VALUES
('田中太郎', 'tanaka@example.com'),
('山田花子', 'yamada@example.com');
UPDATE(データの更新)
既存のデータを更新します。
-- 特定のレコードを更新
UPDATE users SET email = 'new@example.com' WHERE id = 1;
-- 複数の列を更新
UPDATE users SET name = '鈴木一郎', email = 'suzuki@example.com' WHERE id = 1;
注意:WHERE句を忘れると全レコードが更新されるので注意!
DELETE(データの削除)
データを削除します。
-- 特定のレコードを削除
DELETE FROM users WHERE id = 1;
-- 条件に合うレコードを削除
DELETE FROM users WHERE status = 'inactive';
注意:WHERE句を忘れると全レコードが削除されるので注意!
よく使う句と関数
ORDER BY(並び替え)
-- 昇順(小さい順)
SELECT * FROM users ORDER BY created_at ASC;
-- 降順(大きい順)
SELECT * FROM users ORDER BY created_at DESC;
LIMIT(件数制限)
-- 最初の10件だけ取得
SELECT * FROM users LIMIT 10;
-- 11件目から10件取得(ページング)
SELECT * FROM users LIMIT 10 OFFSET 10;
COUNT(件数を数える)
-- 全件数
SELECT COUNT(*) FROM users;
-- 条件に合う件数
SELECT COUNT(*) FROM users WHERE status = 'active';
GROUP BY(グループ化)
-- ステータスごとの件数
SELECT status, COUNT(*) FROM users GROUP BY status;
-- 部署ごとの平均年齢
SELECT department, AVG(age) FROM users GROUP BY department;
テーブルの結合(JOIN)
複数のテーブルを結合してデータを取得します。
INNER JOIN(内部結合)
両方のテーブルにデータがある場合のみ取得。
SELECT users.name, orders.amount
FROM users
INNER JOIN orders ON users.id = orders.user_id;
users テーブル orders テーブル
+----+----------+ +----+---------+--------+
| id | name | | id | user_id | amount |
+----+----------+ +----+---------+--------+
| 1 | 田中 | | 1 | 1 | 3000 |
| 2 | 山田 | | 2 | 1 | 5000 |
| 3 | 鈴木 | | 3 | 2 | 2000 |
+----+----------+ +----+---------+--------+
結果:
+--------+--------+
| name | amount |
+--------+--------+
| 田中 | 3000 |
| 田中 | 5000 |
| 山田 | 2000 |
+--------+--------+
※ 鈴木は注文がないので結果に含まれない
LEFT JOIN(左外部結合)
左側のテーブルは全て取得、右側はあれば取得。
SELECT users.name, orders.amount
FROM users
LEFT JOIN orders ON users.id = orders.user_id;
結果:
+--------+--------+
| name | amount |
+--------+--------+
| 田中 | 3000 |
| 田中 | 5000 |
| 山田 | 2000 |
| 鈴木 | NULL | ← 注文がなくてもユーザーは表示される
+--------+--------+
1年目エンジニアが意識すること
本番データベースの注意点
- 本番環境でのUPDATE、DELETEは特に注意
- 必ずWHERE句を付ける
- 実行前にSELECTで対象を確認
- 迷ったら先輩に確認
危険なSQL
-- 危険!全レコードが削除される
DELETE FROM users;
-- 危険!全レコードが更新される
UPDATE users SET status = 'inactive';
安全な手順
-- 1. まずSELECTで対象を確認
SELECT * FROM users WHERE id = 1;
-- 2. 対象が正しいことを確認してから実行
DELETE FROM users WHERE id = 1;
トランザクションを使う
重要な操作はトランザクションで囲みます。
-- トランザクション開始
BEGIN;
-- 操作を実行
UPDATE accounts SET balance = balance - 10000 WHERE id = 1;
UPDATE accounts SET balance = balance + 10000 WHERE id = 2;
-- 問題なければ確定
COMMIT;
-- 問題があれば取り消し
-- ROLLBACK;
よく使うツール
GUIツール
コマンドラインよりGUIツールを使うと操作しやすいです。
| ツール | 対応DB | 特徴 |
|---|---|---|
| DBeaver | 多数対応 | 無料、高機能 |
| MySQL Workbench | MySQL | MySQL公式 |
| pgAdmin | PostgreSQL | PostgreSQL公式 |
| A5:SQL Mk-2 | 多数対応 | 日本製、シンプル |
SQLの学習方法
- 練習用のデータベースを作る
- SELECT文をたくさん書いて慣れる
- UPDATE/DELETEは練習環境でのみ試す
- エラーメッセージを読む習慣をつける
まとめ
| 操作 | SQL | 注意点 |
|---|---|---|
| 取得 | SELECT | 最も使う、まず覚える |
| 追加 | INSERT | 必須の列を確認 |
| 更新 | UPDATE | WHERE句を忘れずに |
| 削除 | DELETE | WHERE句を忘れずに |
データベースの基本概念については データベースの基礎 を参照してください。