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

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

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

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

SQL

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

解決済

3回答

1001閲覧

どのような処理を行いたい時に内部結合や外部結合などテーブルを結合するのでしょうか?

widget11

総合スコア221

MySQL

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

SQL

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

1クリップ

投稿2019/02/01 17:15

内容は殆ど質問の通りです。
SQLではなくActiveRecordを例にお話すると
例えば以下のようなリレーションのあるテーブル(モデルクラス)があるとします。

######Carテーブル 

idcarName
1セダン
2カローラ
3レクサス
Wheelテーブル
idcarIdwheelName
11普通
23スタッドレス
31スリック

例えばjoin句はスタッドレスタイヤが属している車名が欲しい時にテーブルを結合させて使えたりするらしいですが。。。

車は多数の車輪を持ちうるので
has_many :wheels
belongs_to :car
というリレーションが張られているとして、

@car = Car.new @car.wheel

のような形でCarテーブルからwheelを参照出来ると思います。
このようにすればjoinを使わなくても他のテーブルを参照出来る気がするのですが、、、(逆にwheelモデルからcarモデルがこのように参照できるのかは分からないのですが、、)

今の所、join句が活きるのは例えば表にCarテーブルとWheelテーブルをくっつけて出力するくらいしかイメージがわかないです。
joinがどの様なときに多く使われるか教えて欲しいです。
使うタイミングが全くわかりません。。。よろしくお願い致します

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

wheelName が スタッドレス な車の一覧がほしい場合、どうしますか?

Car で each して car.wheel.name == "スタッドレス" なものを集めることはできます。
これでは Car が 10000 種類あると、SQL が 10000 回発行されてしまいます。
これが N+1 問題です。

これを解決する方法があります。

  • N+1問題とは

https://bmf-tech.com/posts/N+1%E5%95%8F%E9%A1%8C%E3%81%A8%E3%81%AF

  • N+1問題

https://doruby.jp/users/kodama/entries/N-1%E5%95%8F%E9%A1%8C

  • ActiveRecordのjoinsとpreloadとincludesとeager_loadの違い

https://qiita.com/k0kubun/items/80c5a5494f53bb88dc58

...
ActiveRecordでN+1クエリを潰すためにeager loadingを行う場合、preloadやincludesやeager_loadが役に立つ
...

  • RailsのActiveRecordによるJOINの挙動について改めて調べてみた

https://dev.classmethod.jp/server-side/activerecord-join/

投稿2019/02/01 22:15

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

widget11

2019/02/02 14:01

最後のリンクこれです! リレーションあるテーブルデータの取得方法についてようやくその違いが理解できました! もやもやが晴れました!ありがとうございます!
guest

0

Ruby on Rails とか Active Record というのはちょっと置いといて、一般的なデータベースに関して、表題の、

どのような処理を行いたい時に内部結合や外部結合などテーブルを結合するのでしょうか?

・・・ということについてのみ一例をレスします。

データベースは正規化されて以下のような構造になっていることがよくあると思います。(Microsoft が提供するサンプルデータベース Northwind の一部です)

イメージ説明

Products テーブルのレコード一覧を表示するような場合、SupplierID と CategoryID は数字になってしまいますが、その数字から Suppliers テーブルや Categories テーブルから名前を取得して表示したい場合、JOIN 句をつかって結合した結果を得るというのが自分の経験ではよくあるケースです。

具体的には、上の画像の Products テーブルと Categories テーブルを JOIN した場合ですが、以下の記事の一番上の画像とその下の SELECT クエリを見てください。

DataGridView に ID と名前を併記
http://surferonwww.info/BlogEngine/post/2014/02/01/how-to-show-both-id-and-name-on-datagridview-while-enabling-update.aspx

投稿2019/02/02 00:49

編集2019/02/02 00:52
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

あまり難しくかんがえなくて良いと思います。

そもそも「どのような処理を行いたい時に内部結合や外部結合などテーブルを結合するのか」は、本末転倒な考え方に見えます。まずテーブルの設計があって、そのデータの成り立ちや意義づけや管理のし易さなどから決まります。十分に他との関連を考慮して設計するでしょう。結びつきがあって、その結びつきを明らかに捉えたいときに、JOIN が自ずと必要になるのだと思います。

仮に「スマホ」と「カピバラ」というデータ(テーブル)があったとしても、ごく普通には互いの関連はなさそうですから、JOIN を用いることはまずありません。データ(テーブル)ありき、で考えるのが分かり易いかと思います。

投稿2019/02/02 00:42

matsuand

総合スコア186

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問