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

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

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

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

Q&A

解決済

5回答

16278閲覧

サブクエリと外部(内部)結合の違い

naonao11

総合スコア97

SQL

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

0グッド

0クリップ

投稿2019/04/18 03:19

今、サブクエリを勉強しているのですが
サブクエリの話を聞くにつれて、「これ外部または内部結合で代用できるしそっちの方が見通しいいような。。。」
と思って、、、

ここで聞きたいのが、サブクエリを用いた時のうまみ、そしてサブクエリにしかできないこととはなんなのでしょうか。

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

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

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

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

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

m.ts10806

2019/04/18 03:24

なにかご自身で検証してみたことはありますか?
guest

回答5

0

副問合せ(サブクエリー)には相関副問合せも含まれます。

相関でない副問合せを結合(join)に置き換え、同じ結果になるのは、直積(cross join)のみです。
相関副問合せを結合に置き換え、同じ結果とするには必然的に外部結合(outer join)になります。

基本的には結合で考えて、状況次第でサブクエリーとする方が良いと思いますよ。

結合にするか相関問い合わせにするかの選択は、コストとの見合いです。
DBMSとデータの状況によるものですから、必要に応じて検討すべきものだと思います。

投稿2019/04/18 05:14

sazi

総合スコア25173

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

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

0

私も勉強(1年ちょっとですが)したての頃はサブクエリを使う利点は何だろうと思ってました…。

1. JOIN テーブルA ON 結合条件 = 結合条件 2. JOIN (SELECT id,name FROM テーブルA) as テーブルA ON 結合条件 = 結合条件

上記2種類の結合方法がありますが、サブクエリを用いた場合だと参照してくるテーブルのカラム名を絞れます。
1.の場合だとテーブル内の全カラムを参照してきます。
カラムが数個ならそこまで問題ありませんが、業務ではカラムが数百個あるテーブルもあるためパフォーマンスに影響したりします。

個人的にサブクエリを用いるならWITH句がオススメです。
WITH句はSQL内で仮テーブルを作れるイメージです。
調べると色々と出てくるので参考にしてみてください。

投稿2019/04/18 05:23

Toshi_1995

総合スコア40

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

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

0

SQL入門でサブクエリってけっこうつまずく人が多いです。きちんと勉強してください。参考

通常のJOINを使った時と比べて、サブクエリはパフォーマンスが悪いことが多いです。サブクエリを多用しなければいけないシステムはテーブル設計に問題がある場合が多いです。

投稿2019/04/18 04:27

Orlofsky

総合スコア16415

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

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

0

ベストアンサー

あるテーブルに集計関数をかけた結果を使って、別のテーブルに対してWHEREを行いたい場合、「WHEREの条件内でサブクエリを書く」あるいは「集計関数をかけた結果をサブクエリとしてJOINを行う」の2択となります。

結合では実行できない一般的な形式のサブクエリー比較の例を次に示します。これは、column1 値がテーブル t2 内の最大値に等しいテーブル t1 内のすべての行を検索します。(MySQL 5.6リファレンスより)

sql

1SELECT * FROM t1 2 WHERE column1 = (SELECT MAX(column2) FROM t2);

投稿2019/04/18 04:07

maisumakun

総合スコア145183

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

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

maisumakun

2019/04/18 04:14

MAXであれば、いちおう「CROSS JOINして必要なものだけ取り出す」方法でも(非効率という問題を無視すれば)実行はできるかもしれませんが、AVERAGEとなればもっと困難です。
guest

0

勉強中とのことなのでMySQLマニュアルを参考に
サブクエリの種類と置き換えが可能かどうかをよく勉強してみてください

投稿2019/04/18 03:44

yambejp

総合スコア114779

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問