SQL入門をやさしく図解 — SELECT・WHERE・JOIN・GROUP BY
「SQLってどう読むの?」——SQLは、表形式のデータベースからほしいデータを取り出す言語です。難しそうに見えますが、基本は「どの列を・どの表から・どんな条件で」の3つ。この記事では、SELECTの基本から、絞り込み・並べ替え・テーブル結合(JOIN)・集計(GROUP BY)までを、具体的な表で図解します。表の分け方は データベースの正規化 もどうぞ。
SQLとは — 「何が欲しいか」を書く言語
SQLは、リレーショナルデータベース(行と列の表でデータを管理する仕組み)を操作する言語です。データの検索(SELECT)・追加(INSERT)・更新(UPDATE)・削除(DELETE)ができます。特徴は、「1行ずつこう処理して…」という手順ではなく、「こういう条件のデータが欲しい」と結果を宣言すれば、あとはデータベースが最適な方法で取り出してくれる点です。
例として、次の「商品テーブル」を使います。
| 商品番号 | 商品名 | 分類 | 単価 |
|---|---|---|---|
| P01 | りんご | 果物 | 100 |
| P02 | みかん | 果物 | 80 |
| P03 | にんじん | 野菜 | 60 |
| P04 | ぶどう | 果物 | 300 |
SELECT・FROM・WHERE — 取り出しの基本形
SQLの基本は3点セットです。SELECT(どの列を)・FROM(どの表から)・WHERE(どんな条件で)。
SELECT 商品名, 単価
FROM 商品テーブル
WHERE 分類 = '果物' AND 単価 <= 100;
これは「商品テーブルから、分類が果物かつ単価が100円以下の行の、商品名と単価を取り出す」という意味。結果は次のとおりです。
| 商品名 | 単価 |
|---|---|
| りんご | 100 |
| みかん | 80 |
WHEREの条件には =・<・>・<=・>=・<>(等しくない)や、AND・OR・NOT(論理演算と同じ)、あいまい検索の LIKE、範囲の BETWEEN、候補列挙の IN などが使えます。
ORDER BY — 並べ替え
結果を並べ替えるには ORDER BY。ASC で昇順(小さい順)、DESC で降順(大きい順)です。
SELECT 商品名, 単価 FROM 商品テーブル ORDER BY 単価 DESC;
単価の高い順(ぶどう300→りんご100→みかん80→にんじん60)に並びます。並べ替えの仕組みは ソートアルゴリズムの可視化 で見られます。
JOIN — 分けた表をつなぐ
正規化でテーブルを分けると(正規化の記事参照)、情報を1つにまとめるには結合(JOIN)が必要です。JOINは共通する列(キー)を手がかりに、表を横につなげます。「注文明細テーブル」と「商品テーブル」を商品番号でつなぐ例:
SELECT 注文明細.注文番号, 商品.商品名
FROM 注文明細 JOIN 商品 ON 注文明細.商品番号 = 商品.商品番号;
GROUP BY と集約関数 — 集計する
「分類ごとの商品数」「商品ごとの売上合計」のような集計は、GROUP BY(グループにまとめる)と集約関数を組み合わせます。
| 関数 | 意味 |
|---|---|
| COUNT( ) | 件数を数える |
| SUM( ) | 合計を出す |
| AVG( ) | 平均を出す |
| MAX( ) / MIN( ) | 最大 / 最小 |
SELECT 分類, COUNT(*), AVG(単価)
FROM 商品テーブル
GROUP BY 分類;
「分類ごとに、商品の件数と平均単価を出す」という意味。果物(3件・平均160円)、野菜(1件・平均60円)のようにまとまります。集計した後のグループを絞り込むには HAVING を使います(例:HAVING COUNT(*) >= 2 で2件以上の分類だけ)。
WHERE と HAVING の違い(頻出)
| WHERE | HAVING | |
|---|---|---|
| 絞り込む対象 | 集計前の個々の行 | 集計後のグループ |
| 使う場面 | 「単価100円以上の行だけ」 | 「合計が1万円以上のグループだけ」 |
| 集約関数 | 使えない | 使える(COUNT等で条件) |
基本情報技術者試験ではこう出る
「与えられたSELECT文の実行結果を選ぶ」「WHEREとHAVINGの違い」「JOINで結合した結果」「GROUP BYと集約関数(COUNT・SUM・AVG)」が定番です。実行順序(FROM→WHERE→GROUP BY→HAVING→SELECT→ORDER BY)を意識すると、結果を正しく追えます。SQLは正規化で分けた表を扱う言語なので、データベースの正規化とセットで学ぶと理解が深まります。
よくある質問
Q. 内部結合と外部結合の違いは?
A. 内部結合(INNER JOIN)は、両方のテーブルに対応がある行だけを取り出します。外部結合(LEFT/RIGHT OUTER JOIN)は、片方に対応がなくても、一方のテーブルの行はすべて残します(対応がない部分はNULL)。「注文のない商品も一覧に出したい」ときは外部結合を使います。
Q. NULLとは?
A. 「値が入っていない(未設定)」ことを表す特別な状態で、0や空文字とは別物です。NULLとの比較は = NULL ではなく IS NULL / IS NOT NULL を使う点に注意します。集計でも、COUNT(列)はNULLを数えないなどの扱いの違いがあります。
Q. SQLのDDL・DML・DCLとは?
A. 命令の分類です。DDLは表の定義(CREATE・ALTER・DROP)、DMLはデータ操作(SELECT・INSERT・UPDATE・DELETE)、DCLは権限やトランザクション制御(GRANT・COMMIT・ROLLBACK)。試験ではこの分類もよく問われます。
まとめ
SQLの基本はSELECT(列)・FROM(表)・WHERE(条件)の3点セット。そこにORDER BY(並べ替え)・JOIN(表の結合)・GROUP BY+集約関数(集計)を足せば、たいていのデータ取り出しができます。WHERE=集計前の行、HAVING=集計後のグループの違いを押さえ、正規化とセットで理解しておきましょう。
関連ページ: データベースの正規化 / ソートアルゴリズム可視化 / 論理演算と真理値表 / 記事一覧