【シーン別・チートシート付】SQLでよく使うコマンド21選|もうググらないための実践ガイド
導入
「またSQLコマンドの構文をググってしまった…」「このJOINの書き方で本当に合ってる?」
日々の開発業務でSQLを使うたび、そんな風に手が止まることはありませんか?
特にSQLに慣れていない方は、似たようなコマンドの使い分けや複雑な条件指定に不安を感じがちです。
毎回断片的に調べる時間は非効率ですし、小さなミスがデータの不整合につながるリスクも考えられます。
モヤモヤを一緒に解消しましょう。この記事では、そんなあなたのための実践的なSQLリファレンスを提供します。
単なるコマンドの羅列ではありません。「こういう時、どう書く?」という具体的な業務シーン別に、すぐに使えるサンプルコードを豊富に掲載しました。
JOINの使い分けは図解で、DELETEとTRUNCATEなど間違いやすいコマンドの違いも比較表で徹底解説。記事の最後には、コピペで使えるチートシートも用意しています。
この記事を読めば、SQLを調べる時間が減り、自信を持ってスピーディにコードを書けるようになります。
1. SQLコマンドの3つの分類
SQLのコマンドは、その役割によって大きく3種類に分けられます。
まずはこの全体像を掴むことで、これから学ぶコマンドがどの役割を持つのかが明確になります。
- DML (Data Manipulation Language):データを探したり、書き換えたりするためのコマンド群(例: SELECT, INSERT)
- DDL (Data Definition Language):テーブルそのものを作ったり、構造を変えたりするコマンド群(例: CREATE TABLE)
- DCL (Data Control Language):データベースへのアクセス権限を管理するコマンド群(例: GRANT, REVOKE)
本記事では、エンジニアが日々の業務で最も頻繁に利用するDMLを中心に解説していきます。
(SQLの基本や実行順については『初心者向けSQL講座|SELECT文の書き方と実行順を完全解説』をご参照ください)
用語解説:SQL
データベースに対してデータの検索・追加・更新・削除などを行うための標準的な言語。Structured Query Languageの略。用語解説:データベース
データを体系的に保存・管理するシステム。RDB(リレーショナルデータベース)が主流。用語解説:DML/DDL/DCL
DMLはデータ操作、DDLは構造定義、DCLは権限管理を担うSQLコマンドの分類。用語解説:テーブル
データベース内でデータを行と列で管理する単位。Excelの表のようなイメージ。
2. 【シーン別】やりたいことから探す!SQLコマンド実践サンプル集
ここでは、具体的な業務シーンを想定したサンプルコードを紹介します。
以下の2つのテーブル(usersとorders)が存在することを前提として読み進めてください。
- usersテーブル:ユーザー情報を格納
- ordersテーブル:注文情報を格納
(1) 基本的なデータ抽出:特定条件のユーザーを探す
シーン:開発部門に所属するユーザーを一覧表示したい
SELECT id, name, department
FROM users
WHERE department = '開発';
シーン:「鈴木」という姓を持つユーザーを探したい
SELECT id, name
FROM users
WHERE name LIKE '鈴木%';
(2) 複数条件での絞り込み:期間とステータスでユーザーを絞る
シーン:開発部門「または」営業部門に所属するユーザーを探したい
SELECT id, name, department
FROM users
WHERE department IN ('開発', '営業');
シーン:2024年1月以降に登録した「かつ」アクティブなユーザーを探したい
SELECT id, name, created_at
FROM users
WHERE created_at >= '2024-01-01' AND is_active = true;
(3) データの結合:ユーザー情報と注文履歴を紐付ける
シーン:注文履歴のあるユーザー名とその注文内容を一覧表示したい
SELECT
u.name,
o.item_name,
o.price
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
(JOINの基本や使い分けについては『SQL JOINの基本から実践まで|INNER・LEFT・RIGHT・OUTER JOINの違いをわかりやすく解説』をご参照ください)
用語解説:JOIN
複数のテーブルを特定のキー(例:user_id)で結合し、関連するデータをまとめて取得するSQLの機能。用語解説:INNER JOIN / LEFT JOIN
INNER JOINは両方のテーブルに該当データがある場合のみ結合、LEFT JOINは左側のテーブルの全データを残す。
(4) 集計とグルーピング:部署ごとのアクティブユーザー数を数える
シーン:部署ごとにユーザーが何人いるか知りたい
SELECT department, COUNT(*) AS user_count
FROM users
GROUP BY department;
用語解説:GROUP BY
指定した列ごとにデータをグループ化し、集計関数(COUNT, SUMなど)と組み合わせて集計するSQLの構文。用語解説:COUNT
行数や特定列の値の個数を数える集計関数。
シーン:ユーザー数が3人以上いる部署だけを表示したい
SELECT department, COUNT(*) AS user_count
FROM users
GROUP BY department
HAVING COUNT(*) >= 3;
(5) データ操作:テストユーザーを一括登録・更新・削除する
シーン:新しいユーザーを1件登録したい
INSERT INTO users (id, name, department, is_active, created_at)
VALUES (101, 'テストユーザー', 'QA', true, '2024-05-20');
用語解説:INSERT/UPDATE/DELETE
INSERTは新規データ追加、UPDATEは既存データの更新、DELETEはデータの削除を行うSQLコマンド。用語解説:WHERE句
データの抽出や更新・削除の対象を条件指定するための構文。WHEREを付け忘れると全件操作になるため注意。
シーン:特定のユーザーの所属部署を変更したい
UPDATE users
SET department = '品質保証'
WHERE id = 101;
シーン:不要になったテストユーザーを削除したい
DELETE FROM users
WHERE name = 'テストユーザー';
(6) SQLの可読性UP:複雑なクエリをシンプルにする
シーン:各部署の売上合計を算出し、その中で売上が10万円以上の部署名を表示したい
WITH department_sales AS (
SELECT
u.department,
SUM(o.price) AS total_sales
FROM users u
JOIN orders o ON u.id = o.user_id
GROUP BY u.department
)
SELECT department, total_sales
FROM department_sales
WHERE total_sales >= 100000;
3. 【図解】もう迷わない!JOINとサブクエリの使い分け
INNER JOIN vs LEFT JOIN:紐づくデータがない時どうなる?
- INNER JOIN:両方のテーブルに、結合キー(user_id)で紐づくデータが存在する場合のみ結果を返します。
-
LEFT JOIN:左側(users)のデータはすべて表示。右側(orders)に紐づくデータがなくても、NULLとして結果を返します。
「まだ一度も注文していないユーザー」を探す際にも使えます。
パフォーマンスはどっちが良い?JOINとサブクエリの使いどころ
- 一般的には、データベースのオプティマイザが効率的な実行計画を立てやすいため、JOINの方がサブクエリよりもパフォーマンスが良いケースが多いです。
- JOIN:複数テーブルの列を組み合わせて、1つの大きな結果セットとして扱いたい場合
- サブクエリ:IN句の条件として別のクエリ結果を使いたい場合や、JOINではロジックが複雑になりすぎる場合
4. 【要注意】データを壊さないためのコマンド比較:DELETE, TRUNCATE, DROP
これらはすべてデータを「消す」コマンドですが、その対象範囲と挙動が全く異なります。
誤って使うと、復旧困難なデータ損失につながるため、違いを正確に理解しましょう。
| コマンド | 対象範囲 | 取り消し可否 | 速度 | 特徴 |
|---|---|---|---|---|
| DELETE | 指定した行(レコード) | 可能(ROLLBACK) | 遅い | 1行ずつ削除処理。WHERE句で対象を指定できる。 |
| TRUNCATE | テーブル内の全行 | 不可 | 速い | テーブル自体は残し、中身だけを高速に空にする。 |
| DROP | テーブルそのもの | 不可 | 速い | テーブルの構造ごと、データもろとも完全に削除する。 |
- 特定のレコードだけを消したいならDELETE
- テーブルのデータだけを全件リセットしたいならTRUNCATE
- テーブル自体が不要になった場合にのみDROP
- DELETEやUPDATEを実行する前は、必ず
SELECT文で対象データを確認する
(DELETEやTRUNCATE、DROPの違い・注意点については『SQL IN・EXISTS・JOINの違い徹底解説|安全で速い選び方と実践7チェック』もご参照ください)
用語解説:DELETE/TRUNCATE/DROP
DELETEは行単位削除(元に戻せる)、TRUNCATEはテーブル全行削除(元に戻せない)、DROPはテーブル自体を削除(元に戻せない)。用語解説:ROLLBACK
直前の操作を取り消して元に戻すデータベースの機能。TRUNCATEやDROPは基本的にROLLBACK不可。
5. コピペで即戦力!SQLコマンドチートシート
この記事で紹介した実践的なサンプルコードをまとめました。日々の業務で「あの書き方、どうだっけ?」となった時に、このセクションをコピーしてご活用ください。
SELECT id, name FROM users WHERE department = '開発';
SELECT id, name FROM users WHERE department IN ('開発', '営業');
SELECT u.name, o.item_name FROM users u JOIN orders o ON u.id = o.user_id;
SELECT department, COUNT(*) FROM users GROUP BY department;
SELECT department, COUNT(*) FROM users GROUP BY department HAVING COUNT(*) >= 3;
INSERT INTO users (id, name, department) VALUES (101, '新規ユーザー', 'QA');
UPDATE users SET department = '品質保証' WHERE id = 101;
DELETE FROM users WHERE id = 101;
6. FAQセクション
-
Q1. WHERE句でNULLのレコードを抽出するには?
SELECT * FROM users WHERE department IS NULL;用語解説:NULL
データが未入力・未設定であることを示す特別な値。0や空文字とは異なる。 -
Q2. UNIONとUNION ALLの違いは?
- UNION:重複する行を自動的に排除
- UNION ALL:重複を気にせず全ての結果を返す(一般的に高速)
-
Q3. SQLコマンドで大文字と小文字は区別される?
コマンド自体は区別しないDBが多いが、データの区別は照合順序次第 -
Q4. COUNT(*)とCOUNT(列名)の違いは?
- COUNT(*):NULL含む全行数
- COUNT(列名):NULLでない行のみ
-
Q5. SQLインジェクション対策は?
ユーザー入力は直接結合せず、プレースホルダ(バインド変数)を使う
7. まとめ
本記事では、SQLに慣れていない方が実務で頻繁に遭遇するシーン別に、よく使うSQLコマンドを解説しました。
用語解説:リファレンス
実務で困ったときにすぐ参照できる「逆引き辞典」的な資料や記事のこと。
- SQLコマンドはDML, DDL, DCLの3つに大別される
- 「やりたいこと」から逆引きできる実践的なサンプルが開発効率を上げる
- JOINやDELETE/TRUNCATEなど、つまずきやすいコマンドは違いを正確に理解することが重要
最初は覚えることが多く大変に感じるかもしれませんが、コマンドの役割と具体的な利用シーンを結びつけていくことで、知識は着実に定着します。
ぜひコードをコピペして、まずは動かしてみてください。