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

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

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

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

SQL

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

Q&A

解決済

2回答

1964閲覧

2つの表を直積する方法の違い "INNER JOIN - ON 1", "CROSS JOIN", "SELECT -, (SELECT -)"

tomptei_nickow

総合スコア7

MySQL

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

SQL

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

0グッド

0クリップ

投稿2020/02/27 07:59

編集2020/02/27 08:39

###質問内容
2つのテーブルのレコードの総当たり表を出力するためには、下記の3つの方法があると認識しております。
この3つの方法の違いについて教えてください。
パフォーマンスや、クエリ処理される手順、注意すべき点、DBによる違い等々。

方法①:INNER JOIN - ON 1
方法②: CROSS JOIN
方法③: SELECT -, (SELECT -)

また、他に方法があれば、その方法と上記3つの方法との違いについても教えてください。

###2つのテーブル
(TABLE1):

IDDATA
A100
B101
C102

(TABLE2):

IDNAME
A
B
C

###出力結果

DATANAME
100
101
102
100
101
102
100
101
102
###方法① INNER JOIN - ON 1
```SQL
SELECT T1.DATA, T2.NAME FROM TABLE1 T1
INNER JOIN TABLE2 T2 on 1
```
###方法② CROSS JOIN
```SQL
SELECT T1.DATA, T2.NAME from TABLE1 T1
CROSS JOIN TABLE2 T2
```
###方法③ SELECT -, (SELECT -)
```SQL
SELECT T1.DATA, T2.NAME FROM TABLE1 T1,
(SELECT NAME FROM TABLE2) T2
```
###前提条件
現環境はMySQLを用いています。が、他のDBも扱うため他のDBでのことについても知りたいです。
TABLE1, TABLE2 は下記でCREATE, INSERTしています。

SQL

1CREATE TABLE `TABLE1` ( 2 `ID` char(2) NOT NULL, 3 `DATA` int(4) DEFAULT NULL, 4 PRIMARY KEY (`ID`) 5) 6INSERT INTO `TABLE1` VALUES 7('A',100), 8('B',101), 9('C',102);

SQL

1CREATE TABLE `TABLE2` ( 2 `ID` char(2) NOT NULL, 3 `NAME` char(4) DEFAULT NULL, 4 PRIMARY KEY (`ID`) 5) 6INSERT INTO `TABLE2` VALUES 7('A','あ'), 8('B','い'), 9('C','う');

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

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

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

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

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

Orlofsky

2020/02/27 08:23

タグは実際に使うデータベースだけにしましょう。何でも数撃ちゃ当たると思っても同じSQLでもデータベースやそのバージョンによって方言が大きいですからエラーが出まくります。
tomptei_nickow

2020/02/27 08:37

失礼いたしました。タグを修正いたしました。 質問内容についてもご存知のことありましたらご意見いただければ幸いです。
guest

回答2

0

ベストアンサー

mysql上でinner joinとcross join(およびタダのjoin)は全て同等です
標準SQLと異なるという認識だけ必要です

投稿2020/02/28 01:39

yambejp

総合スコア114779

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

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

yambejp

2020/02/28 01:44

結局、以下は内部的に全て同等(オプティマイズされるので) select name,data from table1,table2 select name,data from table1 join table2 select name,data from table1 inner join table2 select name,data from table1 cross join table2 outer join すると処理が異なります(推奨はできませんが) select name,data from table1 left join table2 on 1 select name,data from table1 right join table2 on 1 ※right joinはleftを裏返しての処理しているだけです
tomptei_nickow

2020/03/02 05:27

回答ありがとうございました。 他の方法についても列挙していただき理解することができました。
sazi

2020/03/02 05:44 編集

@yambejpさん > mysql上でinner joinとcross join(およびタダのjoin)は全て同等です inner join とcross joinがMySQLでは同じとは一体どこにそんな文献が? ※on 指定しなければって事ですか?
yambejp

2020/03/02 06:56

TO:saziさん https://dev.mysql.com/doc/refman/5.6/ja/join.html 私も疑念があったのですが公式にそうかいてあるのでそうなんでしょう 「MySQL では、JOIN、CROSS JOIN、および INNER JOIN は構文上同等です (互いに置き換えることができます)。標準 SQL では、それらは同等ではありません。」 テーブルの列記についてはexplainの結果を参考としています
sazi

2020/03/02 07:56

@yambejpさん 引用の続きに > INNER JOIN は ON 句とともに使用され、CROSS JOIN はそれ以外のときに使用されます。 ってありますね。
yambejp

2020/03/02 08:02 編集

ところがmysqlのinner joinはonなしで動作するんですよ・・・ そしてcross joinにonが効きます mysql自体の仕様なのでそういうものだと理解するしかありません (おそらく他のRDBへの互換用のごまかしなのでしょう)
guest

0

やられたい事は直積(直積集合)言います。

cross join で表現するか単にテーブルやサブクエリーを,で区切ってfrom句に並べます。

記述の方式によってパフォーマンスに差が出る事は無いと思いますし、聞いたこともありません。

大量件数になる組み合わせの直積はあまりお勧めできるものではありません。
その直積を元に別な表と結合するような場合に性能が悪い事が多いからです。

そういった場合、一旦テーブルに落としてからインデックスなどを利用するようにします。

投稿2020/02/27 08:31

編集2020/02/27 08:36
sazi

総合スコア25173

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

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

tomptei_nickow

2020/03/02 05:27

回答ありがとうございました。 パフォーマンスについてのコメントありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問