初めに
データベースとSQLは現在のデータサイエンスに必須な知識・スキルの1つ。その基礎を
を基に学んできた。
この知識をより昇華させて「SQL中級者になりたい!」ため、同じ著者の
を参考に、更なるSQLの知識を拡充していこう。
3. 自己結合の使い方
高度なデータ処理を行いたいとき、同一のテーブルを対象に行う結合(自己結合)を行なう場合がある。
3.1 順序対のつくりかた
順序対(並び方を意識した「組み合わせ」)を作りたい場合、を用いる。
-- 順序対をつくりたい場合:CROSS JON SELECT P1.name AS [name1] ,P2.name AS [name2] FROM Product AS P1 CROSS JOIN Product AS P2 -- 以下でも作成できるが、文法ミスなのか意図したものなのかが判然としないため、避けた方がBetter SELECT P1.name AS [name1] ,P2.name AS [name2] FROM Product AS P1,Product AS P2
しかしクロス結合はすべての組み合わせをつくり冗長でコストが高いため、普段は使う必要が無い。そこでいくつか違う方法で結合することを考える。
3.2 INNER JOIN
たとえば同一要素の組み合わせを削除するには、で句にて条件を付与すればよい。
-- 同一要素の組み合わせを除外 SELECT P1.name AS [name1] ,P2.name AS [name2] FROM Product AS P1 INNER JOIN Product AS P2 ON P1.name <> P2.name -- 同一要素の組み合わせ/順序を入れ替えたペアを除外 SELECT P1.name AS [name1] ,P2.name AS [name2] FROM Product AS P1 INNER JOIN Product AS P2 ON P1.name > P2.name
で不等号は文字列型に対しても利用でき、辞書順比較として機能する。
3.3 重複行の削除方法
主キーも無いようなテーブルでは、重複行の削除が争点になり得る。もしであれば、で重複を削除できる*1。
汎用的な方法はを用いた相関サブクエリである。
DELETE FROM Product P1 WHERE EXISTS (SELECT * FROM Product P2 WHERE P1.name = P2.name AND P1.price = P2.price AND P1.rowid < P2.rowid )
3.4 まとめ
- 自己結合は非等値結合と組み合わせて用いるのが基本である。
- と組み合わせると再帰的集合を作ることができる。
- 全くもって異なるテーブルを結合していると考えれば分かりやすい。
*1:には相当する機能は実装されていない。