0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SQLの複数テーブルの結合をおさらいしてみた(2)

Posted at

#左外部結合
前回(SQLの複数テーブルの結合をおさらいしてみた(1))で結合条件の列がNULLの場合や値がない場合は結合結果から除外すると説明しました。しかし、NULLの場合や値がない場合でも結果として出力する方法があります。その一つにまずは左外部結合からご紹介します。まずはコードを見てみましょう。

sql
SELECT ~ FROM 左表
LEFT JOIN 右表
ON 結合条件

今下記コードを実行した場合

sql
SELECT * FROM 家計簿
LEFT JOIN 費目
ON 家計簿.費目ID = 費目.ID

スクリーンショット 2021-10-27 19.00.20.png

費目IDが費目テーブルにない値、またはNULLであっても上記のように出力結果として取り出すことができます。(仮に左表の結合条件がNULLの場合、リストに抽出される右表の列は全てNULLになります。)

また右表の全行を全て出力する場合は右外部結合になります。コードは下記のようになります。

sql
SELECT ~ FROM 左表
RIGHT JOIN 右表
ON 結合条件

左外部結合とLEFT→RIGHTに変わっただけですね。
また、左右表の全て出力する場合は完全外部結合になります。

sql
SELECT ~ FROM 左表
FULL JOIN 右表
ON 結合条件

今紹介した3つはいずれも本来出力結果から消滅する行を出力する効果があり、総称して外部結合といいます。

###コラム
MySQLやMariaDBでは完全外部結合FULL OUTER JOINは使えません。これらの場合UNION演算にを使用することで解決できます。

sql
SELECT ~ FROM 左表
FULL JOIN 右表
ON 結合条件
UNION
SELECT ~ FROM 左表
RIGHT JOIN 右表
ON 結合条件

LEFT JOINとRIGHT JOINの両方法で出力した後にNUIONによって足し合わせるイメージになります。

#SELF JOIN(自己結合)
RDMSでは自分自身と結合することが可能です。一般的にそのような結合を自己結合といいます。
例えば下記のようなケースを見てみましょうスクリーンショット 2021-10-27 19.53.26.png

このテーブルから自己結合をすることで好きな人の部活がわかるようになります。
自己結合のイメージとしては元のテーブルを複製して、そこから結合するイメージをもつとわかりやすいです。

スクリーンショット 2021-10-27 20.02.15.png

コードで表すと

sql
SLECT クラス.名前, クラス.部活, クラス.好きな人, クラス(複製).部活 AS 好きな人の趣味
FROM クラス
LEFT JOIN クラス AS クラス(複製)
ON クラス.好きな人 = クラス(複製).名前

上のコードでのポイントはAS クラス(複製)です。自分自身のテーブル名をASで別名にすることであたかも2つの別テーブルを用意したかのように扱うことができるのです。

##参考
書籍: スッキリわかるSQL入門 第2版 ドリル222問付き! 
    中山 清喬 著/飯田 理恵子 著

「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典:https://wa3.i-3-i.info/word15317.html

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?