「データを集計したい」「条件に合うデータだけ取り出したい」。そんなときに使われるのがSQLです。この記事では、SQLをまったく触ったことがない方に向けて、基礎から実際に手を動かす演習まで、順を追って解説します。読み終わるころには、簡単なデータの取り出しと集計が自分でできるようになっているはずです。
SQLとは
SQL(エスキューエル、またはシークェル)とは、データベースを操作するための言語です。「Structured Query Language(構造化問い合わせ言語)」の略で、データベースに対して「こういうデータが欲しい」「このデータを追加したい」といった指示を出すために使います。
私たちが普段使っている表計算ソフト(ExcelやGoogleスプレッドシート)を思い浮かべてみてください。あの「表」に対して、マウス操作ではなく文章のような命令文で操作するのがSQLだと考えると、イメージしやすいかもしれません。
たとえば「売上が1万円以上の注文だけ見せて」という指示は、SQLではこう書きます。
SELECT * FROM 注文 WHERE 売上 >= 10000;
英語の文章を読むように、なんとなく意味が伝わってこないでしょうか。SQLはこのように、人間にとっても比較的読みやすい形で命令を書けるのが特徴です。
データベースとテーブルの基礎
SQLを学ぶ前に、「どこに対して命令を出すのか」を知っておく必要があります。その相手がデータベースとテーブルです。
- データベース:データをまとめて保管しておく入れ物。Excelファイル1つにあたるイメージです。
- テーブル:データベースの中にある「表」。Excelでいう1枚のシートにあたります。
- 行(レコード):表の横1列分のデータ。「1人分の顧客情報」「1件分の注文」など、1つのまとまりを表します。
- 列(カラム):表の縦1列分の項目。「名前」「年齢」「価格」など、データの種類を表します。
たとえば、次のような「顧客」テーブルがあるとします。
| id | 名前 | 年齢 | 都道府県 |
|---|---|---|---|
| 1 | 田中 | 28 | 東京 |
| 2 | 佐藤 | 35 | 大阪 |
| 3 | 鈴木 | 42 | 東京 |
この表の中で、横の「田中, 28, 東京」が行、縦の「年齢」のまとまりが列です。SQLは、このテーブルに対して「東京の人だけ取り出す」「年齢の平均を出す」といった操作をしていきます。
SQLでできること
SQLでできることは、大きく分けて次の4つです。最初のうちは、特に「取り出す(SELECT)」が中心になります。
- データを取り出す(SELECT)
条件に合うデータを検索したり、集計したりします。実務で最もよく使う操作です。 - データを追加する(INSERT)
新しい行をテーブルに登録します。 - データを更新する(UPDATE)
既存のデータの内容を書き換えます。 - データを削除する(DELETE)
不要なデータを消します。
この記事では、まず一番大切な「データを取り出す(SELECT)」を中心に学んでいきます。ここが使えるようになるだけで、データ分析やレポート作成の幅が大きく広がります。
環境の準備 ― 実際に試してみよう
SQLは、読むだけより自分で打ち込んでみるほうが圧倒的に身につきます。この記事ではPostgreSQLを使って解説していきます。PostgreSQLは無料で使える高機能なデータベースで、実務でも広く使われています。
試す方法は、大きく2つあります。
- 手軽に試したい場合:ブラウザだけで使えるDB Fiddle(
https://www.db-fiddle.com/)がおすすめです。左上のメニューから「PostgreSQL」を選べば、インストール不要ですぐにPostgreSQLのSQLを実行できます。 - 手元の環境にインストールする場合:公式サイトからインストーラを入手できます。あわせてpgAdmin(PostgreSQL用のグラフィカルな操作ツール)を入れておくと、SQLの実行や結果の確認がしやすくなります。
まずはDB Fiddleで気軽に触ってみて、慣れてきたら手元にインストールする、という流れがおすすめです。
この記事の演習で使うサンプルデータは、次のSQLで作成できます。実行環境にそのまま貼り付けて実行してみてください。
CREATE TABLE orders (
id INTEGER,
顧客名 TEXT,
商品 TEXT,
価格 INTEGER,
数量 INTEGER,
都道府県 TEXT
);
INSERT INTO orders (id, 顧客名, 商品, 価格, 数量, 都道府県) VALUES
(1, '田中', 'ノート', 300, 5, '東京'),
(2, '佐藤', 'ペン', 150, 10, '大阪'),
(3, '鈴木', 'ノート', 300, 2, '東京'),
(4, '高橋', 'はさみ', 500, 1, '愛知'),
(5, '田中', 'ペン', 150, 3, '東京'),
(6, '伊藤', 'ノート', 300, 8, '大阪');
補足:PostgreSQLでは文字列を囲むときに必ずシングルクォート(
')を使います。ダブルクォート(")はテーブル名や列名を囲む用途になるので、混同しないよう注意してください。
実行すると、ordersテーブルには次のデータが入った状態になります。この記事では、これ以降このテーブルを使っていきます。
| id | 顧客名 | 商品 | 価格 | 数量 | 都道府県 |
|---|---|---|---|---|---|
| 1 | 田中 | ノート | 300 | 5 | 東京 |
| 2 | 佐藤 | ペン | 150 | 10 | 大阪 |
| 3 | 鈴木 | ノート | 300 | 2 | 東京 |
| 4 | 高橋 | はさみ | 500 | 1 | 愛知 |
| 5 | 田中 | ペン | 150 | 3 | 東京 |
| 6 | 伊藤 | ノート | 300 | 8 | 大阪 |
SQLの基本構文と関数
ここからが本題です。データを取り出すための基本的な命令を、ひとつずつ見ていきましょう。
SELECT ― 列を選んで取り出す
SELECTは「どの列を取り出すか」を指定する命令です。FROMで「どのテーブルから」を指定します。
-- すべての列を取り出す(* は「全部」の意味)
SELECT * FROM orders;
-- 顧客名と価格だけ取り出す
SELECT 顧客名, 価格 FROM orders;
下の「顧客名と価格だけ取り出す」を実行すると、指定した2列だけが返ってきます。
| 顧客名 | 価格 |
|---|---|
| 田中 | 300 |
| 佐藤 | 150 |
| 鈴木 | 300 |
| 高橋 | 500 |
| 田中 | 150 |
| 伊藤 | 300 |
WHERE ― 条件で絞り込む
WHEREを使うと、「条件に合う行だけ」を取り出せます。
-- 価格が300の注文だけ取り出す
SELECT * FROM orders WHERE 価格 = 300;
-- 東京の注文だけ取り出す
SELECT * FROM orders WHERE 都道府県 = '東京';
「東京の注文だけ取り出す」を実行すると、都道府県が東京の行だけに絞られます。
| id | 顧客名 | 商品 | 価格 | 数量 | 都道府県 |
|---|---|---|---|---|---|
| 1 | 田中 | ノート | 300 | 5 | 東京 |
| 3 | 鈴木 | ノート | 300 | 2 | 東京 |
| 5 | 田中 | ペン | 150 | 3 | 東京 |
よく使う比較の書き方は次のとおりです。
| 書き方 | 意味 |
|---|---|
= |
等しい |
<> |
等しくない |
> < |
より大きい / 小さい |
>= <= |
以上 / 以下 |
AND |
かつ(両方の条件を満たす) |
OR |
または(どちらかを満たす) |
-- 東京 かつ 価格が300以上
SELECT * FROM orders WHERE 都道府県 = '東京' AND 価格 >= 300;
ANDで2つの条件を両方満たす行だけが残ります。先ほどの東京の3行から、さらに「価格300以上」で絞られて2行になりました。
| id | 顧客名 | 商品 | 価格 | 数量 | 都道府県 |
|---|---|---|---|---|---|
| 1 | 田中 | ノート | 300 | 5 | 東京 |
| 3 | 鈴木 | ノート | 300 | 2 | 東京 |
ORDER BY ― 並び替える
ORDER BYで、結果を並び替えられます。ASCが昇順(小さい順)、DESCが降順(大きい順)です。
-- 価格の高い順に並べる
SELECT * FROM orders ORDER BY 価格 DESC;
価格の高い順(降順)に並び替わります。500が一番上に来て、同じ価格(300や150)の行はまとまって並びます。
| id | 顧客名 | 商品 | 価格 | 数量 | 都道府県 |
|---|---|---|---|---|---|
| 4 | 高橋 | はさみ | 500 | 1 | 愛知 |
| 1 | 田中 | ノート | 300 | 5 | 東京 |
| 3 | 鈴木 | ノート | 300 | 2 | 東京 |
| 6 | 伊藤 | ノート | 300 | 8 | 大阪 |
| 2 | 佐藤 | ペン | 150 | 10 | 大阪 |
| 5 | 田中 | ペン | 150 | 3 | 東京 |
集計関数 ― まとめて計算する
ここで「関数」が登場します。関数とは、データをまとめて計算してくれる便利な道具です。代表的なものは次の5つです。
| 関数 | 意味 |
|---|---|
COUNT() |
件数を数える |
SUM() |
合計を出す |
AVG() |
平均を出す |
MAX() |
最大値を出す |
MIN() |
最小値を出す |
-- 注文の件数を数える
SELECT COUNT(*) FROM orders;
-- 価格の平均を出す
SELECT AVG(価格) FROM orders;
COUNT(*)の結果は、全部で6件あるので次のようになります。集計関数を使うと、たくさんの行が1つの値にまとめられるのが特徴です。
| count |
|---|
| 6 |
AVG(価格)の結果は次のようになります。
| avg |
|---|
| 283.3333333333333333 |
平均のように割り切れない値は、このように長い小数で表示されることがあります。これは正しい動作です。見やすくしたい場合は、ROUND()という関数で桁数を指定できます(例:SELECT ROUND(AVG(価格), 1) FROM orders; で小数第1位まで)。
GROUP BY ― グループごとに集計する
GROUP BYは、集計関数と組み合わせて「グループごと」に計算するときに使います。たとえば「都道府県ごとの注文件数」を出したいときに便利です。
-- 都道府県ごとに注文件数を数える
SELECT 都道府県, COUNT(*) FROM orders GROUP BY 都道府県;
都道府県ごとにグループ分けされ、それぞれの件数が表示されます。東京が3件、大阪が2件、愛知が1件、と一目で分かります。
| 都道府県 | count |
|---|---|
| 東京 | 3 |
| 大阪 | 2 |
| 愛知 | 1 |
補足:
GROUP BYを使うと、結果の並び順は実行のたびに変わることがあります。決まった順番で表示したいときは、ORDER BYを一緒に使います(例:末尾にORDER BY COUNT(*) DESCを付けると件数の多い順)。
この命令は「都道府県」でグループに分けてから、それぞれのグループの件数を数える、という動きをします。
演習
それでは、実際に手を動かしてみましょう。先ほど作成した注文データのテーブル(orders)を使います。次の5問を、自分でSQLを書いて解いてみてください。簡単なものから少しずつ難しくなっています。
問1. ordersテーブルのすべてのデータを取り出してください。
問2. 商品が「ノート」の注文だけを取り出してください。
問3. 価格が200以上の注文を、価格の高い順に並べて取り出してください。
問4. 注文全体の「価格 × 数量」の合計(総売上)を求めてください。
問5. 都道府県ごとに、注文件数を数えてください。
まずは答えを見ずに、自分で考えて書いてみるのがおすすめです。間違えても大丈夫。エラーが出たら、その都度直していくのが上達の近道です。
解説
問1の解答
SELECT * FROM orders;
*は「すべての列」を意味します。SELECT * FROM テーブル名;が、データ取り出しの基本形です。結果は、最初に作成した6行のテーブルがそのまま表示されます。
問2の解答
SELECT * FROM orders WHERE 商品 = 'ノート';
WHEREで条件を指定します。文字列は'(シングルクォート)で囲むのがポイントです。実行すると、商品が「ノート」の3行だけが返ってきます。
| id | 顧客名 | 商品 | 価格 | 数量 | 都道府県 |
|---|---|---|---|---|---|
| 1 | 田中 | ノート | 300 | 5 | 東京 |
| 3 | 鈴木 | ノート | 300 | 2 | 東京 |
| 6 | 伊藤 | ノート | 300 | 8 | 大阪 |
問3の解答
SELECT * FROM orders WHERE 価格 >= 200 ORDER BY 価格 DESC;
「価格が200以上」をWHERE 価格 >= 200で絞り込み、「高い順」をORDER BY 価格 DESCで指定します。WHEREとORDER BYは、この順番で並べて書きます。価格150の2行が除かれ、残りが高い順に並びます。
| id | 顧客名 | 商品 | 価格 | 数量 | 都道府県 |
|---|---|---|---|---|---|
| 4 | 高橋 | はさみ | 500 | 1 | 愛知 |
| 1 | 田中 | ノート | 300 | 5 | 東京 |
| 3 | 鈴木 | ノート | 300 | 2 | 東京 |
| 6 | 伊藤 | ノート | 300 | 8 | 大阪 |
問4の解答
SELECT SUM(価格 * 数量) FROM orders;
価格 * 数量で1注文ごとの売上を計算し、それをSUM()で合計します。このように、関数の中で計算式を使うこともできます。結果は1つの値(総売上)になります。
| sum |
|---|
| 6950 |
問5の解答
SELECT 都道府県, COUNT(*) FROM orders GROUP BY 都道府県;
GROUP BY 都道府県で都道府県ごとにグループ分けし、COUNT(*)でそれぞれの件数を数えます。「〜ごとに集計する」と言われたらGROUP BY、と覚えておきましょう。
| 都道府県 | count |
|---|---|
| 東京 | 3 |
| 大阪 | 2 |
| 愛知 | 1 |
まとめ
この記事では、SQLの基礎から実際の演習までを一通り見てきました。最後に、覚えておきたいポイントを振り返ります。
- SQLは、データベースを操作するための言語。表計算ソフトを命令文で操作するイメージ。
- SELECT / FROMでデータを取り出し、WHEREで条件を絞り込む。
- ORDER BYで並び替え、集計関数(COUNT, SUM, AVG など)でまとめて計算する。
- GROUP BYで「〜ごと」の集計ができる。
SQLは、一度書き方を覚えてしまえば、あとは組み合わせの応用です。最初は短い命令から、少しずつ条件や集計を足していくと、自然と身についていきます。
次のステップとしては、複数のテーブルをつなげるJOINを学ぶと、扱えるデータの幅が一気に広がります。まずは今回の演習を何度か繰り返して、SELECTとWHEREに慣れることから始めてみてください。

