はじめに
この記事ははじめてSQLを学ぼうとするエクセルユーザーを対象にしております。
SQLの構文の各句がどのような意味合いになっているのか、エクセルのような表計算ソフトになぞってイメージを持つための一助になれば幸いです。
簡単に言うと、SQLはエクセルでやっていたフィルタリングや並び替えを、文字で指示する感覚です。マウスでポチポチやっていたことを「こうしてください」と文字で伝えるイメージになります。
エクセルとSQLの対応関係(早見表)
まず全体像を把握していただくため、エクセル操作とSQLの対応関係を示します。
| エクセルの操作 | SQLの記述 | 用途 |
|---|---|---|
| オートフィルタ | WHERE句 | データの絞り込み |
| 並び替え(昇順・降順) | ORDER BY句 | データの並び替え |
| 列の表示・非表示 | SELECT句 | 表示する列の選択 |
| シートの選択 | FROM句 | データ元の指定 |
| 表示行数の制限 | LIMIT句 | 結果の行数制限 |
つまり、エクセルでできることは基本的にSQLでも同じようにできるということです。
この記事で扱うテーブル
この記事では以下のテーブルを扱います。
佐藤さん、鈴木さん、渡辺さん3人の3科目(国語、数学、歴史)のテストの点数のデータです。
3人×3科目 なので合計で9行、データの項目はname, subject, scoreの3列 のデータとなるので
以下のような9行 × 3列 となるデータとなります。
※SQL上ではscore_tableと表します。
| name | subject | score |
|---|---|---|
| 佐藤 | 国語 | 86 |
| 佐藤 | 数学 | 73 |
| 佐藤 | 歴史 | 79 |
| 鈴木 | 国語 | 83 |
| 鈴木 | 数学 | 70 |
| 鈴木 | 歴史 | 87 |
| 渡辺 | 国語 | 90 |
| 渡辺 | 数学 | 50 |
| 渡辺 | 歴史 | 91 |
エクセルで表すとこんな感じですね。
SQLの基本構文
本記事で紹介するSQLの基本構文は以下になります。
この基本構文が理解できれば簡単なデータ抽出はできるようになるはずです。
SELECT 〇〇 -- エクセルの「列選択」
FROM 〇〇 -- エクセルの「シート選択」
WHERE 〇〇 -- エクセルの「オートフィルタ」
ORDER BY 〇〇 -- エクセルの「並び替え」
LIMIT 〇〇 -- エクセルの「表示行数制限」
;
上から順にSELECT, FROM , WHERE, ORDER BY, LIMITの各句の意味を説明していきます。
SELECT句
こちらは出力する結果の列を選択する句となります。言い方を換えると列を制御する部分といえます。
なのでここでは欲しい結果の表をイメージしたときにどんな列があるべきかをイメージするといいでしょう。
例えば、SELECT name としたならば、出力結果はnameの列だけ
SELECT name, subject としたならば、出力結果はnameとsubjectの2つの列だけとなります。
またSELECT *とするとFROM(後述)で選択したデータソースのすべての列を選択した結果を出力します。
SELECT句の例
■出力結果がnameだけの例
SELECT name
FROM score_table
;
■出力結果がnameとsubjectの2つの例
SELECT name, subject
FROM score_table
;
■すべての列を出力する例
SELECT *
FROM score_table
;
FROM句
この句は対象のデータソースを選択する部分となります。
今回はscore_tableしかないので選択の余地がありませんが、
例えば同じエクセル内に複数テーブルがあったときにどのテーブルからデータを抽出するかを判別するためにあります。
FROM句の例
具体例として以下のようなscore_tableの他に学生番号のIDと名前の対応表であるid_tableというものが別であったとします。

■score_tableをデータソースとしたときの例
SELECT *
FROM score_table
;
■id_tableをデータソースとしたときの例
SELECT *
FROM id_table
;
WHERE句
先ほどのSELECT句では列を制御する句と説明しましてが、一方でこちらは行を制御する部分です。
それこそExcelのテーブルのフィルター機能をイメージしていただければわかりやすいかと思います。
例えば、欲しいデータが国語のデータだけだったらWHERE subject = '国語'と記述することで実現できます。
Excelだとこう実現できますね。

またこの行のフィルター機能であるWHERE句は条件式で記述することができます。
例えば、80点以上の結果だけ欲しいときはWHERE score >= 80と記述します。
WHERE句の例
■国語または数学の結果を抽出したいときの例
SELECT *
FROM score_table
WHERE subject = '国語' OR subject = '数学'
;
■佐藤さんの歴史の結果を抽出したいときの例
SELECT *
FROM score_table
WHERE name = '佐藤' AND subject = '歴史'
;
■80点以上の結果を抽出したいときの例
SELECT *
FROM score_table
WHERE score >= 80
;
ORDER BY句
ORDER BY句は出力結果の行の順序をソートする機能になります。
Excelでいうとこちらの昇順、降順にソートする機能と同義になります。

SQLではソートしたい列名をして昇順にしたい場合はASC、降順にしたい場合はDESCと続けて記述します。
記述しなかった場合は昇順が適用されます。
ORDER BY句の例
■scoreを降順にして出力させたいときの例
SELECT *
FROM score_table
ORDER BY score DESC
;
■nameを昇順かつscoreを降順にして出力させたいときの例
SELECT *
FROM score_table
ORDER BY name, score DESC
;
■数学の点数のランキングを知りたい時の例
SELECT *
FROM score_table
WHERE subject = '数学'
ORDER BY score DESC
;
LIMIT句
LIMIT句は出力される行数を制限する役割があります。
今回はデータが9行とかなり少ないのですが、実際だと数万以上のデータテーブルを扱うことがよくあります。
そのような場合にこのLIMIT句は役に立ちます。
LIMIT句の例
■5行だけを出力したいときの例
SELECT *
FROM score_table
LIMIT 5
;
■scoreの上位3位出力させたいときの例
SELECT *
FROM score_table
ORDER BY score DESC
LIMIT 3
;
各句の実行順序について
これまでが各句の説明になります。
各句は上から順に実行されるのではなく、
- FROM句
- WHERE句
- SELECT句
- ORDER BY句
- LIMIT句
の順で実行されます。
つまりは、
- FROM句 でデータソースを特定し、
- WHERE句 で抽出する行データを選別し、
- SELECT句 で抽出する列データを選別し、
- ORDER BY句 で抽出されたデータの並び替えをし、
- LIMIT句 で抽出されたデータを出力する行数を制御する
ということです。
エクセルに例えると「シートを選んで→フィルタをかけて→必要な列だけ表示して→並び替えて→上位何件かだけ見る」という流れと同じです。
はじめのうちはあまり意識する必要がないのですが、後々この順序が重要になってくるケースが多々あります。
例えば、今回のデータでテストの点数(score)が上位3位のデータを抽出する際には以下のようなSQLで実現できます。これは「データの並び替え」→ 「データ出力の行数制御」の順で実行されるからこそ実現できています。
これが逆だと出力結果が上位3位とはなりません。
SELECT *
FROM score_table
ORDER BY score DESC
LIMIT 3
;
まとめ
SELECT 〇〇 -- どの列を表示するかを選択する(エクセルの列選択)
FROM 〇〇 -- どのデータ元からデータを抽出するか選択する(エクセルのシート選択)
WHERE 〇〇 -- どの行を対象にするかフィルタリングする(エクセルのオートフィルタ)
ORDER BY 〇〇 -- 出力結果を並び替える(エクセルの並び替え)
LIMIT 〇〇 -- 出力結果の行数を制限する(エクセルの表示制限)
;
この記事がエクセルは出来るけどSQLに苦手意識のある方のお力になれば幸いです。














