SQL(Structured Query Language)はデータベース操作のためのプログラミング言語です。しかし、標準的なSQL文では階層型データの扱いや複数テーブル間でのデータ結合(JOIN)が一見煩雑に思えることもあります。この記事では、階層型データとJOINに焦点を当て、それぞれの処理方法とその最適化手法について解説します。
階層型データとは?
階層型データは、親子関係や兄弟関係など、データ間に階層構造が存在するデータのことを指します。例えば、企業の組織図やフォルダとサブフォルダの関係などがこれに該当します。
階層型データの扱い方
SQLで階層型データを扱う際には、以下のような手法があります。
- 自己結合(Self-JOIN)
- WITH RECURSIVEクエリ
- 階層型専用の関数を用いる(DBMSに依存)
自己結合(Self-JOIN)
自己結合は、同一のテーブルをJOINする方法です。以下は、部署と上司の関係を表すテーブルから階層型データを取得するSQL例です。
SELECT a.部署, b.部署 AS 上司部署
FROM 部署テーブル AS a, 部署テーブル AS b
WHERE a.上司ID = b.ID;
JOINとは?
JOINは、複数のテーブルを結合する操作です。INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOINなどがあります。
JOINの種類
以下の表は、主なJOINの種類とその機能を説明しています。
JOINの種類 | 説明 |
---|---|
INNER JOIN | 両テーブルに存在するデータのみを結合 |
LEFT JOIN | 左テーブルのデータは全て表示し、対応する右テーブルのデータがない場合はNULLで埋める |
INNER JOINの使用例
以下のSQLは、顧客テーブルと注文テーブルをINNER JOINで結合し、顧客名と注文内容を取得します。
SELECT 顧客テーブル.顧客名, 注文テーブル.注文内容
FROM 顧客テーブル
INNER JOIN 注文テーブル ON 顧客テーブル.ID = 注文テーブル.顧客ID;
階層型データとJOINを一緒に扱う
階層型データとJOINを一緒に扱う場合は、WITH RECURSIVEクエリとJOINを組み合わせます。以下のSQLは、部署の階層をWITH RECURSIVEで取得しつつ、各部署の所属員数をJOINで取得する例です。
WITH RECURSIVE 階層部署 AS (
SELECT 部署, 上司ID FROM 部署テーブル WHERE 上司ID IS NULL
UNION ALL
SELECT a.部署, a.上司ID FROM 部署テーブル AS a
INNER JOIN 階層部署 AS b ON a.上司ID = b.ID
)
SELECT 階層部署.部署, COUNT(社員テーブル.ID) AS 所属員数
FROM 階層部署
LEFT JOIN 社員テーブル ON 階層部署.ID = 社員テーブル.部署ID
GROUP BY 階層部署.部署;
まとめ
SQLでの階層型データとJOINの扱いには多くの方法があります。特に階層型データを効率よく扱うためには、自己結合やWITH RECURSIVEクエリが有用です。また、JOINをうまく使えば、複数のテーブル間でのデータ結合もスムーズに行えます。これらのテクニックを駆使して、SQLのデータ操作をより効率的に行いましょう。
コメント