概要
SQL は、リレーショナルデータベースに対してデータの取得・更新・集計・定義を行うための言語です。このチートシートでは、PostgreSQL と MySQL で共通して使う基本 SQL と、破壊的操作の注意点をまとめます。
最初に覚える最小セット
| 操作 | SQL / コマンド |
|---|
| 接続 | psql -U user -d dbname / mysql -u user -p dbname |
| 一覧 | \dt / SHOW TABLES; |
| 構造確認 | \d table / DESCRIBE table; |
| 取得 | SELECT col FROM t WHERE cond LIMIT 10; |
| 追加 | INSERT INTO t (...) VALUES (...); |
| 更新 | UPDATE t SET col=val WHERE cond; |
| 削除 | DELETE FROM t WHERE cond; |
| 実行計画 | EXPLAIN / EXPLAIN ANALYZE |
更新・削除・DROP・TRUNCATE の前には、同じ条件で SELECT して対象行や対象オブジェクトを確認します。本番ではバックアップとロールバック方針も確認します。
接続
| コマンド | 説明 |
|---|
psql -U user -d dbname | PostgreSQL接続 |
mysql -u user -p dbname | MySQL接続 |
\q / exit | 接続終了 |
\c dbname | DB切り替え(PostgreSQL) |
use dbname; | DB切り替え(MySQL) |
データベース操作
| SQL | 説明 |
|---|
CREATE DATABASE dbname; | データベース作成 |
DROP DATABASE dbname; | データベース削除 |
\l / SHOW DATABASES; | DB一覧表示 |
\dt / SHOW TABLES; | テーブル一覧表示 |
\d table / DESCRIBE table; | テーブル構造表示 |
テーブル操作
| SQL | 説明 |
|---|
CREATE TABLE t (col type); | テーブル作成 |
DROP TABLE t; | テーブル削除 |
TRUNCATE TABLE t; | 全データ削除(高速) |
ALTER TABLE t ADD col type; | カラム追加 |
ALTER TABLE t DROP col; | カラム削除 |
ALTER TABLE t RENAME TO new; | テーブル名変更 |
注意: DROP DATABASE、DROP TABLE、TRUNCATE は復旧が難しい操作です。学習用以外では、バックアップと接続先 DB を確認してから実行してください。
データ型
| 型 | 説明 |
|---|
INTEGER / INT | 整数 |
BIGINT | 大きな整数 |
DECIMAL(p,s) | 固定小数点 |
FLOAT / REAL | 浮動小数点 |
VARCHAR(n) | 可変長文字列 |
TEXT | 長いテキスト |
BOOLEAN | 真偽値 |
DATE | 日付 |
TIMESTAMP | 日時 |
JSON / JSONB | JSONデータ |
UUID | 一意識別子 |
ポイント: VARCHAR(n)は長さ制限付き文字列、TEXTは無制限。PostgreSQLでは内部的に同じなので、制約が不要ならTEXTで十分です。
SELECT(データ取得)
| SQL | 説明 |
|---|
SELECT * FROM t; | 全カラム取得 |
SELECT col1, col2 FROM t; | 特定カラム取得 |
SELECT DISTINCT col FROM t; | 重複除去 |
SELECT * FROM t WHERE cond; | 条件指定 |
SELECT * FROM t ORDER BY col; | 並び替え |
SELECT * FROM t LIMIT 10; | 件数制限 |
SELECT * FROM t OFFSET 10; | オフセット |
WHERE 条件
| 条件 | 説明 |
|---|
col = 'value' | 等しい |
col != 'value' / col <> 'value' | 等しくない |
col > / < / >= / <= | 比較 |
col BETWEEN a AND b | 範囲 |
col IN ('a', 'b') | リスト内 |
col LIKE '%pattern%' | パターンマッチ |
col ILIKE '%pattern%' | 大文字小文字無視(PostgreSQL) |
col IS NULL | NULL判定 |
col IS NOT NULL | 非NULL判定 |
cond1 AND cond2 | AND条件 |
cond1 OR cond2 | OR条件 |
実践メモ: LIKE '%pattern%'の先頭%はインデックスが効きません。前方一致('pattern%')にするか、PostgreSQLならpg_trgm拡張でGINインデックスを使いましょう。
INSERT / UPDATE / DELETE
| SQL | 説明 |
|---|
INSERT INTO t (cols) VALUES (vals); | データ挿入 |
INSERT INTO t VALUES (vals); | 全カラム挿入 |
UPDATE t SET col=val WHERE cond; | データ更新 |
DELETE FROM t WHERE cond; | データ削除 |
注意: UPDATE/DELETEにWHERE句を忘れると全行が更新・削除されます。本番では必ずSELECTで対象行を確認してから実行しましょう。
JOIN(結合)
| SQL | 説明 |
|---|
INNER JOIN t2 ON t1.id = t2.id | 内部結合 |
LEFT JOIN t2 ON t1.id = t2.id | 左外部結合 |
RIGHT JOIN t2 ON t1.id = t2.id | 右外部結合 |
FULL OUTER JOIN t2 ON ... | 完全外部結合 |
CROSS JOIN t2 | 直積 |
集約関数
| 関数 | 説明 |
|---|
COUNT(*) | 行数カウント |
SUM(col) | 合計 |
AVG(col) | 平均 |
MIN(col) | 最小値 |
MAX(col) | 最大値 |
GROUP BY col | グループ化 |
HAVING cond | グループ条件 |
ポイント: LEFT JOINは「左テーブルの全行を保持」、INNER JOINは「両方にある行のみ」。ユーザー一覧と投稿数の取得など、投稿がないユーザーも表示したい場合はLEFT JOINを使います。
インデックス
| SQL | 説明 |
|---|
CREATE INDEX idx ON t(col); | インデックス作成 |
CREATE UNIQUE INDEX idx ON t(col); | ユニークインデックス |
DROP INDEX idx; | インデックス削除 |
\di / SHOW INDEX FROM t; | インデックス一覧 |
実践メモ: EXPLAIN ANALYZEで実行計画と実際の実行時間を確認できます。Seq Scan(全件スキャン)が表示されたらインデックス追加を検討しましょう。
トランザクション
| SQL | 説明 |
|---|
BEGIN; / START TRANSACTION; | トランザクション開始 |
COMMIT; | コミット |
ROLLBACK; | ロールバック |
SAVEPOINT name; | セーブポイント作成 |
ROLLBACK TO name; | セーブポイントまで戻る |
注意: トランザクション内で長時間処理を実行すると、ロックが保持され続けて他のクエリがブロックされます。トランザクションは短く保つのが鉄則です。
ユーティリティ
| コマンド | 説明 |
|---|
EXPLAIN query; | 実行計画表示 |
EXPLAIN ANALYZE query; | 実行計画と実行時間 |
VACUUM; | 不要領域回収(PostgreSQL) |
ANALYZE t; | 統計情報更新 |
\timing | 実行時間表示(PostgreSQL) |
まとめ
SQL は、SELECT、WHERE、JOIN、集約、トランザクション、インデックスを押さえると多くの調査と実装に対応できます。変更系の SQL は、対象確認、トランザクション、バックアップ、実行計画を意識します。
PostgreSQL と MySQL では構文や関数に差があります。迷った場合は、使っているデータベースの公式ドキュメントで確認してください。
参考リソース
← 一覧に戻る