BackEnd

MySQLでFULL OUTER JOIN (完全外部結合)を行う

投稿日:

はじめに

テーブル結合と言えば、INNER JOIN か LEFT OUTER JOIN 位しか使用した事が無かったのですが、先日、FULL OUTER JOINを使いたいタイミングがありました。

滅多に使わないと思うので備忘録として使い方を残しておきたいと思います。

FULL OUTER JOIN とは

結合する2つのテーブル全ての列(レコード)を抽出する結合方法です。結合条件に当てはまるデータは1つの列にまとめられ、結合条件に当てはまらない場合は片方のテーブルの値はNullになります。
別の言い方をすると、LEFT OUTER JOINの結果とRIGHT OUTER JOINの結果を合わせた(重複は除く)ものと同じ結果が得られます。

具体例で見てみます。サッカー選手と所属チームのテーブルを用意します。

RDMBSはPostgreSQLを使用しています。

選手テーブル

 

選手ID 選手名 チームID
1 中田英寿 1
2 中村俊介 2
3 香川真司 3
4 久保建英 10

 

チームテーブル

チームID チーム名
1 ローマ
2 セルティック
3 マンチェスター
4 ミラン

 

この2つのテーブルをFULL OUTER JOINしてみます。
SELECT soccer_players.name, soccer_players.team_id, soccer_teams.name FROM soccer_players FULL OUTER JOIN soccer_teams ON soccer_players.team_id = soccer_teams.id

結合条件と合致しない列(久保建英とミラン)も両テーブルからNULLを含めて取得されています。

結果

選手名 チームID チーム名
中田英寿 1 ローマ
中村俊介 2 セルティック
香川真司 3 マンチェスター
久保建英 10 NULL
NULL NULL ミラン

MySQLでは

MySQLでは FULL OUTER JOIN 構文が使えないので、LEFT OUTER JOIN と RIGHT OUTER JOIN と UNION を組み合わせて対応します。
LEFT OUTER JOIN の結果と RIGHT OUTER JOIN の結果をUNIONで結合させてます。

CROSS JOIN

おまけにCROSS JOINも使った事が無かったので試してみました。
これは2つのテーブルの列の全ての組み合わせ結果を取得する事が出来ます。

上記の例で言うと、以下の結果が得られます。

選手名 チームID チーム名
中村俊介 2 ローマ
中村俊介 2 セルティック
中村俊介 2 マンチェスター
中村俊介 2 ミラン
中田英寿 1 ローマ
中田英寿 1 セルティック
中田英寿 1 マンチェスター
中田英寿 1 ミラン
久保建英 10 ローマ
久保建英 10 セルティック
久保建英 10 マンチェスター
久保建英 10 ミラン
香川真司 3 ローマ
香川真司 3 セルティック
香川真司 3 マンチェスター
香川真司 3 ミラン

さいごに

FULL OUTER JOIN と CROSS JOIN を試してみました。

使う機会は少ないと思いますが、どなたかの参考になれば。

おすすめ書籍

MySQL徹底入門 第4版 MySQL 8.0対応 SQLアンチパターン

blog-page_footer_336




blog-page_footer_336




-BackEnd
-

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

PHPerだけどKotlinを勉強したって良いよね その1〜クラス編〜

1 はじめに2 インターフェース2.1 基本2.2 デフォルト実装付メソッド2.3 同じメソッド名を持つ複数のインターフェース3 修飾子3.1 open3.2 abstract4 可視性修飾子5 さい ...

rails

RailsでSidekiqを使ってみた

1 はじめに1.1 実行環境2 前準備2.1 Redisのインストール3 Railsの準備3.1 プロジェクト作成3.2 新規登録時にAPIを叩く4 Sidekiqの準備4.1 Workerを作る5 ...

WebアプリからLINEのメッセージを送る方法

1 はじめに2 Messaging APIとは2.1 Messaging APIの仕組み2.2 Webhookイベント2.3 メッセージオブジェクトの種類2.4 料金形態3 LINE Develope ...

Go言語

GoフレームワークGinでミドルウェアを使ってログインAPIを実装

1 はじめに2 ログインAPIの作成3 ログインのセッション管理4 ミドルウェア4.1 gin.Default()4.2 Logger4.3 Recovery4.4 sessions5 独自ミドルウェ ...

Go言語

Go言語でGinkgoを利用してBDDしてみた

1 はじめに2 BDDとは3 Ginkgoについて3.1 Ginkgoの概要3.1.1 Describe3.1.2 Context3.1.3 It3.1.4 JustBeforeEach3.1.5 B ...

フォロー

blog-page_side_responsive

2023年5月
 123456
78910111213
14151617181920
21222324252627
28293031  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。