データ活用が企業の競争力を左右する現代において、SQLはエンジニアだけでなく、マーケターやディレクターにとっても必須のスキルとなりました。
ビジネスの現場に蓄積された膨大なデータから、必要な情報を自由自在に抽出できる能力は、意思決定のスピードを劇的に高めてくれます。
本記事では、プログラミング未経験の状態から、実務で通用するレベルのデータ抽出技術を習得するための基礎知識と具体的な学習ステップを詳しく解説します。
- データベースとSQLの基本概念を理解する
- SQLの種類と役割
- SQLの実行順序:頭の中を「データベース脳」にする
- 基本のデータ抽出:SELECTとFROM
- 条件を指定してデータを絞り込む:WHERE句
- データの並び替えと取得制限:ORDER BYとLIMIT
- データの集計:集計関数とGROUP BY
- 集計結果をさらに絞り込む:HAVING句
- 実務の要:テーブルの結合 (JOIN)
- 複雑な抽出を可能にする:サブクエリ (副問合せ)
- 可読性を高める:CTE (共通テーブル式)
- データの更新と削除:INSERT, UPDATE, DELETE
- 実務で差がつくSQLのコーディング規約
- 未経験からSQLを習得するための実践ステップ
- まとめ
データベースとSQLの基本概念を理解する
SQLを学ぶ前に、まず「データベース」がどのような仕組みで動いているのかを知る必要があります。
データベースとは、大量のデータを整理して保存し、必要な時に取り出せるようにした「データの保管庫」のことです。
現代のビジネスシーンで最も広く利用されているのは、「リレーショナルデータベース (RDBMS)」と呼ばれる形式です。
リレーショナルデータベースは、Excelのシートのように、縦の「列 (カラム)」と横の「行 (レコード)」で構成される「テーブル」という単位でデータを管理します。
SQL (Structured Query Language) は、このリレーショナルデータベースに対して、「データを取ってきてほしい」「データを新しく登録してほしい」といった命令を出すための専用言語です。
SQLは世界共通の標準規格として定義されているため、一度基本を身につければ、MySQL、PostgreSQL、Oracle、SQL Server、BigQueryなど、さまざまなデータベース製品で応用が効きます。
SQLの種類と役割
SQLは、その役割に応じて大きく3つのカテゴリーに分類されます。
実務でデータ抽出をメインに行う場合、最も頻繁に使用するのは「DML」です。
| 分類 | 正式名称 | 主な命令文 (コマンド) | 役割 |
|---|---|---|---|
| DML | Data Manipulation Language | SELECT, INSERT, UPDATE, DELETE | データの検索、登録、更新、削除を行う |
| DDL | Data Definition Language | CREATE, DROP, ALTER | テーブルやデータベース自体の構造を作成・定義する |
| DCL | Data Control Language | GRANT, REVOKE, COMMIT, ROLLBACK | アクセス権限の制御や、データの確定・取消を行う |
未経験者がまずマスターすべきは、DMLの中でも特に「SELECT文」によるデータ抽出です。
業務で「売上データを分析したい」「特定のユーザーリストを作成したい」といった要望に応えるには、SELECT文の習熟が不可欠となります。
SQLの実行順序:頭の中を「データベース脳」にする
SQLを書く上で多くの初心者が躓くのが、「書く順番」と「実行される順番」が異なるという点です。
人間が読むときには SELECT から読みますが、データベース内部では以下のような順序で処理が進みます。
- FROM (どのテーブルからデータを持ってくるか)
- ON / JOIN (テーブルをどう結合するか)
- WHERE (どの行を抽出するか)
- GROUP BY (どうグループ化するか)
- HAVING (グループ化した後の絞り込み)
- SELECT (どの列を表示するか)
- DISTINCT (重複を排除するか)
- ORDER BY (どの順番で並べるか)
- LIMIT (何件取得するか)
この実行順序を意識することで、「なぜこの場所でこのエイリアス (別名) が使えないのか」といったエラーの原因を論理的に理解できるようになります。
例えば、SELECT 句で定義した別名を WHERE 句で使うことはできません。
なぜなら、データベースが WHERE で行を絞り込んでいる時点では、まだ SELECT の処理が行われていないからです。
基本のデータ抽出:SELECTとFROM
全てのSQLの基本となるのが、SELECT と FROM です。
「どのテーブルから (FROM)」「どの列を取得するか (SELECT)」を指定します。
-- usersテーブルから、ユーザー名とメールアドレスを取得する
SELECT
user_name,
email
FROM
users;
もし全ての列を取得したい場合は、アスタリスク (*) を使用します。
-- usersテーブルの全ての列を取得する
SELECT
*
FROM
users;
ただし、実務で数百万件以上のデータを扱う場合、SELECT * は動作が重くなる原因となるため、必要なカラムだけを指定して取得するのがプロフェッショナルの作法です。
条件を指定してデータを絞り込む:WHERE句
特定の条件に合致するデータだけが必要な場合、WHERE 句を使用します。
数値の比較だけでなく、文字列の検索や日付の指定も可能です。
-- 年齢が25歳以上のユーザーのみを抽出する
SELECT
user_name,
age
FROM
users
WHERE
age >= 25;
複数の条件を組み合わせるには、AND や OR を使います。
-- 25歳以上、かつ女性のユーザーを抽出する
SELECT
*
FROM
users
WHERE
age >= 25
AND gender = 'female';
便利な比較演算子と述語
実務でよく使われる便利な条件指定の方法を紹介します。
IN: 複数の値のいずれかに合致するか (例:pref_id IN (13, 14, 27))BETWEEN: 範囲内にあるか (例:price BETWEEN 1000 AND 5000)LIKE: あいまい検索 (例:user_name LIKE '田中%'※田中から始まる名前)IS NULL/IS NOT NULL: データが入っていないか、入っているか
-- 東京都、神奈川県、大阪府のいずれかに住むユーザーを抽出
SELECT
*
FROM
users
WHERE
pref_id IN (13, 14, 27);
データの並び替えと取得制限:ORDER BYとLIMIT
抽出した結果を、見やすい順番に並び替えるのが ORDER BY です。
昇順 (小さい順) は ASC、降順 (大きい順) は DESC を指定します。
-- 売上の高い順 (降順) に商品を並べる
SELECT
product_name,
price
FROM
products
ORDER BY
price DESC;
また、データ量が多すぎる場合に、上位の数件だけを確認したいときは LIMIT を使います。
-- 売上の高い上位5件だけを取得する
SELECT
product_name,
price
FROM
products
ORDER BY
price DESC
LIMIT 5;
product_name | price
-------------+-------
高級PC | 250000
高機能カメラ | 150000
最新スマホ | 120000
タブレット | 80000
モニター | 45000
データの集計:集計関数とGROUP BY
「データの個数を数える」「合計値を計算する」といった操作は、ビジネス分析の基本です。
SQLには、集計専用の関数が用意されています。
COUNT(): 行数を数えるSUM(): 合計を出すAVG(): 平均を出すMAX()/MIN(): 最大・最小を出す
これらを「カテゴリごと」に集計したい場合に使うのが GROUP BY 句です。
-- カテゴリごとの商品数と平均価格を計算する
SELECT
category_id,
COUNT(*) AS product_count,
AVG(price) AS average_price
FROM
products
GROUP BY
category_id;
ここで重要なのが AS を使ったエイリアス (別名) です。
COUNT(*) のままだと結果の列名が分かりにくいため、product_count のように直感的に理解できる名前を付ける癖をつけましょう。
集計結果をさらに絞り込む:HAVING句
WHERE 句は「元々のデータ」に対して条件をかけますが、「集計した後の結果」に対して条件をかけたい場合は HAVING 句を使用します。
-- 商品数が10個以上あるカテゴリのみを表示する
SELECT
category_id,
COUNT(*) AS product_count
FROM
products
GROUP BY
category_id
HAVING
COUNT(*) >= 10;
「WHEREは集計前、HAVINGは集計後」という違いを明確に区別することが、実務レベルへの第一歩です。
実務の要:テーブルの結合 (JOIN)
実際のデータベースでは、データは複数のテーブルに分散して保存されています。
例えば、「注文データ」にはユーザーIDだけが入っており、ユーザーの具体的な名前は「ユーザーテーブル」にある、といった具合です。
これらを一つにまとめて表示するために JOIN を使います。
INNER JOIN (内部結合)
両方のテーブルに存在するデータのみを結合します。
-- 注文データとユーザーデータを結合して、誰が何を買ったか表示する
SELECT
orders.order_id,
users.user_name,
orders.order_date
FROM
orders
INNER JOIN users
ON orders.user_id = users.user_id;
LEFT JOIN (左外部結合)
左側のテーブル (FROM句に書いたテーブル) のデータは全て残し、右側のテーブルにデータがあれば結合します。
実務では、「注文したことがないユーザーも含めて、全員の注文状況を確認したい」といったケースで多用されます。
-- ユーザー全員を抽出し、注文履歴があればそれも表示する (注文がない人はNULLになる)
SELECT
users.user_name,
orders.order_id
FROM
users
LEFT JOIN orders
ON users.user_id = orders.user_id;
この JOIN の概念をマスターできるかどうかが、初心者と中級者の大きな分かれ目となります。
複雑な抽出を可能にする:サブクエリ (副問合せ)
SQLの中に別のSQLを書き込む手法を「サブクエリ」と呼びます。
「平均価格よりも高い商品の一覧」など、一段階計算した結果を条件に使いたい場合に非常に便利です。
-- 全商品の平均価格よりも高い商品だけを取得する
SELECT
product_name,
price
FROM
products
WHERE
price > (SELECT AVG(price) FROM products);
サブクエリを使えるようになると、これまで複数回に分けて実行していた処理を一本のSQLにまとめることができるようになります。
可読性を高める:CTE (共通テーブル式)
サブクエリが入れ子になると、SQLが非常に読みづらくなってしまいます。
そこで現代的なSQL開発で推奨されているのが、WITH句を使ったCTE (共通テーブル式) です。
-- 注文数が多い優良顧客を抽出し、その詳細情報を取得する
WITH high_value_users AS (
SELECT
user_id,
COUNT(*) AS order_count
FROM
orders
GROUP BY
user_id
HAVING
COUNT(*) >= 5
)
SELECT
u.user_name,
h.order_count
FROM
users u
JOIN high_value_users h
ON u.user_id = h.user_id;
このように、一時的な名前を付けたテーブルを定義してからメインの抽出を行うことで、複雑なロジックを整理して記述できます。
実務で他人が読みやすいSQLを書くためには、この WITH 句を使いこなすことが重要です。
データの更新と削除:INSERT, UPDATE, DELETE
データ抽出だけでなく、データを操作する命令も基本として押さえておきましょう。
ただし、これらの命令はデータベースの中身を書き換えるため、実行には細心の注意が必要です。
データの登録 (INSERT)
-- 新しいユーザーを登録する
INSERT INTO users (user_name, email, age)
VALUES ('山田 太郎', 'yamada@example.com', 30);
データの更新 (UPDATE)
-- 特定のユーザーのメールアドレスを更新する
UPDATE users
SET email = 'new_email@example.com'
WHERE user_id = 1;
UPDATE文を書くときは、必ず先にWHERE句から書く習慣をつけましょう。
WHERE句を忘れると、テーブル内の全てのデータが更新されてしまうという大事故に繋がります。
データの削除 (DELETE)
-- 退会したユーザーのデータを削除する
DELETE FROM users
WHERE user_id = 1;
実務ではデータを物理的に消す DELETE よりも、有効フラグを 0 に更新するといった「論理削除」が採用されることも多いです。
実務で差がつくSQLのコーディング規約
SQLは書き方の自由度が高い言語ですが、チームで開発・分析を行う際には「読みやすさ」が重要になります。
以下のポイントを意識するだけで、プロフェッショナルなSQLに見えるようになります。
- 予約語は大文字にする:
SELECT,FROM,WHEREなどは目立つように大文字で書きます。 - インデントを揃える: 列名や条件句の開始位置を揃えることで、構造を把握しやすくします。
- テーブルにエイリアスをつける: テーブル名が長い場合は
users AS uのように短縮形を使います。 - コメントを残す: 複雑な計算式や特殊な条件には
-- コメントで意図を記します。
-- 読みやすいSQLの例
SELECT
u.user_name,
SUM(o.amount) AS total_purchase_amount
FROM
users AS u
JOIN
orders AS o ON u.user_id = o.user_id
WHERE
u.status = 'active' -- アクティブユーザーのみ
GROUP BY
u.user_id,
u.user_name
ORDER BY
total_purchase_amount DESC;
未経験からSQLを習得するための実践ステップ
SQLの基本を理解したら、次は以下のステップで学習を進めるのが効率的です。
1. 自分のPCに環境を構築する、またはブラウザ完結のツールを使う
まずは実際に手を動かせる環境を手に入れましょう。
「SQLFiddle」や「DB Fiddle」のようなブラウザ上で動くサービスを使えば、インストール不要で練習が始められます。
2. 実際のデータを想定した練習問題を解く
文法を覚えるだけでなく、「特定の条件でデータを出すにはどう書くか」というアウトプットを繰り返します。
「SQLZoo」や「LeetCode」のSQL問題などは、ゲーム感覚で学べるためおすすめです。
3. AI (ChatGPT等) をパートナーにする
2026年現在、SQLの学習においてAIの活用は欠かせません。
「この条件でデータを抽出したいけど、どう書けばいい?
」と質問したり、自分が書いたSQLの添削を依頼したりすることで、学習速度は数倍に跳ね上がります。
ただし、AIが生成したSQLを盲信せず、必ず自分で実行順序や論理を検証することが、本当のスキル定着に繋がります。
まとめ
SQLは、プログラミング言語の中でも比較的学習のハードルが低く、それでいて実務におけるインパクトが非常に大きいスキルです。
最初は SELECT や WHERE といった単純な命令から始まり、徐々に JOIN や CTE を組み合わせることで、複雑なビジネス課題を解決できるようになります。
本記事で紹介した基礎知識を土台にして、まずは簡単なクエリを書くことから始めてみてください。
データを自由に扱えるようになることで、あなたのキャリアの可能性は大きく広がるはずです。
日々の業務の中で「このデータ、自分で出せそうだな」と思える瞬間が増えてきたら、それはあなたがデータドリブンな意思決定者への道を歩み始めた証です。
