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

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

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

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

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

Q&A

解決済

3回答

3524閲覧

SQL 複数テーブルの結合 JOINについて

sanezane

総合スコア91

MySQL

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

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

0グッド

0クリップ

投稿2017/12/29 08:28

SQLを勉強しています。
以下のテーブルを結合するSQL文を見て結果を予想しろ。という内容の問題がありました。

テーブルA

A1A2
13
24

テーブルB

B1B2
12
3null

SQL:
SELECT A.A1,C.A2,B1,B2 from A JOIN B ON A.A1 = B.B1 JOIN A AS C ON B.B1 = C.A1 です。
教本にはJOINが複数あっても一つずつ結合していけばよいと書いてありましたが、
わたしは一つ目のJOINで
|A1|A2|B1|B2
|:--|:--:|--:|
|1|3|1|2

こういう形を想像していました。
その次のJOIN A AS C ON B.B1 = C.A1 がイマイチ理解できません。
Cの結合の結果

|A1|A2|B1|B2|A1|A2|
|:--|:--:|
|1|3|1|2|1|3|

となっているということでしょうか。教本を見てイメージしているとまるで新しくテーブルを作っているような感覚になり、混乱します。

結局答えは
|A1|A2|B1|B2
|:--|:--:|--:|
|1|3|1|2

だったのですが
問題集に解説がついていなくて、理解できないままでいます。
家計簿テーブルなど馴染みあるものだと理解しやすいのですが、このような形になると途端に混乱します。
どなたか解説していただけないでしょうか。
実行してみたキャプチャー画像を載せておきます。
イメージ説明

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

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

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

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

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

guest

回答3

0

スキーマー名(.の左側)を省略せずに書けばわかりやすいと思います。

1つ目の結合で:

|A.A1|A.A2|B.B1|B.B2|
|--|--|
|1|3|1|2|

2つ目の結合で:

|A.A1|A.A2|B.B1|B.B2|C.A1|C.A2|
|--|--|
|1|3|1|2|1|3|

そのうち以下のカラムを選択:

|A.A1|C.A2|B.B1|B.B2|
|--|--|
|1|3|1|2|

同じテーブル同士を結合することを「自己結合」と言いますが、別名を付けた時点で、同じ内容の別名のテーブルがもう一つあると考えれば良いです。

投稿2017/12/29 09:02

hichon

総合スコア5737

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

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

sanezane

2017/12/29 11:57

ありがとうございます!理解できました!これからスキーマを意識して順番に組み立てていきたいと思います!
guest

0

CREATE TABLE a ( a1 int,a2 int ) CREATE TABLE b ( b1 int,b2 int ) INSERT INTO a ( a1,a2 ) VALUES ( 1,3 ); INSERT INTO a ( a1,a2 ) VALUES ( 2,4 ); INSERT INTO b ( b1,b2 ) VALUES ( 1,2 ); INSERT INTO b ( b1,b2 ) VALUES ( 3,null ); SELECT A.A1,C.A2,B1,B2 from A JOIN B ON A.A1 = B.B1 JOIN A AS C ON B.B1 = C.A1

一番下のSELECT文で結合後は以下のような表が出来上がると思いますが、

A1A2B1B2A1A2
131213

select句の中で表示する列として1列目、5列目、3列目、4列目を選択しているので、

質問者様がスクリーンショットであげている結果になります。

select句の指定をアスタリスクにすれば、期待されている出力になると思います。
SELECT * from A JOIN B ON A.A1 = B.B1 JOIN A AS C ON B.B1 = C.A1

投稿2017/12/29 08:57

yuyabu

総合スコア63

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

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

sanezane

2017/12/29 11:54

ありがとうございます!頭の中のイメージに自信がなかったのですがyuyabuさんの解説を参考に組み立てをしたところ、理解できました!ありがとうございます!
guest

0

ベストアンサー

そうですね

一つ目のJOINでこうなって

A.A1A.A2B.B1B.B2
1312

次のJOINでこうなるので

A.A1A.A2B.B1B.B2C.A1C.A2
131213

総じてこうなります

A.A1C.A2B.B1B.B2
1312

投稿2017/12/29 08:51

yambejp

総合スコア114777

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

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

sanezane

2017/12/29 08:54

ありがとうございます!二つ目のJOINでの形が疑問だったので大変助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問