「大人の教養・知識・気付き」を伸ばすブログ

一流の大人(ビジネスマン、政治家、リーダー…)として知っておきたい、教養・社会動向を意外なところから取り上げ学ぶことで“気付く力”を伸ばすブログです。データ分析・語学に力点を置いています。 →現在、コンサルタントの雛になるべく、少しずつ勉強中です(※2024年1月21日改訂)。

MENU

SQL中級者になる!(その03/12)

初めに

 データベースとSQLは現在のデータサイエンスに必須な知識・スキルの1つ。その基礎を

power-of-awareness.com

を基に学んできた。
 この知識をより昇華させてSQL中級者になりたい!ため、同じ著者の

を参考に、更なるSQLの知識を拡充していこう。

3. 自己結合の使い方

 高度なデータ処理を行いたいとき、同一のテーブルを対象に行う結合(自己結合)を行なう場合がある。

3.1 順序対のつくりかた

 順序対(並び方を意識した「組み合わせ」)を作りたい場合、\mathrm{CROSS\ JOIN}を用いる。

-- 順序対をつくりたい場合: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

 たとえば同一要素の組み合わせを削除するには、\mathrm{INNER\ JOIN}\mathrm{WHERE}句にて条件を付与すればよい。

-- 同一要素の組み合わせを除外
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

\mathrm{SQL}で不等号は文字列型に対しても利用でき、辞書順比較として機能する。

3.3 重複行の削除方法

 主キーも無いようなテーブルでは、重複行の削除が争点になり得る。もし\mathrm{Oracle},\mathrm{PostgreSQL}であれば、\mathrm{rowid},\mathrm{oid}で重複を削除できる*1
 汎用的な方法は\mathrm{EXISTS}を用いた相関サブクエリである。

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 まとめ

  • 自己結合は非等値結合と組み合わせて用いるのが基本である。
  • \mathrm{GROUP\ BY}と組み合わせると再帰的集合を作ることができる。
  • 全くもって異なるテーブルを結合していると考えれば分かりやすい。

*1:\mathrm{Microsoft\ SQL\ Server}には相当する機能は実装されていない。

プライバシーポリシー お問い合わせ