質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.53%

  • MySQL

    6823questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • SQL

    2956questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

テーブルの結合について

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 650

duster

score 5

テーブルの結合について教えて下さい。

県テーブル
県コード 県名
1        A県
2        B県
3        C県

店テーブル
店コード 店名
1 A店
2 B屋

店舗数テーブル
県コード 店コード 店舗数
1 1 3
1 2 4
2 2 5

上記のテーブルを結合した場合の結果が、

県コード 店コード 店名 店舗数
1 1 A店 3
1 2 B店 4
2 1 A店 0
2 2 B店 5
3 1 A店 0
3 2 B店 0

上記のように、店舗数テーブルにレコードがない、
県テーブルの県コード’3’の情報も取得したいと考えております。

ご教授の程、よろしくお願い致します。

ツール:A5
言語:MySQL

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+3

SELECT p.県コード, s.店コード, s.店名, IFNULL(nos.店舗数, 0) AS 店舗数
FROM 県テーブル AS p
INNER JOIN 店テーブル AS s
LEFT OUTER JOIN 店舗数テーブル AS nos
  ON p.県コード = nos.県コード AND s.店コード = nos.店コード
ORDER BY 県コード, 店コード;


http://sqlfiddle.com/#!9/b51a5/1

ポイントは、県テーブル店テーブルを INNER JOIN する際に結合条件を指定しないことです。
https://dev.mysql.com/doc/refman/5.6/ja/join.html

結合条件が存在しない場合、INNER JOIN と , (カンマ) は意味的に同等です。どちらも、指定されたテーブル間のデカルト積を生成します (つまり、最初のテーブル内のすべての各行が 2 番目のテーブル内のすべての各行に結合されます)。

 別解

上の SQL文の INNER JOIN は、CROSS JOIN に置き換えることもできます。

SELECT p.県コード, s.店コード, s.店名, IFNULL(nos.店舗数, 0) AS 店舗数
FROM 県テーブル AS p
CROSS JOIN 店テーブル AS s
LEFT OUTER JOIN 店舗数テーブル AS nos
  ON p.県コード = nos.県コード AND s.店コード = nos.店コード
ORDER BY 県コード, 店コード;


http://sqlfiddle.com/#!9/b51a5/2

Panzer_vor様のコメントの通り、MySQLの場合は、どちらを使用しても結果は変わりません。
https://dev.mysql.com/doc/refman/5.6/ja/join.html

MySQL では、JOIN、CROSS JOIN、および INNER JOIN は構文上同等です (互いに置き換えることができます)。標準 SQL では、それらは同等ではありません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/29 23:35

    ご回答ありがとうございます。
    無事解決できました。
    ポイントや考え方などもまとめて頂き、ありがとうございます。

    キャンセル

  • 2017/01/30 19:49

    振る舞いは全く変わらないので好みの問題だったりしますが、当方の場合はデカルト積を作る場合はCROSS JOINを利用することが多いですね。
    理由としては「結合条件の記載漏れでは?」と勘繰られたくないからですが。

    まぁCROSS JOINの書き方をサポートしてないDBがあるのがポイントなので、INNER JOINの方が間違いはないといえば間違いないですが。

    キャンセル

  • 2017/01/31 08:54

    Panzer_vor様

    コメントありがとうございます。

    確かに、こちらの方が
    「デカルト積を生成している」
    ことが明確かもしれませんね。

    別解として、回答に追記させていただきました。

    キャンセル

  • 2017/01/31 09:04

    > KiyoshiMotokiさん
    追記対応ありがとうございます。
    プラス評価させていただきましたm(__)m

    キャンセル

  • 2017/01/31 09:06

    深謝

    キャンセル

-1

select 県.県コード, 店.店コード, 店.店名, 店舗数.店舗数
fromleft join 店舗数 on 県.県コード = 店舗数.県コード
left joinon 店舗数.店コード = 店.店コード


外部結合です

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/29 23:16

    ご回答ありがとうございます。
    試してみましたがうまくいきません。

    1 1 A店 3
    1 2 B店 4
    2 2 B店 5
    3 null null null

    上記のような結果になってしまいます。

    実際とは違う、似せた例えの例題を使用し質問させて頂いているので、
    例題の場合はそのような結果で間違いないと思います。

    もう一度実際のテーブルを見直し、質問させて頂きます。

    キャンセル

  • 2017/01/29 23:29

    すみません。順番が間違っていました。こうですかね?

    select 県.県コード, 店.店コード, 店.店名, 店舗数.店舗数
    from 店舗数
    left join 店 on 店舗数.店コード = 店.店コード
    left join 県 on 県.県コード = 店舗数.県コード

    キャンセル

  • 2017/01/29 23:38

    ご回答ありがとうございます。

    先ほどご回答頂いた方の方法(下記)でうまくいきました。

    SELECT p.県コード, s.店コード, s.店名, IFNULL(nos.店舗数, 0) AS 店舗数
    FROM 県テーブル AS p
    INNER JOIN 店テーブル AS s
    LEFT OUTER JOIN 店舗数テーブル AS nos
    ON p.県コード = nos.県コード AND s.店コード = nos.店コード
    ORDER BY 県コード, 店コード;

    何度も考えて頂きありがとうございます。

    キャンセル

-2

外部結合を使えば出来るよ

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/29 22:36

    ご回答ありがとうございます。
    外部結合を使用してみましたが、うまくいきません。


    from
    県テーブル

    left outer join 店舗数テーブル
    on 県テーブル.県コード = 店舗数テーブル.県コード

    left outer join 店テーブル
    on 店テーブル.店コード = 店舗数テーブル.店コード

    上記の記述で実行すると、

    1 1 A店 3
    1 2 B店 4
    2 2 B店 5
    3 null null null

    になります。
    結合の順番がおかしいのでしょうか。

    キャンセル

同じタグがついた質問を見る

  • MySQL

    6823questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • SQL

    2956questions

    SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。