SQL の基礎(SELECT / WHERE)
「どんなデータが欲しいか」を宣言的に書くと、DB が取り方を考えて返してくれる言語。SELECT で選び、WHERE で絞り込むのが基本。
- 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)」は 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人
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(集計の後)。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 を書き忘れると、テーブルの全行が対象になります。「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、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。