TL

SQL の基礎(SELECT / WHERE)

「どんなデータが欲しいか」を宣言的に書くと、DB が取り方を考えて返してくれる言語。SELECT で選び、WHERE で絞り込むのが基本。

基礎SQLRDBクエリ最終更新: 2026-06-04
TL;DR要点だけ先に
  • 1.SQL は「どう取るか」ではなく「何が欲しいか」を書く宣言的な言語。手順は DB(オプティマイザ)が考える。
  • 2.問い合わせの骨格は SELECT(列)/ FROM(表)/ WHERE(行の条件)。並べ替えは ORDER BY、集計は GROUP BY +集約関数。
  • 3.データを読み書きするのが DML(SELECT/INSERT/UPDATE/DELETE)、表そのものを定義するのが DDL(CREATE/ALTER/DROP)。

「宣言的」ってどういうこと?

普通のプログラミング(手続き型)なら「配列を先頭からループして、条件に合うものを別の配列に詰めて…」と手順を書きます。SQL は違います。

  • 書くのは 結果の条件(どのテーブルの・どの列を・どの行を・どう並べて)
  • 実際の取り方(どの索引を使い、どの順で結合するか)は オプティマイザ が自動で決める
-- 「price が 1000 以上の商品を、安い順で名前と価格だけ」
SELECT name, price
FROM   products
WHERE  price >= 1000
ORDER  BY price ASC;

ループも一時変数も出てきません。「何が欲しいか」だけを書いているのがポイントです。

問い合わせの骨格:SELECT / FROM / WHERE

1本の SELECT 文は、ざっくり次の3つで決まります。

役割ざっくり言うと
SELECT取り出す列を指定「どの列が欲しい?」 `*` で全列
FROM対象のテーブルを指定「どこから取る?」
WHERE行の絞り込み条件「どの行だけ?」条件に合う行だけ残す
SELECT *                 -- 全部の列
FROM   users
WHERE  age >= 20         -- 20歳以上の行だけ
   AND country = 'JP';   -- かつ 日本

WHERE行を選ぶフィルタです。条件は = <>(≠)> < のほか、BETWEEN(範囲)、IN (...)(いずれか)、LIKE 'A%'(前方一致)、IS NULL(空かどうか)などを組み合わせます。

NULL は「=」で比較できない

「値が無い(NULL)」は 0 でも空文字でもない特別な状態WHERE col = NULL は常に真にも偽にもならないので、NULL の行を狙うときは IS NULL / IS NOT NULL を使います。col <> 'A' のような条件も、NULL の行は引っかからない点に注意。

並べ替え・件数制限

  • ORDER BY 列 ASC|DESC … 昇順(ASC・既定)/降順(DESC)に並べ替え
  • LIMIT n(PostgreSQL/MySQL 系)… 先頭 n 件だけ取得。「上位ランキング」を出すときの定番
SELECT name, score
FROM   players
ORDER  BY score DESC   -- 高得点順
LIMIT  10;             -- 上位10人
ORDER BY を付けないと順序は“不定”

SQL の結果は本来「行の集合」で、並び順は保証されません。「だいたい登録順で出る」のは偶然で、DB や実行計画が変われば崩れます。順序が意味を持つなら、必ず ORDER BY を明示しましょう。

集計:GROUP BY と集約関数

「カテゴリごとの平均価格」のように、グループに束ねて要約したいときが集計です。GROUP BY でグループ化し、集約関数で各グループを1つの値に潰します。

集約関数意味
COUNT(*)行数を数えるユーザー数
SUM(列)合計売上の合計
AVG(列)平均平均価格
MAX / MIN最大 / 最小最高得点 / 最安値
SELECT   category,
         COUNT(*)   AS items,   -- グループごとの件数
         AVG(price) AS avg_price
FROM     products
GROUP BY category
HAVING   COUNT(*) >= 5          -- 5件以上のカテゴリだけ
ORDER BY avg_price DESC;
WHERE と HAVING を取り違えない

行を絞るのは WHERE(集計の前)、グループを絞るのは HAVING(集計の後)COUNT(*) のような集約結果で絞り込みたいときは WHERE では書けず、HAVING を使います。また GROUP BY を使うと、SELECT に並べてよいのは「グループ化した列」か「集約関数」だけ。素の列を混ぜるとエラー(または DB 依存の予測しづらい値)になります。

読むだけじゃない:INSERT / UPDATE / DELETE

SELECT は「読む」操作ですが、データの追加・変更・削除も SQL で行います。

-- 追加
INSERT INTO users (name, age) VALUES ('Aoi', 28);

-- 変更(WHERE を付けないと全行が対象!)
UPDATE users SET age = 29 WHERE name = 'Aoi';

-- 削除
DELETE FROM users WHERE id = 42;
UPDATE / DELETE の WHERE 忘れは事故のもと

UPDATEDELETEWHERE を書き忘れると、テーブルの全行が対象になります。「1行直すつもりが全件書き換え」は典型的な事故。本番では、まず同じ条件で SELECT して対象件数を確認してから実行するのが鉄則です。複数の変更をまとめて安全に確定/取り消ししたいならトランザクションを使います。

DDL と DML の違い

同じ SQL でも、「データを操作する」命令と**「入れ物(表の構造)を定義する」命令**は別カテゴリです。

区分対象代表的な命令
DML(データ操作)テーブルの中身(行)SELECT / INSERT / UPDATE / DELETE
DDL(データ定義)テーブルや列などの構造CREATE / ALTER / DROP / TRUNCATE
-- DDL:テーブルという“入れ物”を作る
CREATE TABLE users (
  id   INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  age  INTEGER
);

ざっくり、DDL で「箱」を用意し、DML で「中身」を出し入れするイメージです。多くの DB で DDL は実行と同時に確定(暗黙コミット)され、トランザクションで取り消せない点も DML との大きな違いです。

次に学ぶと効く

SQL は 「何が欲しいか」を宣言するだけという一点を掴めば、上の応用もすべて同じ発想で読み解けます。

データベース Article

SQL の基礎(SELECT / WHERE)を実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

SQL

比較で見る軸

難易度: basic / カテゴリ: データベース / タグ数: 3

導入後に効く点

問い合わせの骨格は SELECT(列)/ FROM(表)/ WHERE(行の条件)。並べ替えは ORDER BY、集計は GROUP BY +集約関数。

先に潰すリスク

用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。

数字・仕様の読み方
難易度
basic
カテゴリ
データベース
タグ数
3

判断チェックリスト

  • 自社の用途が「SQL / RDB」に近いか確認する。
  • 強みである「SQL は「どう取るか」ではなく「何が欲しいか」を書く宣言的な言語。手順は DB(オプティマイザ)が考える。」が本当に評価軸になるか確認する。
  • 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

SQLRDBクエリSQLRDBクエリ
参考: 公式情報