Open4
SQLキャッチアップ

- SQL
- DBを操作する言語
- できること
- データ操作(DML): SELECT、INSERT、UPDATE、DELETE
- データ定義(DDL): CREATE、ALTER、DROP
- データ制御(DCL): GRANT、REVOKE、COMMIT、ROLLBACK
- RDBMS上で実行
- SQLを使うには、DBを管理するシステムが必要となる(RDBMS)
- Oracle Database
- MySQL
- Postgresql
- SQLを使うには、DBを管理するシステムが必要となる(RDBMS)
- 問題を解いて学べるサイト

データ操作(DML)の基本
SELECT - データの取得
- テーブルからデータを検索・取得する
- 基本構文:
SELECT 列名 FROM テーブル名 WHERE 条件
- 全列取得:
SELECT * FROM users
- 条件指定:
SELECT name, age FROM users WHERE age >= 20
- 並び替え:
ORDER BY 列名 ASC/DESC
- 件数制限:
LIMIT 10
JOIN - テーブルの結合
- 複数テーブルを関連付けてデータを取得する
- INNER JOIN:両テーブルに存在するデータのみ取得
SELECT * FROM users INNER JOIN orders ON users.id = orders.user_id
- LEFT JOIN:左テーブルの全データ+右テーブルの一致データ
SELECT * FROM users LEFT JOIN orders ON users.id = orders.user_id
- RIGHT JOIN:右テーブルの全データ+左テーブルの一致データ
- 多対多の結合:中間テーブル経由で結合
FROM categories LEFT JOIN book_categories ON categories.id = book_categories.category_id LEFT JOIN books ON book_categories.book_id = books.id
- 結合条件:ONで指定、正確な外部キー関係を理解することが重要
集計関数とGROUP BY
- COUNT():行数をカウント
SELECT COUNT(*) FROM users
/SELECT COUNT(DISTINCT city) FROM users
- SUM():合計値
SELECT SUM(price) FROM orders
- AVG():平均値
SELECT AVG(age) FROM users
- MAX()/MIN():最大/最小値
SELECT MAX(salary), MIN(salary) FROM employees
- GROUP BY:グループ化して集計
SELECT department, COUNT(*) FROM employees GROUP BY department
- HAVING:集計結果の絞り込み
SELECT category, AVG(price) FROM products GROUP BY category HAVING AVG(price) > 1000
INSERT - データの追加
- テーブルに新しい行を追加する
- 基本構文:
INSERT INTO テーブル名 (列1, 列2) VALUES (値1, 値2)
- 全列指定:
INSERT INTO users (id, name, age) VALUES (1, '田中', 25)
- 列省略時:
INSERT INTO users VALUES (1, '田中', 25)
- 複数行追加:
VALUES (値1), (値2), (値3)
で一度に複数行追加可能
UPDATE - データの更新
- 既存データを変更する
- 基本構文:
UPDATE テーブル名 SET 列名 = 新値 WHERE 条件
- 単一更新:
UPDATE users SET age = 26 WHERE id = 1
- 複数列更新:
UPDATE users SET name = '鈴木', age = 30 WHERE id = 2
- WHERE句なし:全行が更新されるため要注意
DELETE - データの削除
- テーブルから行を削除する
- 基本構文:
DELETE FROM テーブル名 WHERE 条件
- 条件削除:
DELETE FROM users WHERE age < 18
- WHERE句なし:全データ削除となるため要注意
- TRUNCATEとの違い:DELETEは行単位、TRUNCATEはテーブル全体を高速削除
共通の注意点
- WHERE句の重要性:UPDATE/DELETEでは条件指定を忘れると全データが対象になる
- JOINの結合条件:正しい外部キー関係を指定しないと意図しないデータが取得される
- GROUP BY使用時:SELECTにはGROUP BY指定カラムか集計関数のみ記述可能
- 集計でのNULL:COUNT(*)以外の集計関数はNULLを除外して計算
- ORDER BYの複数条件:優先順位を考慮して指定
ORDER BY num DESC, name ASC
- トランザクション:BEGIN/COMMITで変更を確定、ROLLBACKで取り消し
- 実行前確認:まずSELECTで対象データを確認してから操作することを推奨

データ定義(DDL)の基本
CREATE - オブジェクトの作成
- データベースオブジェクト(テーブル、インデックス等)を新規作成する
- 基本構文:
CREATE TABLE テーブル名 (列名 データ型 制約)
- シンプルなテーブル:
CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(50))
- 制約付き:
CREATE TABLE orders (id INT PRIMARY KEY, user_id INT, FOREIGN KEY (user_id) REFERENCES users(id))
- インデックス作成:
CREATE INDEX idx_name ON users(name)
- IF NOT EXISTS:既存チェック付きで安全に作成
ALTER - オブジェクトの変更
- 既存のテーブル構造を変更する
- 基本構文:
ALTER TABLE テーブル名 ADD/MODIFY/DROP ...
- カラム追加:
ALTER TABLE users ADD email VARCHAR(100)
- カラム変更:
ALTER TABLE users MODIFY age INT NOT NULL
- カラム削除:
ALTER TABLE users DROP COLUMN email
- 制約追加:
ALTER TABLE users ADD CONSTRAINT uk_email UNIQUE (email)
- テーブル名変更:
ALTER TABLE users RENAME TO customers
DROP - オブジェクトの削除
- データベースオブジェクトを完全に削除する
- 基本構文:
DROP TABLE テーブル名
- テーブル削除:
DROP TABLE users
- 安全な削除:
DROP TABLE IF EXISTS users
- カスケード削除:
DROP TABLE users CASCADE
(依存オブジェクトも削除) - データベース削除:
DROP DATABASE test_db
- インデックス削除:
DROP INDEX idx_name
主要なデータ型
- 数値型:
INT
(整数)、DECIMAL(10,2)
(小数)、FLOAT
(浮動小数点) - 文字列型:
VARCHAR(n)
(可変長)、CHAR(n)
(固定長)、TEXT
(長文) - 日付型:
DATE
(日付)、TIME
(時刻)、DATETIME
(日時)、TIMESTAMP
- 論理型:
BOOLEAN
(真偽値) - AUTO_INCREMENT:主キーの自動採番(MySQL)、SERIAL(PostgreSQL)
主要な制約
- PRIMARY KEY:主キー(一意かつNOT NULL)
- FOREIGN KEY:外部キー(他テーブル参照)
- NOT NULL:NULL値を禁止
- UNIQUE:重複値を禁止
- DEFAULT:デフォルト値を設定
- CHECK:値の条件を指定
CHECK (age >= 0)
共通の注意点
- DROP操作の危険性:削除は取り消し不可、必ずバックアップを取る
- ALTER実行時:大規模テーブルでは処理時間が長い、メンテナンス時間帯に実行
- 命名規則:テーブル名は複数形(users)、カラム名はスネークケース(created_at)
- DBMS依存:MySQL/PostgreSQL/SQL Serverで構文に差異があるため確認が必要
- 開発時の順序:CREATE → ALTER(必要時)→ DROP(不要時)の順で管理

データ制御(DCL)の基本
GRANT - 権限の付与
- ユーザーやロールにデータベース操作の権限を与える
- 基本構文:
GRANT 権限 ON オブジェクト TO ユーザー
- 全権限付与:
GRANT ALL PRIVILEGES ON database.* TO 'user'@'localhost'
- SELECT権限:
GRANT SELECT ON users TO 'reader'@'%'
- 複数権限:
GRANT SELECT, INSERT, UPDATE ON orders TO 'operator'@'localhost'
- 権限の伝播:
GRANT SELECT ON users TO 'admin' WITH GRANT OPTION
- テーブル作成権限:
GRANT CREATE ON database.* TO 'developer'
REVOKE - 権限の取り消し
- 付与された権限を取り消す
- 基本構文:
REVOKE 権限 ON オブジェクト FROM ユーザー
- 全権限取消:
REVOKE ALL PRIVILEGES ON database.* FROM 'user'@'localhost'
- 特定権限取消:
REVOKE DELETE ON orders FROM 'operator'@'localhost'
- 複数権限取消:
REVOKE INSERT, UPDATE ON users FROM 'guest'@'%'
- GRANT OPTION取消:
REVOKE GRANT OPTION ON users FROM 'admin'
- CASCADE指定:権限の連鎖的取消(付与した先の権限も取消)
COMMIT - トランザクションの確定
- トランザクション内の変更を永続化する
- 基本構文:
COMMIT
- 自動コミット無効化:
SET AUTOCOMMIT = 0
- トランザクション開始:
BEGIN
またはSTART TRANSACTION
- 変更確定:
INSERT INTO users VALUES (1, '田中'); COMMIT;
- COMMIT後は変更を取り消せない
- 明示的コミット:
COMMIT WORK
(標準SQL)
ROLLBACK - トランザクションの取り消し
- トランザクション内の変更を破棄する
- 基本構文:
ROLLBACK
- 全変更取消:
BEGIN; DELETE FROM users; ROLLBACK;
(削除が取り消される) - セーブポイントまで戻る:
ROLLBACK TO SAVEPOINT sp1
- セーブポイント作成:
SAVEPOINT point1
- 部分的な取消:セーブポイントを活用して特定地点まで戻る
- エラー時の自動ロールバック:制約違反等で自動実行される場合あり
主要な権限の種類
- SELECT:データ参照権限
- INSERT:データ追加権限
- UPDATE:データ更新権限
- DELETE:データ削除権限
- CREATE:テーブル等の作成権限
- DROP:テーブル等の削除権限
- ALTER:テーブル構造の変更権限
- INDEX:インデックスの作成・削除権限
- ALL PRIVILEGES:全権限
トランザクション制御
- BEGIN/START TRANSACTION:トランザクション開始
- COMMIT:変更を確定して終了
- ROLLBACK:変更を破棄して終了
- SAVEPOINT:中間地点の設定
- AUTOCOMMIT:自動コミットモード(MySQL等)
- 分離レベル:READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE
共通の注意点
- 権限設計の原則:最小権限の原則(必要最小限の権限のみ付与)
- GRANT/REVOKE後:
FLUSH PRIVILEGES
で権限テーブルを再読み込み(MySQL) - トランザクションの重要性:データの整合性を保つため適切に使用
- COMMIT前の確認:一度COMMITすると取り消し不可
- デッドロック対策:長時間のトランザクションは避ける
- 本番環境:権限管理は特に慎重に、定期的な権限の棚卸しを推奨