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

一流の大人(ビジネスマン、政治家、リーダー…)として知っておきたい、教養・社会動向を意外なところから取り上げ学ぶことで“気付く力”を伸ばすブログです。目下、データ分析・語学に力点を置いています。今月(2022年10月)からは多忙につき、日々の投稿数を減らします。

MENU

データベースとSQL(17/20)

はじめに

 データ分析を行う場合、データの管理運用、蓄積も重要な論点となる。そのためにはSQLやデータベースの知識が求められる。そこでまずは

を基にSQLの勉強をしていく。

14. 結合

  • 結合(\mathrm{JOIN})は別のテーブルから列を持ってきて「列を増やす」操作である。
  • 結合の基本は内部結合と外部結合である。
  • 結合演算は必ず標準の\mathrm{SQL}構文で書くようにする。

14.1 結合とは

 結合(\mathrm{JOIN})は別のテーブルから列を持ってきて「列を増やす」操作で、双方のテーブルに属する列を橋渡しの“橋”に用いて片方のみに属する列動詞を一緒の結果に含めることである。欲しいデータが1つのテーブルからのみでは選択できない場合に用いる。

14.2 内部結合 INNER JOIN

 まずは内部結合\mathrm{INNER\ JOIN}を扱う。
 \mathrm{FROM}句に\mathrm{JOIN}句を追加することで複数のテーブルを選択する。そして\mathrm{ON}句で両者の橋渡しに用いる列(結合キー)を等号でつなぐ*1
 内部結合\mathrm{INNER\ JOIN}では双方のテーブルの結合キーに共通して存在する行のみが選択される

-- INNER JOIN: ID列が双方に共通するものだと仮定する。
SELECT A1.ID, A1.a, A1.b, A2.c, A2.d
FROM ABC1 AS A1 INNER JOIN ABC2 AS A2
ON A1.ID = A2.ID
WHERE A1.ID BETWEEN 'abc100' AND 'abc900'

14.3 外部結合 OUTER JOIN

 外部結合\mathrm{OUTER\ JOIN}では、内部結合\mathrm{INNER\ JOIN}と同じように、\mathrm{FROM}句に\mathrm{JOIN}句を追加することで複数のテーブルを選択する。そして\mathrm{ON}句で両者の橋渡しに用いる列(結合キー)を等号でつなぐ*2
 内部結合\mathrm{INNER\ JOIN}では双方のテーブルの結合キーに共通して存在する行のみが選択される一方で、外部結合\mathrm{OUTER\ JOIN}では少なくとも一方のテーブルに存在する行がすべて選択される
 どちらのテーブルを主にするかを決めたい場合には、\mathrm{OUTER}の代わりに\mathrm{LEFT}(先に(=FROM側で)宣言したテーブルを主としたい場合)または\mathrm{RIGHT}(後に(=JOIN側で)宣言したテーブルを主としたい場合)を用いる。どちらを用いても問題ない*3

-- INNER JOIN: ID列が双方に共通するものだと仮定する。
SELECT A1.ID, A1.a, A1.b, A2.c, A2.d
FROM ABC1 AS A1 OUTER JOIN ABC2 AS A2
ON A1.ID = A2.ID
WHERE A1.ID BETWEEN 'abc100' AND 'abc900'

14.4 複数テーブルの結合

 結合するテーブルの数に制限はない。

14.5 クロス結合 CROSS JOIN

 結合したテーブルのレコードについて、すべての組み合わせを作る結合を\mathrm{CROSS\ JOIN}という。
 これは結果の使い道が僅少なこと、結果が非常に多くなり時間とマシンパワーを浪費するため、実務上、めったに使わない。ただし上記の\mathrm{JOIN}の基礎になるものであるから触れておく。

14.6 結合の方言と古い構文

 結合には未だに方言や古い構文が扱われている場合があり、他人の書いたクエリを見るのに知っておいた方が良い。

-- 以下は古い構文で未だに有効だが、「問題がある」
-- (1) INNER JOINなのかOUTER JOINなのかが不明
-- (2) どこが結合条件で、どこがレコードの制限条件なのかが不明
-- (3) この構文がいつ無効になるかが分からない
SELECT A1.ID, A1.a, A1.b, A2.c, A2.d
FROM ABC1 A1, ABC2 A2
WHERE A1.ID = A2.ID AND A1.ID BETWEEN 'abc100' AND 'abc900'

*1:厳密には不等号やBETWEEN句も利用可能である。

*2:厳密には不等号やBETWEEN句も利用可能である。

*3:個人的には先に出てきた方が優先とした方が分かりやすいように思えるため、LEFT JOINを用いる。

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