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

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

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

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

Q&A

解決済

4回答

889閲覧

SQLの結合について

ssspwp

総合スコア31

SQL

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

0グッド

0クリップ

投稿2018/05/02 03:28

編集2018/05/02 05:13

SQL

1テーブルA 2|A1|A2| 3|1 |3| 4|2||4| 5テーブルB 6|B1||B2| 7|1||2| 8|3||NULL|

1.```SQL
SELECT A1,A2,B1,B2
FROM A
JOIN B
ON A.A1=B.B1

A1とB1についてはなんとなくわかるんですけど、A2とB2を考えると?ってなります(-_-;) 答えが以下のようになっています。 |A1|A2|B1|B2| |1 |3 ||1 | 2|

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

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

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

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

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

tomari_perform

2018/05/02 03:30

テーブルAとテーブルBの例で、抽出した結果、どうなって欲しいかの記述をしてください。
guest

回答4

0

ベストアンサー

Orlofsky様の回答にあるように、抽象化した例だと理解するのに一苦労ですね。

例として良い悪いがあると思いますが、
『小学校のクラスで同じ苗字のグループを作ってみる』とすると理解の一助となりますでしょうか。
(あくまで例ですので、組内で同じ苗字がないシンプルなデータとします)


1年1組

A1(苗字)A2(名前)
佐藤太郎
鈴木一郎

1年2組

B1(苗字)B2(名前)
佐藤花子
高橋健一

  • 1年1組と1年2組で苗字が同じ生徒を抽出する。

SQLをイメージするまでもなく、以下が『苗字が同じ生徒』の抽出結果ですね。

A1(苗字)A2(名前)B1(苗字)B2(名前)
佐藤太郎佐藤花子

この時、「A1-B1」の関連性は『同じ苗字』ということで関連性が一目で分かりますね。
ただ「A2-B2」だけに着目してしまうと、何かは分かりません。

SELECT句がデータ抽出した結果のうち、表示(確認)したいデータ項目を指定する部分です。
質問者様の例ですとSELECT A1,A2,B1,B2となっているため、上記のような抽出結果となります。

SELECT句(確認したいデータ項目)を変えてみましょうか。

SQL

1SELECT A2,B2 2 FROM A 3 JOIN B 4 ON A.A1=B.B1
  • 1年1組と1年2組で苗字が同じ生徒の名前だけを抽出する。
A2(名前)B2(名前)
太郎花子

これだとA2とB2の関係性が、表示された結果からだと分かりづらいですね。
ただし、前提として自分で「1年1組と1年2組で苗字が同じ生徒の名前だけを抽出する。」としているので結果としては正しいかと思います。

ただ、視覚的にも分かりづらいので、以下のようにSELECT句(確認したいデータ項目)を変えてみましょうか。

  • 1年1組と1年2組で苗字が同じ生徒の苗字(1回だけ)と名前だけを抽出する。

SQL

1SELECT A1,A2,B2 2 FROM A 3 JOIN B 4 ON A.A1=B.B1
A1(苗字)A2(名前)B2(名前)
佐藤太郎花子

SQLではこのように、自分が抽出したいデータ項目を柔軟に指定することができます。

『A2とB2を考えると?』とありますが、その部分は「A1とB1が同じデータのそれぞれの一部分」であり、結合条件から言うと意味はありません。
結合した結果として表示させたいデータ項目として指定している、該当データのデータ項目となります。

回答が的を得てないようでしたら、『A2とB2を考えると?』の「?」の部分をどのように感じているか、具体的に記載していただけると、もう少し良い回答がつくかもしれません。

投稿2018/05/03 01:00

takyafumin

総合スコア2335

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

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

ssspwp

2018/05/04 05:06

わかりやすすぎて感動しました! ありがとうございます!!!
takyafumin

2018/05/04 08:43

理解の一助となったようで、何よりです。
guest

0

抽象化したデータでは質問された方も理解できません。もっと現実に即したデータでなぜ結合したいのか、それも結合するれつが1つで良いのか、2つ必要なのかも明示されては?

投稿2018/05/02 03:36

Orlofsky

総合スコア16415

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

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

0

抽出結果が「答え」ってことは、何かの教材ですかね?

であれば、ここではなく、教授?先生?と思われる方に質問者様ご自身が理解できるまで、
直接聞いた方が良いです。

修正依頼出した手前、回答記載しますが、
不明点は教授・先生と思われる方に聞いて下さい。

<テーブルA>

A1A2
13
24

<テーブルB>

B1B2
12
3NULL

<上記テーブルAとテーブルBのデータを基に、結合して求めたい抽出結果(と思われるもの)>

A1A2B1B2
1312

との事なので、求めたい抽出結果(と思われるもの)を抽出するには、以下のようなSQLになります。

SQL

1SELECT A1 2 , A2 3 , B1 4 , B2 5FROM A 6 INNER JOIN B ON( 7 A.A1=B.B1 8 ) 9; 10 11SELECT A.A1 12 , A.A2 13 , B.B1 14 , B.B2 15FROM A 16 LEFT JOIN B ON( 17 A.A1 = B.B1 18 ) 19WHERE A.A1 = 1 20; 21 22SELECT A.A1 23 , A.A2 24 , B.B1 25 , B.B2 26FROM A 27 , B 28WHERE A.A1 = B.B1 29; 30 31SELECT A.A1 32 , A.A2 33 , B.B1 34 , B.B2 35FROM A 36 , B 37WHERE A.A1 = 1 38 AND B.B1 = 1 39; 40 41SELECT TA1.A1 42 , TA1.A2 43 , TA1.A1 as B1 44 , ( 45 SELECT TB2.B2 46 FROM B TB2 47 WHERE TB2.B1 = TA1.A1 48 ) as B2 49FROM A TA1 50WHERE EXISTS( 51 SELECT 'X' 52 FROM B TB1 53 WHERE TB1.B1 = TA1.A1 54 ) 55; 56 57SELECT TA1.A1 58 , TA1.A2 59 , TA1.A1 as B1 60 , ( 61 SELECT TB2.B2 62 FROM B TB2 63 WHERE TB2.B1 = TA1.A1 64 ) as B2 65FROM A TA1 66WHERE TA1.A1 IN ( 67 SELECT TB1.B1 68 FROM B TB1 69 ) 70; 71 72SELECT TA2.A1 73 , TA2.A2 74 , TB2.B1 75 , TB2.B2 76FROM ( 77 SELECT TA1.A1 78 , TA1.A2 79 FROM A TA1 80 WHERE TA1.A1 = 1 81 LIMIT 1 82 ) AS TA2 83 , ( 84 SELECT TB1.B1 85 , TB1.B2 86 FROM B TB1 87 WHERE TB1.B1 = 1 88 LIMIT 1 89 ) AS TB2 90; 91 92SELECT A.A1 93 , A.A2 94 , TB1.B1 95 , TB1.B2 96FROM A 97 , ( 98 SELECT B.B1 99 , B.B2 100 FROM B 101 WHERE B.B1 = 1 102 LIMIT 1 103 ) TB1 104WHERE A.A1 = 1 105; 106 107SELECT TA1.A1 108 , TA1.A2 109 , B.B1 110 , B.B2 111FROM B 112 , ( 113 SELECT A.A1 114 , A.A2 115 FROM A 116 WHERE A.A1 = 1 117 LIMIT 1 118 ) TA1 119WHERE B.B1 = 1 120; 121

動作確認していませんが、上記のSQLは全て「答え」の抽出結果になると思います。

テーブルAとテーブルBにそれぞれ2行ずつしかないのであれば、
無駄なSQL等もありますが、上記全てのSQLの動きを理解出来れば、
A2とB2が???という疑問はなくなると思います。

投稿2018/05/02 13:43

tomari_perform

総合スコア760

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

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

0

例に出ているクエリの条件では
テーブルAのA1が決まったら、テーブルBのB1もB2も決まるということですよね?
テーブルをあえて分けている理由は、この例ではわかりませんが、
「A1とB1が同じもの」をA2,B2も併せて一つの行にするということです。
難しい説明を見すぎて、わからなくなっているのではないでしょうか?

投稿2018/05/02 04:17

yamame

総合スコア81

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問