🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
SQL

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

Q&A

5回答

4477閲覧

SQLで複数のテーブルを選択した際の優先順位を知りたいです

babbleman

総合スコア107

SQL

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

0グッド

0クリップ

投稿2019/10/08 09:51

Aというテーブルがあったとします。

AにはId列のみ
1
2
3
4
というデータが入ってます。
そしてinfoテーブルにはID列とname列が
3 田中
2 高橋
のように入っているとします。
そして下記のようなSQLを実行したとします。

Select a.id,info.name from a,info where a.id=info.id;
これを実行すると
3 田中
2 高橋

が返されるのですが、

1 null
2 高橋
3 田中
4 null
のようなデータが欲しい場合はどうしたらいいのでしょうか?join句を使えばいいのはわかりますが、where句で上記のSQLをどのように並び替えても同じ結果しか表示されませんでした。
where句を使った際のテーブルの結合の優先順位、ロジックなどを交えて教えて欲しいです。

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

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

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

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

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

guest

回答5

0

考え方

  • 元データ

SQL

1create table A(id int primary key); 2insert into A values(1),(2),(3),(4); 3create table info(id int primary key,name varchar(10)); 4insert into info values(3,'田中'),(2,'高橋');

left join

ご理解いただいていると思いますが普通にやるならleft join

SQL

1select *from A left join info using(id);

joinしない

別にjoinしないでもこうすれば得られます

SQL

1select A.id,(select name from info where A.id=info.id) as name from A

whereで結合

ではwhere句に列記したらなぜとれないのか?

SQL

1select a.id as a_id,info.id as info_id,info.name from a,info;

aとinfoのデータを単純に結合するとこうなってしまうので
nullは発生しません。

a_idinfo_idname
12高橋
13田中
22高橋
23田中
32高橋
33田中
42高橋
43田中

これを応用して

SQL

1select a.id,case when a.id=info.id then name else null end as name from a,info

とすれば、以下のようになります

idname
1NULL
1NULL
2高橋
2NULL
3NULL
3田中
4NULL
4NULL

これも希望する解とは違います
あえてやるならこう

SQL

1select a.id,group_concat(case when a.id=info.id then name else null end )as name from a,info 2group by id

しかし、こんなことをするくらいなら普通はleft joinで十分です

投稿2019/10/09 00:42

yambejp

総合スコア116694

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

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

0

OUTER JOINを使用してください。

sql

1SELECT a.id,info.name 2FROM a 3LEFT OUTER JOIN info 4ON a.id=info.id

投稿2019/10/08 09:57

ryo_y

総合スコア244

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

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

babbleman

2019/10/08 09:58

Where句のみを使って実行する事は出来ないのでしょうか? なぜ自分が示した一通りの答えが出ないのかの理由が知りたいです。
ryo_y

2019/10/08 10:20

from句で複数のテーブルを指定した場合、全ての行の組み合わせからデータを取得します。 例) Aテーブルの1行目+infoテーブルの1行目 Aテーブルの1行目+infoテーブルの2行目 Aテーブルの2行目+infoテーブルの1行目 Aテーブルの2行目+infoテーブルの2行目 ... この時、info.idの値が1,4の行が存在しないため、a.idが1,4の行に対してa.id=info.idの条件を満たす行は存在しないので、取得できるデータはa.idが2,3の分のみとなります。
babbleman

2019/10/08 10:46

回答どうもありがとうございます。 今の例ではAの値に対して対応するinfoを組み合わせるという事でしたがその逆でinfoにAを組み合わせる事は出来ないのでしょうか? そうすると出力結果は 3 高橋 2 田中 になるはずなのですが
ryo_y

2019/10/08 16:53

なぜその出力結果になると思ったのかはわかりませんが、複数指定の場合は全ての組み合わせを総当りで結合するので、どちらのテーブルが優先といったことはありません。
guest

0

join句を使えばいいのはわかりますが、where句で上記のSQLをどのように並び替えても同じ結果しか表示されませんでした。

outer joinを使用する事は分っているのですね。
並びは、結合の際のアルゴリズムによって左右される部分がありますが、保証はされないのが普通です。
求めたい結果はID順なので、order byでIDを指定して下さい。

投稿2019/10/08 12:58

編集2019/10/08 13:01
sazi

総合スコア25327

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

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

0

DBMSによって様々なので知ってる範囲で回答します。

Oracleなら外部結合演算子(+)が一応使えます。
https://docs.oracle.com/cd/E16338_01/server.112/b56299/queries006.htm#sthref2254

SQL Serverなら外部結合演算子(=, =)が互換モード90より前なら使えます。
https://docs.microsoft.com/ja-jp/sql/sql-server/install/outer-join-operators-and-are-not-supported-in-90-or-later-compatibility-modes?view=sql-server-2014

これ以外はわかりません。

投稿2019/10/08 10:27

Y.H.

総合スコア7918

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

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

0

表示順を指定したいときは ORDER BY 表示したい順のカラム を指定してください。

投稿2019/10/08 09:56

Orlofsky

総合スコア16417

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

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

babbleman

2019/10/08 09:57

すみません、知りたいのは表示順序ではなくwhere句を使った際のテーブルの結合のアルゴリズムです。
Orlofsky

2019/10/08 10:00

実行計画を確認してください。実行計画の取得方法はデータベースによって違います。 > データベース名 実行計画の取得方法 でググってください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問