PostgreSQLのJOIN(結合)入門!初心者向けに他DBとの違いを完全解説
生徒
「データベースの勉強を始めたのですが、『JOIN(結合)』という言葉が出てきてつまずいています。バラバラの表をくっつけるってどういうことですか?」
先生
「例えば、学校の『出席名簿』と『住所録』が別々の紙にあると想像してください。名前をヒントにして、この2枚の紙を横につなげて1枚の大きな表にする作業がJOINですよ。」
生徒
「なるほど!でも、PostgreSQL(ポストグレスキューエル)というデータベースを使う場合、他のデータベースと何か違いがあるんでしょうか?」
先生
「PostgreSQLはとても賢くて、大量のデータをくっつけるのが得意なんです。今日はその仕組みや、他のデータベースとの細かな違いについて、パソコンを触ったことがない方にもわかるように解説しますね。」
1. SQLとは何か?
SQL(エスキューエル)は、データベースと呼ばれる「大量のデータを整理して保存する箱」に対して指示を出すための言語です。例えば、会員名簿の中から特定の人を探したり、新しい人を追加したりするときに使います。プログラミングというよりも、魔法の呪文を使って箱の中から必要な情報を取り出すようなイメージです。世界中の多くのシステムで使われており、一度覚えれば一生モノのスキルになります。
2. データベースの「JOIN(結合)」とは?
データベースを効率よく管理するために、情報は通常、小さな単位で分けて保存されています。これを「テーブル」と呼びます。例えば、「注文データ」のテーブルに注文者の名前や住所を毎回書くと、同じ人が何度も注文したときにデータが重複して無駄が増えてしまいます。そこで、「注文情報」と「顧客情報」を別々の表に分けて管理するのです。
しかし、実際にデータを見るときは、誰が何を買ったか一目で知りたいですよね。そこで登場するのがJOIN(結合)です。共通の番号(例えば顧客ID)を「手がかり」にして、複数の表を一時的に合体させる技術のことです。
ここで、具体例を見てみましょう。まずは「部署テーブル(departments)」と「社員テーブル(employees)」を用意します。
id | dept_name
---+-----------
1 | 営業部
2 | 開発部
3 | 総務部
emp_id | emp_name | dept_id
-------+----------+--------
101 | 田中太郎 | 1
102 | 佐藤花子 | 2
103 | 鈴木一郎 | 1
104 | 高橋次郎 | NULL
この2つの表を、部署ID(dept_id)を使って合体させてみましょう。これが「INNER JOIN(内部結合)」と呼ばれる、最も基本的な結合方法です。
SELECT e.emp_name, d.dept_name
FROM employees e
INNER JOIN departments d ON e.dept_id = d.id;
emp_name | dept_name
---------+-----------
田中太郎 | 営業部
佐藤花子 | 開発部
鈴木一郎 | 営業部
実行結果を見ると、社員の名前と部署名が正しくセットになって表示されました。高橋次郎さんは部署が決まっていない(NULL)ため、この結果には含まれません。このように「両方の表に存在するデータだけ」を表示するのがINNER JOINの特徴です。
3. PostgreSQLのJOINが持つ独自の特徴
PostgreSQLは、オープンソース(誰でも無料で使える)のデータベースの中でも特に「標準」を大切にしています。JOINに関しても、非常に高い精度と柔軟性を備えています。ここからは、初心者が知っておくべきPostgreSQLならではのJOINの魅力を解説します。
3-1. 結合アルゴリズムの賢さ
PostgreSQLには、複数の表をくっつける際に「どうすれば一番早く終わるか」を自動で計算する「プランナー」という頭脳が備わっています。具体的には、ハッシュ結合(Hash Join)、マージ結合(Merge Join)、ネステッドループ結合(Nested Loop Join)という3つの方法を、データの量に合わせて使い分けます。これは料理で言えば、「切るものが多いなら大きな包丁を使い、少しなら小回りのきくナイフを使う」という判断を自動でやってくれるようなものです。
3-2. 豊富な結合パターン
PostgreSQLは、標準的なJOINだけでなく、複雑な条件での結合も得意です。例えば、後述する「外部結合(OUTER JOIN)」において、どちらか一方にしかデータがなくても無理やり表示させることができます。これにより、データが欠けている部分(例えば、まだ部署が決まっていない新入社員)も漏らさずにリスト化できます。
それでは、左側の表を基準にする「LEFT JOIN(左外部結合)」の例を見てみましょう。先ほどの高橋次郎さんも含めて全員を表示したい場合に使います。
SELECT e.emp_name, d.dept_name
FROM employees e
LEFT JOIN departments d ON e.dept_id = d.id;
emp_name | dept_name
---------+-----------
田中太郎 | 営業部
佐藤花子 | 開発部
鈴木一郎 | 営業部
高橋次郎 | NULL
高橋次郎さんは部署が決まっていないので「NULL(ヌル:何もないという意味)」と表示されましたが、リストからは消えずに残っていますね。これが「LEFT JOIN」の便利なところです。
4. PostgreSQLと他DB(MySQLなど)との違い
「データベースなんてどれも同じじゃないの?」と思うかもしれませんが、実は得意分野や書き方が少しずつ違います。ここでは、PostgreSQLと、よく比較されるMySQL(マイエスキューエル)やOracle(オラクル)との違いを説明します。
4-1. FULL OUTER JOINのサポート
PostgreSQLの大きな特徴の一つに、FULL OUTER JOIN(完全外部結合)が使えるという点があります。これは「左右どちらのテーブルにしか存在しないデータも、すべて捨てずに表示する」という方法です。
実は、世界的に有名なMySQLというデータベースでは、この「FULL OUTER JOIN」を直接一行で書くことができません。PostgreSQLなら簡単に行えるため、複雑なデータ分析を行う際には非常に重宝されます。
試しに、部署はあるけれど社員が一人もいない「総務部」も含めてすべて表示してみましょう。
SELECT e.emp_name, d.dept_name
FROM employees e
FULL OUTER JOIN departments d ON e.dept_id = d.id;
emp_name | dept_name
---------+-----------
田中太郎 | 営業部
佐藤花子 | 開発部
鈴木一郎 | 営業部
高橋次郎 | NULL
NULL | 総務部
いかがでしょうか。社員がいない総務部も、部署がない高橋次郎さんも、すべての情報が網羅されました。これがPostgreSQLの強力な結合機能の一つです。
4-2. 実行計画の細かさ
プログラミング未経験の方には少し難しいかもしれませんが、PostgreSQLは「なぜこの結合方法を選んだのか」という理由を詳しく教えてくれる機能が他よりも充実しています。Oracleという有料の超高級データベースに近いほど、分析機能がしっかりしています。そのため、将来的に大規模なデータを扱うエンジニアを目指すなら、PostgreSQLでJOINを学ぶのは最高の選択と言えるでしょう。
5. JOINを扱うときの注意点(NULLの扱い)
JOINをマスターする上で一番の壁になるのが「NULL(ヌル)」の存在です。NULLとは、データが空っぽであることを指します。初心者の方は「0(ゼロ)」や「空白(スペース)」と同じだと思いがちですが、データベースの世界では「正体不明の何か」という意味になります。
JOINをするとき、このNULLが含まれていると計算がうまくいかなかったり、思わぬデータが消えてしまったりすることがあります。PostgreSQLはNULLに対して厳格なので、結合条件を書くときは「もしデータが空だったらどう表示するか」を常に意識することが大切です。これを解決するために「COALESCE(コアレス)」という関数を使って、空っぽの場所に「部署なし」という文字を当てはめるテクニックもあります。
最後に、少し応用編として、データの掛け合わせ(CROSS JOIN)についても触れておきましょう。これは、左の表と右の表のすべての組み合わせを作る方法です。例えば「3つの商品」と「3つの色」を組み合わせて、全パターンの商品リストを作る時などに使います。
SELECT p.product_name, c.color_name
FROM products p
CROSS JOIN colors c;
このように、JOINには目的に合わせてたくさんの種類があります。最初は難しく感じるかもしれませんが、「基本は2つの表を共通の鍵でつなぐだけ」と考えれば、少しずつ仲良くなっていけるはずです。PostgreSQLという強力な道具を使いこなして、データの迷宮から必要な答えを取り出せるようになりましょう!
6. 用語解説:これだけは覚えよう
| 用語 | 意味 |
|---|---|
| テーブル | データを保存する「表」のこと。Excelのシートのようなもの。 |
| カラム(列) | 表の縦の項目。「名前」や「年齢」など。 |
| レコード(行) | 表の横の一行。一人分のデータ全体を指す。 |
| NULL(ヌル) | 「値が存在しない」状態。0でも空文字でもない特別な状態。 |
| クエリ | データベースへの「命令文」のこと。SQLで書かれる。 |